X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=2c92590dcd2e46e30cf4969db672335bca164d2c;hb=fc6da921ad3bcb251aa317376e81701700e925c9;hp=8c550d38aa3b8f2154c2fc0a073ac75811d6476d;hpb=ff2eecef88733e669ff5a43083534b32b435e2b0;p=elogind.git diff --git a/udevd.c b/udevd.c index 8c550d38a..2c92590dc 100644 --- a/udevd.c +++ b/udevd.c @@ -167,35 +167,23 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st { char filename[PATH_SIZE]; char filename_failed[PATH_SIZE]; - size_t start, end, i; + size_t start; struct udevd_uevent_msg *loop_msg; int fd; /* add location of queue files */ strlcpy(filename, udev_root, sizeof(filename)); strlcat(filename, "/", sizeof(filename)); - start = strlcat(filename, EVENT_QUEUE_DIR, sizeof(filename)); - end = strlcat(filename, msg->devpath, sizeof(filename)); - if (end > sizeof(filename)) - end = sizeof(filename); - - /* replace '/' to transform path into a filename */ - for (i = start+1; i < end; i++) - if (filename[i] == '/') - filename[i] = PATH_TO_NAME_CHAR; + start = strlcat(filename, EVENT_QUEUE_DIR"/", sizeof(filename)); + strlcat(filename, msg->devpath, sizeof(filename)); + path_encode(&filename[start], sizeof(filename) - start); /* add location of failed files */ strlcpy(filename_failed, udev_root, sizeof(filename_failed)); strlcat(filename_failed, "/", sizeof(filename_failed)); - start = strlcat(filename_failed, EVENT_FAILED_DIR, sizeof(filename_failed)); - end = strlcat(filename_failed, msg->devpath, sizeof(filename_failed)); - if (end > sizeof(filename_failed)) - end = sizeof(filename_failed); - - /* replace '/' to transform path into a filename */ - for (i = start+1; i < end; i++) - if (filename_failed[i] == '/') - filename_failed[i] = PATH_TO_NAME_CHAR; + start = strlcat(filename_failed, EVENT_FAILED_DIR"/", sizeof(filename_failed)); + strlcat(filename_failed, msg->devpath, sizeof(filename_failed)); + path_encode(&filename_failed[start], sizeof(filename) - start); switch (state) { case EVENT_QUEUED: @@ -360,7 +348,7 @@ static int mem_size_mb(void) static int cpu_count(void) { int f; - char buf[32768]; + char buf[65536]; int len; const char *pos; int count = 0; @@ -943,6 +931,7 @@ int main(int argc, char *argv[], char *envp[]) { "debug-trace", 0, NULL, 't' }, { "verbose", 0, NULL, 'v' }, { "help", 0, NULL, 'h' }, + { "version", 0, NULL, 'V' }, {} }; int rc = 1; @@ -955,7 +944,7 @@ int main(int argc, char *argv[], char *envp[]) /* parse commandline options */ while (1) { - option = getopt_long(argc, argv, "dtvh", options, NULL); + option = getopt_long(argc, argv, "dtvhV", options, NULL); if (option == -1) break; @@ -972,7 +961,10 @@ int main(int argc, char *argv[], char *envp[]) udev_log_priority = LOG_INFO; break; case 'h': - printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--verbose]\n"); + printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--verbose] [--version]\n"); + goto exit; + case 'V': + printf("%s\n", UDEV_VERSION); goto exit; default: goto exit; @@ -985,6 +977,19 @@ int main(int argc, char *argv[], char *envp[]) goto exit; } + /* make sure std{in,out,err} fd's are in a sane state */ + fd = open("/dev/null", O_RDWR); + if (fd < 0) { + fprintf(stderr, "cannot open /dev/null\n"); + err("cannot open /dev/null"); + } + if (fd > STDIN_FILENO) + dup2(fd, STDIN_FILENO); + if (write(STDOUT_FILENO, 0, 0) < 0) + dup2(fd, STDOUT_FILENO); + if (write(STDERR_FILENO, 0, 0) < 0) + dup2(fd, STDERR_FILENO); + /* init sockets to receive events */ if (init_udevd_socket() < 0) { if (errno == EADDRINUSE) { @@ -1060,17 +1065,12 @@ int main(int argc, char *argv[], char *envp[]) } } - /* redirect std fd's */ - fd = open("/dev/null", O_RDWR); - if (fd >= 0) { - dup2(fd, STDIN_FILENO); - if (!verbose) - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - if (fd > STDERR_FILENO) - close(fd); - } else - err("error opening /dev/null: %s", strerror(errno)); + /* redirect std{out,err} fd's */ + if (!verbose) + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > STDERR_FILENO) + close(fd); /* set scheduling priority for the daemon */ setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);