summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udevd.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/udevd.c b/udevd.c
index c49cf292cf..e2514e5947 100644
--- a/udevd.c
+++ b/udevd.c
@@ -814,7 +814,7 @@ static int init_uevent_netlink_sock(void)
int main(int argc, char *argv[], char *envp[])
{
int retval;
- int devnull;
+ int fd;
struct sigaction act;
fd_set readfds;
const char *value;
@@ -824,20 +824,20 @@ int main(int argc, char *argv[], char *envp[])
int rc = 0;
/* redirect std fd's, 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);
+ fd = open("/dev/null", O_RDWR);
+ if (fd >= 0) {
+ if (fd != STDIN_FILENO)
+ dup2(fd, STDIN_FILENO);
+ if (fd != STDOUT_FILENO)
+ dup2(fd, STDOUT_FILENO);
+ if (fd != STDERR_FILENO)
+ dup2(fd, STDERR_FILENO);
+ if (fd > STDERR_FILENO)
+ close(fd);
}
logging_init("udevd");
- if (devnull < 0)
+ if (fd < 0)
err("fatal, could not open /dev/null");
udev_init_config();
@@ -889,13 +889,6 @@ int main(int argc, char *argv[], char *envp[])
switch (pid) {
case 0:
dbg("daemonized fork running");
-
- /* become session leader */
- sid = setsid();
- dbg("our session is %d", sid);
-
- chdir("/");
- umask(umask(077) | 022);
break;
case -1:
err("fork of daemon failed");
@@ -907,9 +900,25 @@ int main(int argc, char *argv[], char *envp[])
}
}
- /* set a reasonable scheduling priority for the daemon */
+ /* set scheduling priority for the daemon */
setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
+ chdir("/");
+ umask(077);
+
+ /* become session leader */
+ sid = setsid();
+ dbg("our session is %d", sid);
+
+ /* OOM_DISABLE == -17 */
+ fd = open("/proc/self/oom_adj", O_RDWR);
+ if (fd < 0)
+ err("error disabling OOM");
+ else {
+ write(fd, "-17", 3);
+ close(fd);
+ }
+
/* setup signal handler pipe */
retval = pipe(signal_pipe);
if (retval < 0) {