aboutsummaryrefslogtreecommitdiffstats
path: root/udev.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2005-08-18 13:07:15 +0200
committerKay Sievers <kay.sievers@suse.de>2005-08-18 13:07:15 +0200
commit3f9f8de4de49135476644297585bd910b14d0ea7 (patch)
tree88485093f4fc9df67e444a113f3dc728f4470db7 /udev.c
parente331c54dc58a8228018e1a29e84eff76cd9f8fe1 (diff)
downloadudev-3f9f8de4de49135476644297585bd910b14d0ea7.tar.gz
bring std(in|out|err) fd's in a sane state
If the kernel forks us as an usermodhelper, we don't have any of the standard fd's and the first open() will start with fd=0. This is inherited to all forked childs and confuses later forked helpers where we want to read from a pipe connected to the helpers stdout/stderr. # ls -l /proc/$(pidof udevd)/fd total 6 dr-x------ 2 root root 0 2005-08-18 12:44 . dr-xr-xr-x 4 root root 0 2005-08-18 12:44 .. lrwx------ 1 root root 64 2005-08-18 12:44 0 -> /dev/null lrwx------ 1 root root 64 2005-08-18 12:44 1 -> socket:[1274617] lr-x------ 1 root root 64 2005-08-18 12:44 2 -> pipe:[1274618] l-wx------ 1 root root 64 2005-08-18 12:44 3 -> pipe:[1274618] lrwx------ 1 root root 64 2005-08-18 12:44 4 -> socket:[1274619] lrwx------ 1 root root 64 2005-08-18 12:44 5 -> socket:[1274620] Ouch! This will obviously not redirect sterr, it will kill the pipe we established between the parent and the child: devnull = open("/dev/null", O_RDWR); dup2(devnull, STDERR_FILENO); Signed-off-by: Kay Sievers <kay.sievers@suse.de>
Diffstat (limited to 'udev.c')
-rw-r--r--udev.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/udev.c b/udev.c
index beaa191c..926c4b52 100644
--- a/udev.c
+++ b/udev.c
@@ -72,6 +72,7 @@ int main(int argc, char *argv[], char *envp[])
const char *devpath;
const char *subsystem;
struct sigaction act;
+ int devnull;
int retval = -EINVAL;
if (argc == 2 && strcmp(argv[1], "-V") == 0) {
@@ -79,7 +80,22 @@ int main(int argc, char *argv[], char *envp[])
exit(0);
}
+ /* set std fd's to /dev/null, if the kernel forks us, we don't have them at all */
+ devnull = open("/dev/null", O_RDWR);
+ if (devnull >= 0) {
+ if (devnull != STDIN_FILENO)
+ dup2(devnull, STDIN_FILENO);
+ if (devnull != STDOUT_FILENO)
+ dup2(devnull, STDOUT_FILENO);
+ if (devnull != STDERR_FILENO)
+ dup2(devnull, STDERR_FILENO);
+ if (devnull > STDERR_FILENO)
+ close(devnull);
+ }
+
logging_init("udev");
+ if (devnull < 0)
+ err("fatal, could not open /dev/null");
udev_init_config();
dbg("version %s", UDEV_VERSION);