X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fcollect%2Fcollect.c;h=3284c3df40209a11cbe052fb188757f2f69d5391;hp=9fb6737d9b4d6af94877d5b2efdb39c96ad7053e;hb=9060b066d9e7aaca9795010ac5fff61018947f87;hpb=322fc7a636296ba9a3f93912661f14c65c2af4b2 diff --git a/extras/collect/collect.c b/extras/collect/collect.c index 9fb6737d9..3284c3df4 100644 --- a/extras/collect/collect.c +++ b/extras/collect/collect.c @@ -31,9 +31,10 @@ #include #include -#include "../../list.h" +#include "libudev.h" +#include "libudev-private.h" -#define TMPFILE "/dev/.udev/collect" +#define TMPFILE UDEV_PREFIX "/dev/.udev/collect" #define BUFSIZE 16 #define UDEV_ALARM_TIMEOUT 180 @@ -44,17 +45,26 @@ enum collect_state { }; struct _mate { - struct list_head node; + struct udev_list_node node; char *name; enum collect_state state; }; -static LIST_HEAD(bunch); +static struct udev_list_node bunch; static int debug; /* This can increase dynamically */ static size_t bufsize = BUFSIZE; +static struct _mate *node_to_mate(struct udev_list_node *node) +{ + char *mate; + + mate = (char *)node; + mate -= offsetof(struct _mate, node); + return (struct _mate *)mate; +} + static void sig_alrm(int signo) { exit(4); @@ -147,7 +157,7 @@ static int checkout(int fd) if (!ptr && word < (buf + len)) { bufsize = bufsize << 1; if (debug) - fprintf(stderr, "ID overflow, restarting with size %d\n", bufsize); + fprintf(stderr, "ID overflow, restarting with size %zi\n", bufsize); free(buf); lseek(fd, 0, SEEK_SET); goto restart; @@ -161,10 +171,9 @@ static int checkout(int fd) if (debug) fprintf(stderr, "Found word %s\n", word); him = malloc(sizeof (struct _mate)); - him->name = malloc(strlen(word) + 1); - strcpy(him->name, word); + him->name = strdup(word); him->state = STATE_OLD; - list_add_tail(&him->node, &bunch); + udev_list_node_append(&him->node, &bunch); word = NULL; } } @@ -190,13 +199,15 @@ static int checkout(int fd) */ static void invite(char *us) { - struct _mate *him, *who; + struct udev_list_node *him_node; + struct _mate *who = NULL; if (debug) fprintf(stderr, "Adding ID '%s'\n", us); - who = NULL; - list_for_each_entry(him, &bunch, node) { + udev_list_node_foreach(him_node, &bunch) { + struct _mate *him = node_to_mate(him_node); + if (!strcmp(him->name, us)) { him->state = STATE_CONFIRMED; who = him; @@ -216,13 +227,15 @@ static void invite(char *us) */ static void reject(char *us) { - struct _mate *him, *who; + struct udev_list_node *him_node; + struct _mate *who = NULL; if (debug) fprintf(stderr, "Removing ID '%s'\n", us); - who = NULL; - list_for_each_entry(him, &bunch, node) { + udev_list_node_foreach(him_node, &bunch) { + struct _mate *him = node_to_mate(him_node); + if (!strcmp(him->name, us)) { him->state = STATE_NONE; who = him; @@ -230,7 +243,6 @@ static void reject(char *us) } if (debug && !who) fprintf(stderr, "ID '%s' not in database\n", us); - } /* @@ -241,11 +253,14 @@ static void reject(char *us) */ static void kickout(void) { - struct _mate *him, *them; + struct udev_list_node *him_node; + struct udev_list_node *tmp; + + udev_list_node_foreach_safe(him_node, tmp, &bunch) { + struct _mate *him = node_to_mate(him_node); - list_for_each_entry_safe(him, them, &bunch, node) { if (him->state == STATE_OLD) { - list_del(&him->node); + udev_list_node_remove(&him->node); free(him->name); free(him); } @@ -261,13 +276,15 @@ static int missing(int fd) { char *buf; int ret = 0; - struct _mate *him; + struct udev_list_node *him_node; buf = malloc(bufsize); if (!buf) return -1; - list_for_each_entry(him, &bunch, node) { + udev_list_node_foreach(him_node, &bunch) { + struct _mate *him = node_to_mate(him_node); + if (him->state == STATE_NONE) { ret++; } else { @@ -288,7 +305,6 @@ static int missing(int fd) } free(buf); - return ret; } @@ -299,10 +315,12 @@ static int missing(int fd) */ static void everybody(void) { - struct _mate *him; + struct udev_list_node *him_node; const char *state = ""; - list_for_each_entry(him, &bunch, node) { + udev_list_node_foreach(him_node, &bunch) { + struct _mate *him = node_to_mate(him_node); + switch (him->state) { case STATE_NONE: state = "none"; @@ -321,15 +339,14 @@ static void everybody(void) int main(int argc, char **argv) { static const struct option options[] = { - { "add", 0, NULL, 'a' }, - { "remove", 0, NULL, 'r' }, - { "debug", 0, NULL, 'd' }, - { "help", 0, NULL, 'h' }, + { "add", no_argument, NULL, 'a' }, + { "remove", no_argument, NULL, 'r' }, + { "debug", no_argument, NULL, 'd' }, + { "help", no_argument, NULL, 'h' }, {} }; int argi; char *checkpoint, *us; - struct _mate *him, *who; int fd; int i; int ret = 0; @@ -376,7 +393,7 @@ int main(int argc, char **argv) goto exit; } - INIT_LIST_HEAD(&bunch); + udev_list_init(&bunch); if (debug) fprintf(stderr, "Using checkpoint '%s'\n", checkpoint); @@ -393,19 +410,26 @@ int main(int argc, char **argv) } for (i = argi; i < argc; i++) { + struct udev_list_node *him_node; + struct _mate *who; + who = NULL; - list_for_each_entry(him, &bunch, node) { + udev_list_node_foreach(him_node, &bunch) { + struct _mate *him = node_to_mate(him_node); + if (!strcmp(him->name, argv[i])) who = him; } if (!who) { + struct _mate *him; + 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->state = STATE_NONE; - list_add_tail(&him->node, &bunch); + udev_list_node_append(&him->node, &bunch); } else { if (debug) fprintf(stderr, "ID %s: found in database\n", argv[i]);