#include <sys/types.h>
#include <sys/stat.h>
-#include "../../list.h"
+#include "libudev.h"
+#include "libudev-private.h"
#define TMPFILE "/dev/.udev/collect"
#define BUFSIZE 16
};
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 int bufsize = BUFSIZE;
+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)
{
* Read checkpoint file
*
* Tricky reading this. We allocate a buffer twice as large
- * as we're goint to read. Then we read into the upper half
+ * as we're going to read. Then we read into the upper half
* of that buffer and start parsing.
* Once we do _not_ find end-of-work terminator (whitespace
* character) we move the upper half to the lower half,
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;
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;
}
}
*/
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;
*/
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;
}
if (debug && !who)
fprintf(stderr, "ID '%s' not in database\n", 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);
}
{
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 {
while (strlen(him->name)+1 >= bufsize) {
+ char *tmpbuf;
+
bufsize = bufsize << 1;
- buf = realloc(buf, bufsize);
+ tmpbuf = realloc(buf, bufsize);
+ if (!tmpbuf) {
+ free(buf);
+ return -1;
+ }
+ buf = tmpbuf;
}
snprintf(buf, strlen(him->name)+2, "%s ", him->name);
write(fd, buf, strlen(buf));
}
free(buf);
-
return ret;
}
*/
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";
case STATE_CONFIRMED:
state = "confirmed";
break;
- fprintf(stderr, "ID: %s=%s\n", him->name, state);
}
+ fprintf(stderr, "ID: %s=%s\n", him->name, state);
}
}
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;
goto exit;
}
- INIT_LIST_HEAD(&bunch);
+ udev_list_init(&bunch);
if (debug)
fprintf(stderr, "Using checkpoint '%s'\n", checkpoint);
}
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]);