X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=88131d63ab1c95b3342393b43247e503692dc7b5;hb=8f2f874ae8d5bfdc1eda9b1f9d77f6637f6940a5;hp=d807e4168d8b96b04ea939bdf661ff49ae3a4a22;hpb=7d855c3116ec9ddab9adde96b568681930d9855b;p=elogind.git diff --git a/udevd.c b/udevd.c index d807e4168..88131d63a 100644 --- a/udevd.c +++ b/udevd.c @@ -34,9 +34,7 @@ #include #include #include "klibc_fixups.h" -#ifndef __KLIBC__ #include -#endif #include "list.h" #include "udev.h" @@ -46,7 +44,7 @@ #include "logging.h" static int pipefds[2]; -static int expected_seqnum = 0; +static unsigned long long expected_seqnum = 0; volatile static int children_waiting; volatile static int run_msg_q; volatile static int sig_flag; @@ -75,7 +73,7 @@ void log_message (int level, const char *format, ...) #endif #define msg_dump(msg) \ - dbg("msg_dump: sequence %d, '%s', '%s', '%s'", \ + dbg("msg_dump: sequence %llu, '%s', '%s', '%s'", \ msg->seqnum, msg->action, msg->devpath, msg->subsystem); static void msg_dump_queue(void) @@ -84,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 %llu in queue", msg->seqnum); #endif } @@ -122,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 %llu", msg->seqnum); /* run msg queue manager */ run_msg_q = 1; @@ -136,12 +134,14 @@ 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); + snprintf(action, ACTION_SIZE-1, "ACTION=%s", msg->action); + action[ACTION_SIZE-1] = '\0'; + snprintf(devpath, DEVPATH_SIZE-1, "DEVPATH=%s", msg->devpath); + devpath[DEVPATH_SIZE-1] = '\0'; + sprintf(seqnum, "SEQNUM=%llu", msg->seqnum); pid = fork(); switch (pid) { @@ -160,7 +160,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 %llu [%d] working at '%s'", msg->seqnum, pid, msg->devpath); msg->pid = pid; } } @@ -188,9 +188,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 %llu to running list", loop_msg->seqnum); } else { - dbg("delay seq %d, cause seq %d already working on '%s'", + dbg("delay seq %llu, cause seq %llu already working on '%s'", loop_msg->seqnum, msg->seqnum, msg->devpath); } } @@ -201,7 +201,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 %llu to exec, next expected is %llu", msg->seqnum, expected_seqnum); } @@ -213,7 +213,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 %llu", expected_seqnum); recheck: list_for_each_entry_safe(loop_msg, tmp_msg, &msg_list, list) { /* move event with expected sequence to the exec list */ @@ -225,7 +225,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 %llu is %li seconds old", loop_msg->seqnum, msg_age); if (msg_age > EVENT_TIMEOUT_SEC-1) { msg_move_exec(loop_msg); goto recheck; @@ -295,7 +295,7 @@ static void handle_msg(int sock) } /* if no seqnum is given, we move straight to exec queue */ - if (msg->seqnum == -1) { + if (msg->seqnum == 0) { list_add(&msg->list, &exec_list); run_exec_q = 1; } else { @@ -308,9 +308,10 @@ skip: return; } -static void sig_handler(int signum) +asmlinkage static void sig_handler(int signum) { int rc; + switch (signum) { case SIGINT: case SIGTERM: @@ -327,7 +328,7 @@ static void sig_handler(int signum) goto do_write; break; default: - dbg("unhandled signal"); + dbg("unhandled signal %d", signum); return; } @@ -351,9 +352,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 %llu 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