diff options
author | David Phillips <dbphillipsnz@gmail.com> | 2016-07-19 12:02:42 +1200 |
---|---|---|
committer | David Phillips <dbphillipsnz@gmail.com> | 2016-07-19 12:02:42 +1200 |
commit | 8a1964d5d52c3acf1127d4e8051e8282634749e4 (patch) | |
tree | 8d989ef8c63cdf76219d087f7c8e1f42fabf5ff3 | |
parent | a9c3230abf66bb09cde9c7b95c9c9c0832aff850 (diff) | |
download | brightnessd-8a1964d5d52c3acf1127d4e8051e8282634749e4.tar.xz |
Major restructuring and tidying
-rw-r--r-- | brightnessd.c | 117 |
1 files changed, 79 insertions, 38 deletions
diff --git a/brightnessd.c b/brightnessd.c index ebd71a2..4afc3ac 100644 --- a/brightnessd.c +++ b/brightnessd.c @@ -14,10 +14,74 @@ #define STEP 1 #define BIG_STEP 10 #define USER "nobody" +#define BRIGHT_BUFFER_SIZE 4 +#define DELAY_INFINITE (-1) + +/** + * create and open fifo, using chmod since mkfifo is affected by umask + */ +int setup_fifo() +{ + struct stat st; + if (stat(FIFO_PATH, &st) == 0) + { + if (remove(FIFO_PATH)) + { + perror("remove("FIFO_PATH")"); + return 1; + } + } + if (mkfifo(FIFO_PATH, 0666)) + { + perror("mkfifo"); + return 1; + } + if (chmod(FIFO_PATH, 0666)) + { + perror("chmod"); + return 1; + } + return 0; +} + +int drop_priv() +{ + struct passwd *p = NULL; + + /* get group (and more) of USER */ + p = getpwnam(USER); + + if (p == NULL) + { + fprintf(stderr, "Failed to get uid and gid of user \""USER"\", bailing\n"); + return 1; + } + + if (setgid(p->pw_gid)) + { + fprintf(stderr, "Failed to set gid to %d\n", p->pw_gid); + perror("setuid"); + return 1; + } + + if (setuid(p->pw_uid)) + { + fprintf(stderr, "Failed to set uid to %d\n", p->pw_uid); + perror("setuid"); + return 1; + } + + if (!setuid(0) || !setgid(0)) + { + fprintf(stderr, "Got uid 0 or gid 0 back after dropping, bailing\n"); + return 1; + } + return 0; +} int get_now(FILE *f) { - char buffer[4096]; /* FIXME: magic constant is icky */ + char buffer[BRIGHT_BUFFER_SIZE]; /* FIXME: magic constant is icky */ /* FIXME: check return value for error */ fgets(buffer, sizeof(buffer), f); @@ -43,10 +107,9 @@ int main(int argc, char **argv) FILE *f = NULL; int fifo = 0; struct pollfd fds; - struct passwd *p; int delay = 0; int nread = 0; - char buffer[4]; /* size 4 because max bright is 255, plus null terminator */ + char buffer[BRIGHT_BUFFER_SIZE]; /* Open brightness file */ if ((f = fopen(BRIGHT_FILE, "w+")) == NULL) @@ -55,50 +118,28 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } - now = get_now(f); - target = now; - - /* create and open fifo, using chmod since mkfifo is affected by umask */ - remove(FIFO_PATH); - mkfifo(FIFO_PATH, 0666); - chmod(FIFO_PATH, 0666); - - /* FIXME : check return val */ - fifo = open(FIFO_PATH, O_RDWR); - - - fds.fd = fifo; - fds.events = POLLIN; - - p = getpwnam(USER); - - if (p == NULL) + if (setup_fifo()) { - fprintf(stderr, "Failed to get uid and gid of user \""USER"\", bailing\n"); + fclose(f); return 1; } - if (setgid(p->pw_gid)) + if (drop_priv() != 0) { - fprintf(stderr, "Failed to set gid to %d\n", p->pw_gid); - perror("setuid"); + fclose(f); return 1; } - if (setuid(p->pw_uid)) - { - fprintf(stderr, "Failed to set uid to %d\n", p->pw_uid); - perror("setuid"); - return 1; - } + now = get_now(f); + target = now; - if (!setuid(0) || !setgid(0)) - { - fprintf(stderr, "Got uid 0 or gid 0 back after dropping, bailing\n"); - return 1; - } + /* FIXME : check return val */ + fifo = open(FIFO_PATH, O_RDWR); + + fds.fd = fifo; + fds.events = POLLIN; - delay = -1; + delay = DELAY_INFINITE; while(1) { poll(&fds, 1, delay); @@ -131,7 +172,7 @@ int main(int argc, char **argv) if (now < target) now = target; } else if (now == target) { - delay = -1; + delay = DELAY_INFINITE; } fprintf(f, "%d\n", now); rewind(f); |