X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=06b172bc253b98db2b97c9b02f141d734d7ac4ea;hb=9af5bb2f8fdbf54c064ddbd319d61092f28a4132;hp=43f3f0324b79cdf309c1be3939042a0dbce4c78d;hpb=13f24d596c5638443ffc7bc48c10a66758335c74;p=elogind.git diff --git a/udevd.c b/udevd.c index 43f3f0324..06b172bc2 100644 --- a/udevd.c +++ b/udevd.c @@ -38,8 +38,8 @@ #include "list.h" #include "udev.h" -#include "udev_lib.h" #include "udev_version.h" +#include "udev_utils.h" #include "udevd.h" #include "logging.h" @@ -131,6 +131,7 @@ static void udev_run(struct hotplug_msg *msg) case 0: /* child */ close(udevsendsock); + logging_close(); execle(udev_bin, "udev", msg->subsystem, NULL, msg->envp); dbg("exec of child failed"); _exit(1); @@ -153,9 +154,14 @@ static void udev_run(struct hotplug_msg *msg) static struct hotplug_msg *running_with_devpath(struct hotplug_msg *msg) { struct hotplug_msg *loop_msg; - list_for_each_entry(loop_msg, &running_list, list) - if (strncmp(loop_msg->devpath, msg->devpath, sizeof(loop_msg->devpath)) == 0) + list_for_each_entry(loop_msg, &running_list, list) { + if (loop_msg->devpath == NULL || msg->devpath == NULL) + continue; + + if (strcmp(loop_msg->devpath, msg->devpath) == 0) return loop_msg; + } + return NULL; } @@ -285,7 +291,7 @@ static void handle_udevsend_msg(int sock) /* copy environment buffer and reconstruct envp */ memcpy(msg->envbuf, usend_msg.envbuf, envbuf_size); bufpos = 0; - for (i = 0; (bufpos < envbuf_size) && (i < HOTPLUG_NUM_ENVP-1); i++) { + for (i = 0; (bufpos < envbuf_size) && (i < HOTPLUG_NUM_ENVP-2); i++) { int keylen; char *key; @@ -308,6 +314,7 @@ static void handle_udevsend_msg(int sock) if (strncmp(key, "SEQNUM=", 7) == 0) msg->seqnum = strtoull(&key[7], NULL, 10); } + msg->envp[i++] = "MANAGED_EVENT=1"; msg->envp[i] = NULL; /* if no seqnum is given, we move straight to exec queue */ @@ -414,7 +421,7 @@ int main(int argc, char *argv[], char *envp[]) if (getuid() != 0) { dbg("need to be root, exit"); - _exit(1); + goto exit; } /* make sure we don't lock any path */ @@ -425,7 +432,7 @@ int main(int argc, char *argv[], char *envp[]) fd = open( "/dev/null", O_RDWR ); if ( fd < 0 ) { dbg("error opening /dev/null %s", strerror(errno)); - exit(1); + goto exit; } dup2(fd, 0); dup2(fd, 1); @@ -440,29 +447,29 @@ int main(int argc, char *argv[], char *envp[]) retval = pipe(pipefds); if (retval < 0) { dbg("error getting pipes: %s", strerror(errno)); - exit(1); + goto exit; } retval = fcntl(pipefds[0], F_SETFL, O_NONBLOCK); if (retval < 0) { dbg("error fcntl on read pipe: %s", strerror(errno)); - exit(1); + goto exit; } retval = fcntl(pipefds[0], F_SETFD, FD_CLOEXEC); if (retval < 0) { dbg("error fcntl on read pipe: %s", strerror(errno)); - exit(1); + goto exit; } retval = fcntl(pipefds[1], F_SETFL, O_NONBLOCK); if (retval < 0) { dbg("error fcntl on write pipe: %s", strerror(errno)); - exit(1); + goto exit; } retval = fcntl(pipefds[1], F_SETFD, FD_CLOEXEC); if (retval < 0) { dbg("error fcntl on write pipe: %s", strerror(errno)); - exit(1); + goto exit; } /* set signal handlers */ @@ -483,13 +490,14 @@ int main(int argc, char *argv[], char *envp[]) udevsendsock = socket(AF_LOCAL, SOCK_DGRAM, 0); if (udevsendsock == -1) { dbg("error getting socket, exit"); - exit(1); + goto exit; } /* the bind takes care of ensuring only one copy running */ retval = bind(udevsendsock, (struct sockaddr *) &saddr, addrlen); if (retval < 0) { dbg("bind failed, exit"); + close(udevsendsock); goto exit; } @@ -544,8 +552,8 @@ int main(int argc, char *argv[], char *envp[]) exec_queue_manager(); } } + exit: - close(udevsendsock); logging_close(); return 1; }