/* request TERM signal if parent exits */
prctl(PR_SET_PDEATHSIG, SIGTERM);
+ /* reset OOM score, we only protect the main daemon */
+ write_one_line_file("/proc/self/oom_score_adj", "0");
+
for (;;) {
struct udev_event *udev_event;
struct worker_message msg;
return 0;
}
+/*
+ * read the kernel commandline, in case we need to get into debug mode
+ * udev.log-priority=<level> syslog priority
+ * udev.children-max=<number of workers> events are fully serialized if set to 1
+ * udev.exec-delay=<number of seconds> delay execution of every executed program
+ */
+static void kernel_cmdline_options(struct udev *udev)
+{
+ char *line, *w, *state;
+ size_t l;
+
+ if (read_one_line_file("/proc/cmdline", &line) < 0)
+ return;
+
+ FOREACH_WORD_QUOTED(w, l, line, state) {
+ char *s, *opt;
+
+ s = strndup(w, l);
+ if (!s)
+ break;
+
+ /* accept the same options for the initrd, prefixed with "rd." */
+ if (in_initrd() && startswith(s, "rd."))
+ opt = s + 3;
+ else
+ opt = s;
+
+ if (startswith(opt, "udev.log-priority="))
+ udev_set_log_priority(udev, util_log_priority(opt + 18));
+
+ if (startswith(opt, "udev.children-max="))
+ children_max = strtoul(opt + 18, NULL, 0);
+
+ if (startswith(opt, "udev.exec-delay="))
+ exec_delay = strtoul(opt + 16, NULL, 0);
+
+ free(s);
+ }
+
+ free(line);
+}
+
int main(int argc, char *argv[])
{
struct udev *udev;
int fd_ctrl = -1;
int fd_netlink = -1;
int fd_worker = -1;
- const char *prefixes[] = { "/dev", "/run", NULL };
struct epoll_event ep_ctrl, ep_inotify, ep_signal, ep_netlink, ep_worker;
struct udev_ctrl_connection *ctrl_conn = NULL;
int rc = 1;
log_parse_environment();
udev_set_log_fn(udev, udev_main_log);
log_debug("version %s\n", VERSION);
- label_init(prefixes);
+ label_init("/dev");
for (;;) {
int option;
}
}
- /*
- * read the kernel commandline, in case we need to get into debug mode
- * udev.log-priority=<level> syslog priority
- * udev.children-max=<number of workers> events are fully serialized if set to 1
- *
- */
- f = fopen("/proc/cmdline", "r");
- if (f != NULL) {
- char cmdline[4096];
-
- if (fgets(cmdline, sizeof(cmdline), f) != NULL) {
- char *pos;
-
- pos = strstr(cmdline, "udev.log-priority=");
- if (pos != NULL) {
- pos += strlen("udev.log-priority=");
- udev_set_log_priority(udev, util_log_priority(pos));
- }
-
- pos = strstr(cmdline, "udev.children-max=");
- if (pos != NULL) {
- pos += strlen("udev.children-max=");
- children_max = strtoul(pos, NULL, 0);
- }
-
- pos = strstr(cmdline, "udev.exec-delay=");
- if (pos != NULL) {
- pos += strlen("udev.exec-delay=");
- exec_delay = strtoul(pos, NULL, 0);
- }
- }
- fclose(f);
- }
+ kernel_cmdline_options(udev);
if (getuid() != 0) {
fprintf(stderr, "root privileges required\n");
if (daemonize) {
pid_t pid;
- int fd;
pid = fork();
switch (pid) {
setsid();
- fd = open("/proc/self/oom_score_adj", O_RDWR|O_CLOEXEC);
- if (fd >= 0) {
- write(fd, "-1000", 5);
- close(fd);
- }
+ write_one_line_file("/proc/self/oom_score_adj", "-1000");
} else {
sd_notify(1, "READY=1");
}
/* set value depending on the amount of RAM */
if (memsize > 0)
- children_max = 128 + (memsize / 8);
+ children_max = 16 + (memsize / 8);
else
- children_max = 128;
+ children_max = 16;
}
log_debug("set children_max to %u\n", children_max);