aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <dbphillipsnz@gmail.com>2016-07-19 12:02:42 +1200
committerDavid Phillips <dbphillipsnz@gmail.com>2016-07-19 12:02:42 +1200
commit8a1964d5d52c3acf1127d4e8051e8282634749e4 (patch)
tree8d989ef8c63cdf76219d087f7c8e1f42fabf5ff3
parenta9c3230abf66bb09cde9c7b95c9c9c0832aff850 (diff)
downloadbrightnessd-8a1964d5d52c3acf1127d4e8051e8282634749e4.tar.xz
Major restructuring and tidying
-rw-r--r--brightnessd.c117
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);