X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fcollect%2Fcollect.c;h=cb5df01c6a66c9269d16bda02e15f390b927d17d;hb=53461b74df0576ec091275d1a5dbee00611df1ee;hp=076fe479e22720758879b2c16628aa9558c31e9c;hpb=3e2147858f21943d5f4a781c60f33ac22c6096ed;p=elogind.git diff --git a/src/udev/collect/collect.c b/src/udev/collect/collect.c index 076fe479e..cb5df01c6 100644 --- a/src/udev/collect/collect.c +++ b/src/udev/collect/collect.c @@ -33,9 +33,10 @@ #include "libudev.h" #include "libudev-private.h" +#include "macro.h" -#define BUFSIZE 16 -#define UDEV_ALARM_TIMEOUT 180 +#define BUFSIZE 16 +#define UDEV_ALARM_TIMEOUT 180 enum collect_state { STATE_NONE, @@ -55,16 +56,12 @@ static int debug; /* This can increase dynamically */ static size_t bufsize = BUFSIZE; -static struct _mate *node_to_mate(struct udev_list_node *node) +static inline struct _mate *node_to_mate(struct udev_list_node *node) { - char *mate; - - mate = (char *)node; - mate -= offsetof(struct _mate, node); - return (struct _mate *)mate; + return container_of(node, struct _mate, node); } -static void sig_alrm(int signo) +noreturn static void sig_alrm(int signo) { exit(4); } @@ -96,11 +93,11 @@ static int prepare(char *dir, char *filename) if (stat(dir, &statbuf) < 0) mkdir(dir, 0700); - sprintf(buf, "%s/%s", dir, filename); + snprintf(buf, sizeof(buf), "%s/%s", dir, filename); fd = open(buf,O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); if (fd < 0) - fprintf(stderr, "Cannot open %s: %s\n", buf, strerror(errno)); + fprintf(stderr, "Cannot open %s: %m\n", buf); if (lockf(fd,F_TLOCK,0) < 0) { if (debug) @@ -112,7 +109,7 @@ static int prepare(char *dir, char *filename) fprintf(stderr, "Acquired lock on %s\n", buf); } else { if (debug) - fprintf(stderr, "Could not get lock on %s: %s\n", buf, strerror(errno)); + fprintf(stderr, "Could not get lock on %s: %m\n", buf); } } @@ -142,12 +139,12 @@ static int checkout(int fd) restart: len = bufsize >> 1; - buf = calloc(1,bufsize + 1); - if (!buf) { - fprintf(stderr, "Out of memory\n"); - return -1; - } + buf = malloc(bufsize + 1); + if (!buf) + return log_oom(); memset(buf, ' ', bufsize); + buf[bufsize] = '\0'; + ptr = buf + len; while ((read(fd, buf + len, len)) > 0) { while (ptr && *ptr) { @@ -170,7 +167,16 @@ static int checkout(int fd) if (debug) fprintf(stderr, "Found word %s\n", word); him = malloc(sizeof (struct _mate)); + if (!him) { + free(buf); + return log_oom(); + } him->name = strdup(word); + if (!him->name) { + free(buf); + free(him); + return log_oom(); + } him->state = STATE_OLD; udev_list_node_append(&him->node, &bunch); word = NULL; @@ -207,7 +213,7 @@ static void invite(char *us) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, us)) { + if (streq(him->name, us)) { him->state = STATE_CONFIRMED; who = him; } @@ -235,7 +241,7 @@ static void reject(char *us) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, us)) { + if (streq(him->name, us)) { him->state = STATE_NONE; who = him; } @@ -279,7 +285,7 @@ static int missing(int fd) buf = malloc(bufsize); if (!buf) - return -1; + return log_oom(); udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); @@ -294,12 +300,15 @@ static int missing(int fd) tmpbuf = realloc(buf, bufsize); if (!tmpbuf) { free(buf); - return -1; + return log_oom(); } buf = tmpbuf; } snprintf(buf, strlen(him->name)+2, "%s ", him->name); - write(fd, buf, strlen(buf)); + if (write(fd, buf, strlen(buf)) < 0) { + free(buf); + return -1; + } } } @@ -395,7 +404,7 @@ int main(int argc, char **argv) us = argv[argi++]; if (signal(SIGALRM, sig_alrm) == SIG_ERR) { - fprintf(stderr, "Cannot set SIGALRM: %s\n", strerror(errno)); + fprintf(stderr, "Cannot set SIGALRM: %m\n"); ret = 2; goto exit; } @@ -405,7 +414,7 @@ int main(int argc, char **argv) if (debug) fprintf(stderr, "Using checkpoint '%s'\n", checkpoint); - util_strscpyl(tmpdir, sizeof(tmpdir), udev_get_run_path(udev), "/collect", NULL); + strscpyl(tmpdir, sizeof(tmpdir), "/run/udev/collect", NULL); fd = prepare(tmpdir, checkpoint); if (fd < 0) { ret = 3; @@ -425,7 +434,7 @@ int main(int argc, char **argv) udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); - if (!strcmp(him->name, argv[i])) + if (streq(him->name, argv[i])) who = him; } if (!who) { @@ -433,9 +442,19 @@ int main(int argc, char **argv) if (debug) fprintf(stderr, "ID %s: not in database\n", argv[i]); - him = malloc(sizeof (struct _mate)); - him->name = malloc(strlen(argv[i]) + 1); - strcpy(him->name, argv[i]); + him = new(struct _mate, 1); + if (!him) { + ret = ENOMEM; + goto out; + } + + him->name = strdup(argv[i]); + if (!him->name) { + free(him); + ret = ENOMEM; + goto out; + } + him->state = STATE_NONE; udev_list_node_append(&him->node, &bunch); } else {