From 8a1964d5d52c3acf1127d4e8051e8282634749e4 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Tue, 19 Jul 2016 12:02:42 +1200 Subject: Major restructuring and tidying --- brightnessd.c | 117 +++++++++++++++++++++++++++++++++++++++------------------- 1 file 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); -- cgit v1.1