From a7ff41a9f4586a8e3d39d3193e9e267e53d06558 Mon Sep 17 00:00:00 2001 From: Mitchell Riedstra Date: Thu, 29 Dec 2022 23:56:44 -0500 Subject: Add a small program to tell Linux it's time to sleep --- bin/.gitignore | 1 + bin/Makefile | 4 +++ bin/zzz.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 bin/.gitignore create mode 100644 bin/zzz.c diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..b1a17ba --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +zzz diff --git a/bin/Makefile b/bin/Makefile index 0de88b5..c7e37e6 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -1,6 +1,10 @@ default: install +install-zzz: zzz + install -D -o root -g root -m 755 zzz /sbin/ + chmod 6755 /sbin/zzz + linux: install backlight $(HOME)/bin install wpa $(HOME)/bin diff --git a/bin/zzz.c b/bin/zzz.c new file mode 100644 index 0000000..2170c78 --- /dev/null +++ b/bin/zzz.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include + +#define POWER_STATE_F "/sys/power/state" + +void +die(const char *msg) +{ + puts(msg); + exit(1); +} + +void +err(const char *msg) +{ + perror(msg); + exit(1); +} + +void +suspend() +{ + int fh = open(POWER_STATE_F, O_WRONLY); + int n; + const char *cmd = "mem"; + + if (fh == -1) + err("Opening "POWER_STATE_F); + + n = write(fh, cmd, 3); + if (n == -1) + err("Writing to "POWER_STATE_F); + + exit(0); +} + +int +main(int argc, char **argv) +{ + uid_t uid = getuid(); + gid_t gid = getgid(); + uid_t euid = geteuid(); + char **a = argv+1; + char *lockProg = "slock"; + pid_t pid; + int ret; + + if (euid != 0) + die("Program must be run as root/setuid"); + + for (;*a;a++) { + if (strcmp("-l", *a) == 0) { + a++; + if (*a) + lockProg = *a; + else + die("-l must have an argument"); + } else { + printf("Unknown argument: '%s'\n", *a); + exit(1); + } + } + + + pid = fork(); + switch (pid) { + case -1: + err("fork"); + case 0: + ret = setuid(uid); + if (ret == -1) + err("setuid"); + ret = setgid(gid); + if (ret == -1) + err("setgid"); + + ret = execlp(lockProg, lockProg); + err("execlp"); + default: + suspend(); + } + +} -- cgit v1.2.3