From 3169e8d1ee24c7d23d7e535eb22fced869104ff8 Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Sun, 5 Sep 2004 18:05:29 +0200 Subject: [PATCH] [PATCH] pass SEQNUM trough udevd here we change udevd to pass the SEQNUM from the hotplug environment to udev and the dev.d/ scripts. We need this for HAL to match the hotplug event with the dev.d/ events. It also changes the type from int to long to match the kernel. --- udev.h | 7 ++++--- udev_lib.h | 6 ++++++ udevd.c | 27 +++++++++++++++------------ udevd.h | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/udev.h b/udev.h index 310154f5..717c1218 100644 --- a/udev.h +++ b/udev.h @@ -33,9 +33,10 @@ #define GROUP_SIZE 30 #define MODE_SIZE 8 -#define ACTION_SIZE 30 -#define DEVPATH_SIZE 255 -#define SUBSYSTEM_SIZE 30 +#define ACTION_SIZE 32 +#define DEVPATH_SIZE 256 +#define SUBSYSTEM_SIZE 32 +#define SEQNUM_SIZE 32 /* length of public data */ #define UDEVICE_LEN (offsetof(struct udevice, bus_id)) diff --git a/udev_lib.h b/udev_lib.h index 18ce25cc..53ad92d5 100644 --- a/udev_lib.h +++ b/udev_lib.h @@ -59,6 +59,12 @@ do { \ snprintf((to) + strlen(to), maxsize - strlen(to)-1, "%u", i); \ } while (0) +#define strlongcat(to, i) \ +do { \ + to[sizeof(to)-1] = '\0'; \ + snprintf((to) + strlen(to), sizeof(to) - strlen(to)-1, "%li", i); \ +} while (0) + #define foreach_strpart(str, separator, pos, len) \ for(pos = str, len = 0; \ (pos) < ((str) + strlen(str)); \ diff --git a/udevd.c b/udevd.c index 79de1124..50720c24 100644 --- a/udevd.c +++ b/udevd.c @@ -44,7 +44,7 @@ #include "logging.h" static int pipefds[2]; -static int expected_seqnum = 0; +static long expected_seqnum = 0; volatile static int children_waiting; volatile static int run_msg_q; volatile static int sig_flag; @@ -82,7 +82,7 @@ static void msg_dump_queue(void) struct hotplug_msg *msg; list_for_each_entry(msg, &msg_list, list) - dbg("sequence %d in queue", msg->seqnum); + dbg("sequence %li in queue", msg->seqnum); #endif } @@ -120,7 +120,7 @@ static void msg_queue_insert(struct hotplug_msg *msg) msg->queue_time = info.uptime; list_add(&msg->list, &loop_msg->list); - dbg("queued message seq %d", msg->seqnum); + dbg("queued message seq %li", msg->seqnum); /* run msg queue manager */ run_msg_q = 1; @@ -134,12 +134,15 @@ static void udev_run(struct hotplug_msg *msg) pid_t pid; char action[ACTION_SIZE]; char devpath[DEVPATH_SIZE]; - char *env[] = { action, devpath, NULL }; + char seqnum[SEQNUM_SIZE]; + char *env[] = { action, devpath, seqnum, NULL }; strcpy(action, "ACTION="); strfieldcat(action, msg->action); strcpy(devpath, "DEVPATH="); strfieldcat(devpath, msg->devpath); + strcpy(seqnum, "SEQNUM="); + strlongcat(seqnum, msg->seqnum); pid = fork(); switch (pid) { @@ -158,7 +161,7 @@ static void udev_run(struct hotplug_msg *msg) break; default: /* get SIGCHLD in main loop */ - dbg("==> exec seq %d [%d] working at '%s'", msg->seqnum, pid, msg->devpath); + dbg("==> exec seq %li [%d] working at '%s'", msg->seqnum, pid, msg->devpath); msg->pid = pid; } } @@ -186,9 +189,9 @@ static void exec_queue_manager() /* move event to run list */ list_move_tail(&loop_msg->list, &running_list); udev_run(loop_msg); - dbg("moved seq %d to running list", loop_msg->seqnum); + dbg("moved seq %li to running list", loop_msg->seqnum); } else { - dbg("delay seq %d, cause seq %d already working on '%s'", + dbg("delay seq %li, cause seq %li already working on '%s'", loop_msg->seqnum, msg->seqnum, msg->devpath); } } @@ -199,7 +202,7 @@ static void msg_move_exec(struct hotplug_msg *msg) list_move_tail(&msg->list, &exec_list); run_exec_q = 1; expected_seqnum = msg->seqnum+1; - dbg("moved seq %d to exec, next expected is %d", + dbg("moved seq %li to exec, next expected is %li", msg->seqnum, expected_seqnum); } @@ -211,7 +214,7 @@ static void msg_queue_manager() struct sysinfo info; long msg_age = 0; - dbg("msg queue manager, next expected is %d", expected_seqnum); + dbg("msg queue manager, next expected is %li", expected_seqnum); recheck: list_for_each_entry_safe(loop_msg, tmp_msg, &msg_list, list) { /* move event with expected sequence to the exec list */ @@ -223,7 +226,7 @@ recheck: /* move event with expired timeout to the exec list */ sysinfo(&info); msg_age = info.uptime - loop_msg->queue_time; - dbg("seq %d is %li seconds old", loop_msg->seqnum, msg_age); + dbg("seq %li is %li seconds old", loop_msg->seqnum, msg_age); if (msg_age > EVENT_TIMEOUT_SEC-1) { msg_move_exec(loop_msg); goto recheck; @@ -350,9 +353,9 @@ static void udev_done(int pid) list_for_each_entry(msg, &running_list, list) { if (msg->pid == pid) { - dbg("<== exec seq %d came back", msg->seqnum); + dbg("<== exec seq %li came back", msg->seqnum); run_queue_delete(msg); - + /* we want to run the exec queue manager since there may * be events waiting with the devpath of the one that * just finished diff --git a/udevd.h b/udevd.h index 5fdd62d3..cced75d5 100644 --- a/udevd.h +++ b/udevd.h @@ -33,7 +33,7 @@ struct hotplug_msg { char magic[20]; struct list_head list; pid_t pid; - int seqnum; + long seqnum; long queue_time; char action[ACTION_SIZE]; char devpath[DEVPATH_SIZE]; -- 2.39.5