X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fcollect%2Fcollect.c;h=90df360eb2b5ec110f1fc5e420250eb389072ca2;hb=79008bddf679a5e0900369950eb346c9fa687107;hp=6580a091e0a95890f0975b0131030a135e2d08cb;hpb=7d566799022b24fef2bb8ca6d671bf8ad14d9e26;p=elogind.git diff --git a/src/udev/collect/collect.c b/src/udev/collect/collect.c index 6580a091e..90df360eb 100644 --- a/src/udev/collect/collect.c +++ b/src/udev/collect/collect.c @@ -35,8 +35,8 @@ #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, @@ -61,7 +61,7 @@ static inline struct _mate *node_to_mate(struct udev_list_node *node) return container_of(node, struct _mate, node); } -_noreturn_ static void sig_alrm(int signo) +noreturn static void sig_alrm(int signo) { exit(4); } @@ -86,18 +86,18 @@ static void usage(void) */ static int prepare(char *dir, char *filename) { - struct stat statbuf; char buf[512]; - int fd; + int r, fd; - if (stat(dir, &statbuf) < 0) - mkdir(dir, 0700); + r = mkdir(dir, 0700); + if (r < 0 && errno != EEXIST) + return -errno; snprintf(buf, sizeof(buf), "%s/%s", dir, filename); - fd = open(buf,O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); + fd = open(buf,O_RDWR|O_CREAT|O_CLOEXEC, 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) @@ -109,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); } } @@ -140,10 +140,8 @@ static int checkout(int fd) restart: len = bufsize >> 1; buf = malloc(bufsize + 1); - if (!buf) { - fprintf(stderr, "Out of memory.\n"); + if (!buf) return log_oom(); - } memset(buf, ' ', bufsize); buf[bufsize] = '\0'; @@ -256,7 +254,7 @@ static void reject(char *us) * kickout * * Remove all IDs in the internal list which are not part - * of the list passed via the commandline. + * of the list passed via the command line. */ static void kickout(void) { @@ -406,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; } @@ -444,19 +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 = new(struct _mate, 1); if (!him) { ret = ENOMEM; goto out; } - him->name = malloc(strlen(argv[i]) + 1); + him->name = strdup(argv[i]); if (!him->name) { + free(him); ret = ENOMEM; goto out; } - strcpy(him->name, argv[i]); him->state = STATE_NONE; udev_list_node_append(&him->node, &bunch); } else {