X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dev_d.c;h=eaf9b1dc12c7ecef5364a373041f380f5d964d89;hb=da767d0739c86a04a0c0326cebff6c08ffe1228c;hp=97c552647b27fdda1756880f8b1ed7f2a0be3852;hpb=a3e6c80049137722cf75d65de8d1e6d5a35bc252;p=elogind.git diff --git a/dev_d.c b/dev_d.c index 97c552647..eaf9b1dc1 100644 --- a/dev_d.c +++ b/dev_d.c @@ -23,9 +23,13 @@ #include #include #include +#include #include +#include + #include "udev.h" #include "udev_lib.h" +#include "udevdb.h" #include "logging.h" #define DEVD_DIR "/etc/dev.d/" @@ -34,6 +38,8 @@ static int run_program(char *name) { pid_t pid; + int fd; + char *argv[3]; dbg("running %s", name); @@ -41,7 +47,20 @@ static int run_program(char *name) switch (pid) { case 0: /* child */ - execv(name, main_argv); + udevdb_exit(); /* close udevdb */ + fd = open("/dev/null", O_RDWR); + if ( fd >= 0) { + dup2(fd, STDOUT_FILENO); + dup2(fd, STDIN_FILENO); + dup2(fd, STDERR_FILENO); + } + close(fd); + + argv[0] = name; + argv[1] = main_argv[1]; + argv[2] = NULL; + + execv(name, argv); dbg("exec of child failed"); exit(1); case -1: @@ -61,7 +80,7 @@ static int run_program(char *name) * subsystem/ * default/ */ -void dev_d_send(struct udevice *dev, char *subsystem, char *devpath) +void dev_d_send(struct udevice *dev, const char *subsystem, const char *devpath) { char dirname[256]; char env_devname[NAME_SIZE]; @@ -71,6 +90,7 @@ void dev_d_send(struct udevice *dev, char *subsystem, char *devpath) if (udev_dev_d == 0) return; + memset(env_devname, 0x00, sizeof(env_devname)); if (dev->type == 'b' || dev->type == 'c') { strfieldcpy(env_devname, udev_root); strfieldcat(env_devname, dev->name);