chiark / gitweb /
c0852022e246dae89f7bcc21aa728ffd1f1cb543
[elogind.git] / udev / udevd.c
1 /*
2  * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
3  * Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
4  * Copyright (C) 2009 Canonical Ltd.
5  * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <stddef.h>
22 #include <signal.h>
23 #include <unistd.h>
24 #include <errno.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <ctype.h>
29 #include <fcntl.h>
30 #include <time.h>
31 #include <getopt.h>
32 #include <dirent.h>
33 #include <sys/prctl.h>
34 #include <sys/socket.h>
35 #include <sys/signalfd.h>
36 #include <sys/select.h>
37 #include <sys/poll.h>
38 #include <sys/wait.h>
39 #include <sys/stat.h>
40 #include <sys/ioctl.h>
41 #include <sys/inotify.h>
42
43 #include "udev.h"
44
45 #define UDEVD_PRIORITY                  -4
46 #define UDEV_PRIORITY                   -2
47
48 static int debug;
49
50 static void log_fn(struct udev *udev, int priority,
51                    const char *file, int line, const char *fn,
52                    const char *format, va_list args)
53 {
54         if (debug) {
55                 fprintf(stderr, "[%d] %s: ", (int) getpid(), fn);
56                 vfprintf(stderr, format, args);
57         } else {
58                 vsyslog(priority, format, args);
59         }
60 }
61
62 static int debug_trace;
63 static struct udev_rules *rules;
64 static struct udev_queue_export *udev_queue_export;
65 static struct udev_ctrl *udev_ctrl;
66 static struct udev_monitor *monitor;
67 static int worker_watch[2];
68 static pid_t settle_pid;
69 static int stop_exec_queue;
70 static int reload_config;
71 static int max_childs;
72 static int childs;
73 static struct udev_list_node event_list;
74 static struct udev_list_node worker_list;
75 static int udev_exit;
76 static volatile sig_atomic_t worker_exit;
77
78 enum poll_fd {
79         FD_CONTROL,
80         FD_NETLINK,
81         FD_INOTIFY,
82         FD_SIGNAL,
83         FD_WORKER,
84 };
85
86 static struct pollfd pfd[] = {
87         [FD_NETLINK] = { .events = POLLIN },
88         [FD_WORKER] =  { .events = POLLIN },
89         [FD_SIGNAL] =  { .events = POLLIN },
90         [FD_INOTIFY] = { .events = POLLIN },
91         [FD_CONTROL] = { .events = POLLIN },
92 };
93
94 enum event_state {
95         EVENT_UNDEF,
96         EVENT_QUEUED,
97         EVENT_RUNNING,
98 };
99
100 struct event {
101         struct udev_list_node node;
102         struct udev *udev;
103         struct udev_device *dev;
104         enum event_state state;
105         int exitcode;
106         unsigned long long int delaying_seqnum;
107         unsigned long long int seqnum;
108         const char *devpath;
109         size_t devpath_len;
110         const char *devpath_old;
111 };
112
113 static struct event *node_to_event(struct udev_list_node *node)
114 {
115         char *event;
116
117         event = (char *)node;
118         event -= offsetof(struct event, node);
119         return (struct event *)event;
120 }
121
122 enum worker_state {
123         WORKER_UNDEF,
124         WORKER_RUNNING,
125         WORKER_IDLE,
126         WORKER_KILLED,
127 };
128
129 struct worker {
130         struct udev_list_node node;
131         pid_t pid;
132         struct udev_monitor *monitor;
133         enum worker_state state;
134         struct event *event;
135 };
136
137 /* passed from worker to main process */
138 struct worker_message {
139         pid_t pid;
140         int exitcode;
141 };
142
143 static struct worker *node_to_worker(struct udev_list_node *node)
144 {
145         char *worker;
146
147         worker = (char *)node;
148         worker -= offsetof(struct worker, node);
149         return (struct worker *)worker;
150 }
151
152 static void event_queue_delete(struct event *event)
153 {
154         udev_list_node_remove(&event->node);
155
156         /* mark as failed, if "add" event returns non-zero */
157         if (event->exitcode && strcmp(udev_device_get_action(event->dev), "add") == 0)
158                 udev_queue_export_device_failed(udev_queue_export, event->dev);
159         else
160                 udev_queue_export_device_finished(udev_queue_export, event->dev);
161
162         udev_device_unref(event->dev);
163         free(event);
164 }
165
166 static void event_sig_handler(int signum)
167 {
168         switch (signum) {
169         case SIGALRM:
170                 _exit(1);
171                 break;
172         case SIGTERM:
173                 worker_exit = 1;
174                 break;
175         }
176 }
177
178 static void worker_unref(struct worker *worker)
179 {
180         udev_monitor_unref(worker->monitor);
181         free(worker);
182 }
183
184 static void worker_new(struct event *event)
185 {
186         struct worker *worker;
187         struct udev_monitor *worker_monitor;
188         pid_t pid;
189         struct sigaction act;
190
191         /* listen for new events */
192         worker_monitor = udev_monitor_new_from_netlink(event->udev, NULL);
193         if (worker_monitor == NULL)
194                 return;
195         /* allow the main daemon netlink address to send devices to the worker */
196         udev_monitor_allow_unicast_sender(worker_monitor, monitor);
197         udev_monitor_enable_receiving(worker_monitor);
198
199         worker = calloc(1, sizeof(struct worker));
200         if (worker == NULL)
201                 return;
202
203         pid = fork();
204         switch (pid) {
205         case 0: {
206                 sigset_t mask;
207                 struct udev_device *dev;
208
209                 udev_queue_export_unref(udev_queue_export);
210                 udev_ctrl_unref(udev_ctrl);
211                 close(pfd[FD_SIGNAL].fd);
212                 close(worker_watch[READ_END]);
213                 logging_close();
214                 logging_init("udevd-work");
215                 setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY);
216
217                 /* set signal handlers */
218                 memset(&act, 0x00, sizeof(act));
219                 act.sa_handler = event_sig_handler;
220                 sigemptyset (&act.sa_mask);
221                 act.sa_flags = 0;
222                 sigaction(SIGTERM, &act, NULL);
223                 sigaction(SIGALRM, &act, NULL);
224
225                 /* unblock signals */
226                 sigfillset(&mask);
227                 sigdelset(&mask, SIGTERM);
228                 sigdelset(&mask, SIGALRM);
229                 sigprocmask(SIG_SETMASK, &mask, NULL);
230
231                 /* request TERM signal if parent exits */
232                 prctl(PR_SET_PDEATHSIG, SIGTERM);
233
234                 /* initial device */
235                 dev = event->dev;
236
237                 while (!worker_exit) {
238                         struct udev_event *udev_event;
239                         struct worker_message msg;
240                         int err;
241
242                         udev_event = udev_event_new(dev);
243                         if (udev_event == NULL)
244                                 _exit(3);
245
246                         /* set timeout to prevent hanging processes */
247                         alarm(UDEV_EVENT_TIMEOUT);
248
249                         /* apply rules, create node, symlinks */
250                         err = udev_event_execute_rules(udev_event, rules);
251
252                         /* rules may change/disable the timeout */
253                         if (udev_device_get_event_timeout(dev) >= 0)
254                                 alarm(udev_device_get_event_timeout(dev));
255
256                         /* execute RUN= */
257                         if (err == 0 && !udev_event->ignore_device && udev_get_run(udev_event->udev))
258                                 udev_event_execute_run(udev_event);
259
260                         /* reset alarm */
261                         alarm(0);
262
263                         /* apply/restore inotify watch */
264                         if (err == 0 && udev_event->inotify_watch) {
265                                 udev_watch_begin(udev_event->udev, dev);
266                                 udev_device_update_db(dev);
267                         }
268
269                         /* send processed event back to libudev listeners */
270                         udev_monitor_send_device(worker_monitor, NULL, dev);
271
272                         info(event->udev, "seq %llu finished with %i\n", udev_device_get_seqnum(dev), err);
273                         udev_device_unref(dev);
274                         udev_event_unref(udev_event);
275
276                         /* send back the result of the event execution */
277                         msg.exitcode = err;
278                         msg.pid = getpid();
279                         send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);
280
281                         /* wait for more device messages from udevd */
282                         do
283                                 dev = udev_monitor_receive_device(worker_monitor);
284                         while (!worker_exit && dev == NULL);
285                 }
286
287                 udev_monitor_unref(worker_monitor);
288                 logging_close();
289                 exit(0);
290         }
291         case -1:
292                 udev_monitor_unref(worker_monitor);
293                 event->state = EVENT_QUEUED;
294                 free(worker);
295                 err(event->udev, "fork of child failed: %m\n");
296                 break;
297         default:
298                 /* close monitor, but keep address around */
299                 udev_monitor_disconnect(worker_monitor);
300                 worker->monitor = worker_monitor;
301                 worker->pid = pid;
302                 worker->state = WORKER_RUNNING;
303                 worker->event = event;
304                 event->state = EVENT_RUNNING;
305                 udev_list_node_append(&worker->node, &worker_list);
306                 childs++;
307                 break;
308         }
309 }
310
311 static void event_run(struct event *event)
312 {
313         struct udev_list_node *loop;
314
315         udev_list_node_foreach(loop, &worker_list) {
316                 struct worker *worker = node_to_worker(loop);
317                 ssize_t count;
318
319                 if (worker->state != WORKER_IDLE)
320                         continue;
321
322                 worker->event = event;
323                 worker->state = WORKER_RUNNING;
324                 event->state = EVENT_RUNNING;
325                 count = udev_monitor_send_device(monitor, worker->monitor, event->dev);
326                 if (count < 0) {
327                         err(event->udev, "worker [%u] did not accept message, kill it\n", worker->pid);
328                         event->state = EVENT_QUEUED;
329                         worker->state = WORKER_KILLED;
330                         kill(worker->pid, SIGKILL);
331                         continue;
332                 }
333                 return;
334         }
335
336         if (childs >= max_childs) {
337                 info(event->udev, "maximum number (%i) of childs reached\n", childs);
338                 return;
339         }
340
341         /* start new worker and pass initial device */
342         worker_new(event);
343 }
344
345 static void event_queue_insert(struct udev_device *dev)
346 {
347         struct event *event;
348
349         event = calloc(1, sizeof(struct event));
350         if (event == NULL)
351                 return;
352
353         event->udev = udev_device_get_udev(dev);
354         event->dev = dev;
355         event->seqnum = udev_device_get_seqnum(dev);
356         event->devpath = udev_device_get_devpath(dev);
357         event->devpath_len = strlen(event->devpath);
358         event->devpath_old = udev_device_get_devpath_old(dev);
359
360         udev_queue_export_device_queued(udev_queue_export, dev);
361         info(event->udev, "seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(dev),
362              udev_device_get_action(dev), udev_device_get_subsystem(dev));
363
364         event->state = EVENT_QUEUED;
365         udev_list_node_append(&event->node, &event_list);
366
367         /* run all events with a timeout set immediately */
368         if (udev_device_get_timeout(dev) > 0) {
369                 worker_new(event);
370                 return;
371         }
372 }
373
374 static void worker_kill(int retain)
375 {
376         struct udev_list_node *loop;
377         int max;
378
379         if (childs <= retain)
380                 return;
381
382         max = childs - retain;
383
384         udev_list_node_foreach(loop, &worker_list) {
385                 struct worker *worker = node_to_worker(loop);
386
387                 if (max-- <= 0)
388                         break;
389
390                 if (worker->state == WORKER_KILLED)
391                         continue;
392
393                 worker->state = WORKER_KILLED;
394                 kill(worker->pid, SIGTERM);
395         }
396 }
397
398 static int mem_size_mb(void)
399 {
400         FILE *f;
401         char buf[4096];
402         long int memsize = -1;
403
404         f = fopen("/proc/meminfo", "r");
405         if (f == NULL)
406                 return -1;
407
408         while (fgets(buf, sizeof(buf), f) != NULL) {
409                 long int value;
410
411                 if (sscanf(buf, "MemTotal: %ld kB", &value) == 1) {
412                         memsize = value / 1024;
413                         break;
414                 }
415         }
416
417         fclose(f);
418         return memsize;
419 }
420
421 /* lookup event for identical, parent, child device */
422 static int devpath_busy(struct event *event)
423 {
424         struct udev_list_node *loop;
425         size_t common;
426
427         /* check if queue contains events we depend on */
428         udev_list_node_foreach(loop, &event_list) {
429                 struct event *loop_event = node_to_event(loop);
430
431                 /* we already found a later event, earlier can not block us, no need to check again */
432                 if (loop_event->seqnum < event->delaying_seqnum)
433                         continue;
434
435                 /* event we checked earlier still exists, no need to check again */
436                 if (loop_event->seqnum == event->delaying_seqnum)
437                         return 2;
438
439                 /* found ourself, no later event can block us */
440                 if (loop_event->seqnum >= event->seqnum)
441                         break;
442
443                 /* check our old name */
444                 if (event->devpath_old != NULL)
445                         if (strcmp(loop_event->devpath, event->devpath_old) == 0) {
446                                 event->delaying_seqnum = loop_event->seqnum;
447                                 return 3;
448                         }
449
450                 /* compare devpath */
451                 common = MIN(loop_event->devpath_len, event->devpath_len);
452
453                 /* one devpath is contained in the other? */
454                 if (memcmp(loop_event->devpath, event->devpath, common) != 0)
455                         continue;
456
457                 /* identical device event found */
458                 if (loop_event->devpath_len == event->devpath_len) {
459                         event->delaying_seqnum = loop_event->seqnum;
460                         return 4;
461                 }
462
463                 /* parent device event found */
464                 if (event->devpath[common] == '/') {
465                         event->delaying_seqnum = loop_event->seqnum;
466                         return 5;
467                 }
468
469                 /* child device event found */
470                 if (loop_event->devpath[common] == '/') {
471                         event->delaying_seqnum = loop_event->seqnum;
472                         return 6;
473                 }
474
475                 /* no matching device */
476                 continue;
477         }
478
479         return 0;
480 }
481
482 static void events_start(struct udev *udev)
483 {
484         struct udev_list_node *loop;
485
486         udev_list_node_foreach(loop, &event_list) {
487                 struct event *event = node_to_event(loop);
488
489                 if (event->state != EVENT_QUEUED)
490                         continue;
491
492                 /* do not start event if parent or child event is still running */
493                 if (devpath_busy(event) != 0) {
494                         dbg(udev, "delay seq %llu (%s)\n", event->seqnum, event->devpath);
495                         continue;
496                 }
497
498                 event_run(event);
499         }
500 }
501
502 static void worker_returned(void)
503 {
504         while (1) {
505                 struct worker_message msg;
506                 ssize_t size;
507                 struct udev_list_node *loop;
508
509                 size = recv(pfd[FD_WORKER].fd, &msg, sizeof(struct worker_message), MSG_DONTWAIT);
510                 if (size != sizeof(struct worker_message))
511                         break;
512
513                 /* lookup worker who sent the signal */
514                 udev_list_node_foreach(loop, &worker_list) {
515                         struct worker *worker = node_to_worker(loop);
516
517                         if (worker->pid != msg.pid)
518                                 continue;
519
520                         /* worker returned */
521                         worker->event->exitcode = msg.exitcode;
522                         event_queue_delete(worker->event);
523                         worker->event = NULL;
524                         worker->state = WORKER_IDLE;
525                         break;
526                 }
527         }
528 }
529
530 /* receive the udevd message from userspace */
531 static void handle_ctrl_msg(struct udev_ctrl *uctrl)
532 {
533         struct udev *udev = udev_ctrl_get_udev(uctrl);
534         struct udev_ctrl_msg *ctrl_msg;
535         const char *str;
536         int i;
537
538         ctrl_msg = udev_ctrl_receive_msg(uctrl);
539         if (ctrl_msg == NULL)
540                 return;
541
542         i = udev_ctrl_get_set_log_level(ctrl_msg);
543         if (i >= 0) {
544                 info(udev, "udevd message (SET_LOG_PRIORITY) received, log_priority=%i\n", i);
545                 udev_set_log_priority(udev, i);
546                 worker_kill(0);
547         }
548
549         if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
550                 info(udev, "udevd message (STOP_EXEC_QUEUE) received\n");
551                 stop_exec_queue = 1;
552         }
553
554         if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
555                 info(udev, "udevd message (START_EXEC_QUEUE) received\n");
556                 stop_exec_queue = 0;
557         }
558
559         if (udev_ctrl_get_reload_rules(ctrl_msg) > 0) {
560                 info(udev, "udevd message (RELOAD_RULES) received\n");
561                 reload_config = 1;
562         }
563
564         str = udev_ctrl_get_set_env(ctrl_msg);
565         if (str != NULL) {
566                 char *key;
567
568                 key = strdup(str);
569                 if (key != NULL) {
570                         char *val;
571
572                         val = strchr(key, '=');
573                         if (val != NULL) {
574                                 val[0] = '\0';
575                                 val = &val[1];
576                                 if (val[0] == '\0') {
577                                         info(udev, "udevd message (ENV) received, unset '%s'\n", key);
578                                         udev_add_property(udev, key, NULL);
579                                 } else {
580                                         info(udev, "udevd message (ENV) received, set '%s=%s'\n", key, val);
581                                         udev_add_property(udev, key, val);
582                                 }
583                         } else {
584                                 err(udev, "wrong key format '%s'\n", key);
585                         }
586                         free(key);
587                 }
588                 worker_kill(0);
589         }
590
591         i = udev_ctrl_get_set_max_childs(ctrl_msg);
592         if (i >= 0) {
593                 info(udev, "udevd message (SET_MAX_CHILDS) received, max_childs=%i\n", i);
594                 max_childs = i;
595         }
596
597         settle_pid = udev_ctrl_get_settle(ctrl_msg);
598         if (settle_pid > 0) {
599                 info(udev, "udevd message (SETTLE) received\n");
600                 kill(settle_pid, SIGUSR1);
601                 settle_pid = 0;
602         }
603         udev_ctrl_msg_unref(ctrl_msg);
604 }
605
606 /* read inotify messages */
607 static int handle_inotify(struct udev *udev)
608 {
609         ssize_t nbytes, pos;
610         char *buf;
611         struct inotify_event *ev;
612
613         if ((ioctl(pfd[FD_INOTIFY].fd, FIONREAD, &nbytes) < 0) || (nbytes <= 0))
614                 return 0;
615
616         buf = malloc(nbytes);
617         if (buf == NULL) {
618                 err(udev, "error getting buffer for inotify, disable watching\n");
619                 return -1;
620         }
621
622         nbytes = read(pfd[FD_INOTIFY].fd, buf, nbytes);
623
624         for (pos = 0; pos < nbytes; pos += sizeof(struct inotify_event) + ev->len) {
625                 struct udev_device *dev;
626
627                 ev = (struct inotify_event *)(buf + pos);
628                 if (ev->len) {
629                         dbg(udev, "inotify event: %x for %s\n", ev->mask, ev->name);
630                         reload_config = 1;
631                         continue;
632                 }
633
634                 dev = udev_watch_lookup(udev, ev->wd);
635                 if (dev != NULL) {
636                         dbg(udev, "inotify event: %x for %s\n", ev->mask, udev_device_get_devnode(dev));
637                         if (ev->mask & IN_CLOSE_WRITE) {
638                                 char filename[UTIL_PATH_SIZE];
639                                 int fd;
640
641                                 info(udev, "device %s closed, synthesising 'change'\n", udev_device_get_devnode(dev));
642                                 util_strscpyl(filename, sizeof(filename), udev_device_get_syspath(dev), "/uevent", NULL);
643                                 fd = open(filename, O_WRONLY);
644                                 if (fd < 0 || write(fd, "change", 6) < 0)
645                                         info(udev, "error writing uevent: %m\n");
646                                 close(fd);
647                         }
648                         if (ev->mask & IN_IGNORED)
649                                 udev_watch_end(udev, dev);
650
651                         udev_device_unref(dev);
652                 }
653
654         }
655
656         free(buf);
657         return 0;
658 }
659
660 static void handle_signal(int signo)
661 {
662         switch (signo) {
663         case SIGINT:
664         case SIGTERM:
665                 udev_exit = 1;
666                 break;
667         case SIGCHLD:
668                 while (1) {
669                         pid_t pid;
670                         struct udev_list_node *loop, *tmp;
671
672                         pid = waitpid(-1, NULL, WNOHANG);
673                         if (pid <= 0)
674                                 break;
675
676                         udev_list_node_foreach_safe(loop, tmp, &worker_list) {
677                                 struct worker *worker = node_to_worker(loop);
678
679                                 if (worker->pid != pid)
680                                         continue;
681
682                                 /* fail event, if worker died unexpectedly */
683                                 if (worker->event != NULL) {
684                                         worker->event->exitcode = 127;
685                                         event_queue_delete(worker->event);
686                                 }
687
688                                 udev_list_node_remove(&worker->node);
689                                 worker_unref(worker);
690                                 childs--;
691                                 break;
692                         }
693                 }
694                 break;
695         case SIGHUP:
696                 reload_config = 1;
697                 break;
698         }
699 }
700
701 static void startup_log(struct udev *udev)
702 {
703         FILE *f;
704         char path[UTIL_PATH_SIZE];
705         struct stat statbuf;
706
707         f = fopen("/dev/kmsg", "w");
708         if (f != NULL)
709                 fprintf(f, "<6>udev: starting version " VERSION "\n");
710
711         util_strscpyl(path, sizeof(path), udev_get_sys_path(udev), "/class/mem/null", NULL);
712         if (lstat(path, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) {
713                 const char *depr_str =
714                         "udev: missing sysfs features; please update the kernel "
715                         "or disable the kernel's CONFIG_SYSFS_DEPRECATED option; "
716                         "udev may fail to work correctly";
717
718                 if (f != NULL)
719                         fprintf(f, "<3>%s\n", depr_str);
720                 err(udev, "%s\n", depr_str);
721                 sleep(3);
722         }
723
724         if (f != NULL)
725                 fclose(f);
726 }
727
728 int main(int argc, char *argv[])
729 {
730         struct udev *udev;
731         int fd;
732         sigset_t mask;
733         const char *value;
734         int daemonize = 0;
735         int resolve_names = 1;
736         static const struct option options[] = {
737                 { "daemon", no_argument, NULL, 'd' },
738                 { "debug-trace", no_argument, NULL, 't' },
739                 { "debug", no_argument, NULL, 'D' },
740                 { "help", no_argument, NULL, 'h' },
741                 { "version", no_argument, NULL, 'V' },
742                 { "resolve-names", required_argument, NULL, 'N' },
743                 {}
744         };
745         int rc = 1;
746
747         udev = udev_new();
748         if (udev == NULL)
749                 goto exit;
750
751         logging_init("udevd");
752         udev_set_log_fn(udev, log_fn);
753         info(udev, "version %s\n", VERSION);
754         udev_selinux_init(udev);
755
756         while (1) {
757                 int option;
758
759                 option = getopt_long(argc, argv, "dDthV", options, NULL);
760                 if (option == -1)
761                         break;
762
763                 switch (option) {
764                 case 'd':
765                         daemonize = 1;
766                         break;
767                 case 't':
768                         debug_trace = 1;
769                         break;
770                 case 'D':
771                         debug = 1;
772                         if (udev_get_log_priority(udev) < LOG_INFO)
773                                 udev_set_log_priority(udev, LOG_INFO);
774                         break;
775                 case 'N':
776                         if (strcmp (optarg, "early") == 0) {
777                                 resolve_names = 1;
778                         } else if (strcmp (optarg, "late") == 0) {
779                                 resolve_names = 0;
780                         } else if (strcmp (optarg, "never") == 0) {
781                                 resolve_names = -1;
782                         } else {
783                                 fprintf(stderr, "resolve-names must be early, late or never\n");
784                                 err(udev, "resolve-names must be early, late or never\n");
785                                 goto exit;
786                         }
787                         break;
788                 case 'h':
789                         printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] "
790                                "[--resolve-names=early|late|never] [--version]\n");
791                         goto exit;
792                 case 'V':
793                         printf("%s\n", VERSION);
794                         goto exit;
795                 default:
796                         goto exit;
797                 }
798         }
799
800         if (getuid() != 0) {
801                 fprintf(stderr, "root privileges required\n");
802                 err(udev, "root privileges required\n");
803                 goto exit;
804         }
805
806         /* make sure std{in,out,err} fd's are in a sane state */
807         fd = open("/dev/null", O_RDWR);
808         if (fd < 0) {
809                 fprintf(stderr, "cannot open /dev/null\n");
810                 err(udev, "cannot open /dev/null\n");
811         }
812         if (write(STDOUT_FILENO, 0, 0) < 0)
813                 dup2(fd, STDOUT_FILENO);
814         if (write(STDERR_FILENO, 0, 0) < 0)
815                 dup2(fd, STDERR_FILENO);
816
817         /* init control socket, bind() ensures, that only one udevd instance is running */
818         udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
819         if (udev_ctrl == NULL) {
820                 fprintf(stderr, "error initializing control socket");
821                 err(udev, "error initializing udevd socket");
822                 rc = 1;
823                 goto exit;
824         }
825         if (udev_ctrl_enable_receiving(udev_ctrl) < 0) {
826                 fprintf(stderr, "error binding control socket, seems udevd is already running\n");
827                 err(udev, "error binding control socket, seems udevd is already running\n");
828                 rc = 1;
829                 goto exit;
830         }
831         pfd[FD_CONTROL].fd = udev_ctrl_get_fd(udev_ctrl);
832
833         monitor = udev_monitor_new_from_netlink(udev, "kernel");
834         if (monitor == NULL || udev_monitor_enable_receiving(monitor) < 0) {
835                 fprintf(stderr, "error initializing netlink socket\n");
836                 err(udev, "error initializing netlink socket\n");
837                 rc = 3;
838                 goto exit;
839         }
840         udev_monitor_set_receive_buffer_size(monitor, 128*1024*1024);
841         pfd[FD_NETLINK].fd = udev_monitor_get_fd(monitor);
842
843         pfd[FD_INOTIFY].fd = udev_watch_init(udev);
844         if (pfd[FD_INOTIFY].fd < 0) {
845                 fprintf(stderr, "error initializing inotify\n");
846                 err(udev, "error initializing inotify\n");
847                 rc = 4;
848                 goto exit;
849         }
850
851         if (udev_get_rules_path(udev) != NULL) {
852                 inotify_add_watch(pfd[FD_INOTIFY].fd, udev_get_rules_path(udev),
853                                   IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
854         } else {
855                 char filename[UTIL_PATH_SIZE];
856
857                 inotify_add_watch(pfd[FD_INOTIFY].fd, UDEV_PREFIX "/lib/udev/rules.d",
858                                   IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
859                 inotify_add_watch(pfd[FD_INOTIFY].fd, SYSCONFDIR "/udev/rules.d",
860                                   IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
861
862                 /* watch dynamic rules directory */
863                 util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
864                 inotify_add_watch(pfd[FD_INOTIFY].fd, filename,
865                                   IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
866         }
867         udev_watch_restore(udev);
868
869         /* block and listen to all signals on signalfd */
870         sigfillset(&mask);
871         sigprocmask(SIG_SETMASK, &mask, NULL);
872         pfd[FD_SIGNAL].fd = signalfd(-1, &mask, 0);
873         if (pfd[FD_SIGNAL].fd < 0) {
874                 fprintf(stderr, "error getting signalfd\n");
875                 err(udev, "error getting signalfd\n");
876                 rc = 5;
877                 goto exit;
878         }
879
880         /* unnamed socket from workers to the main daemon */
881         if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, worker_watch) < 0) {
882                 fprintf(stderr, "error getting socketpair\n");
883                 err(udev, "error getting socketpair\n");
884                 rc = 6;
885                 goto exit;
886         }
887         pfd[FD_WORKER].fd = worker_watch[READ_END];
888
889         rules = udev_rules_new(udev, resolve_names);
890         if (rules == NULL) {
891                 err(udev, "error reading rules\n");
892                 goto exit;
893         }
894
895         udev_queue_export = udev_queue_export_new(udev);
896         if (udev_queue_export == NULL) {
897                 err(udev, "error creating queue file\n");
898                 goto exit;
899         }
900
901         if (daemonize) {
902                 pid_t pid;
903
904                 pid = fork();
905                 switch (pid) {
906                 case 0:
907                         break;
908                 case -1:
909                         err(udev, "fork of daemon failed: %m\n");
910                         rc = 4;
911                         goto exit;
912                 default:
913                         rc = 0;
914                         goto exit;
915                 }
916         }
917
918         startup_log(udev);
919
920         /* redirect std{out,err} */
921         if (!debug && !debug_trace) {
922                 dup2(fd, STDIN_FILENO);
923                 dup2(fd, STDOUT_FILENO);
924                 dup2(fd, STDERR_FILENO);
925         }
926         if (fd > STDERR_FILENO)
927                 close(fd);
928
929         /* set scheduling priority for the daemon */
930         setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
931
932         chdir("/");
933         umask(022);
934         setsid();
935
936         /* OOM_DISABLE == -17 */
937         fd = open("/proc/self/oom_adj", O_RDWR);
938         if (fd < 0)
939                 err(udev, "error disabling OOM: %m\n");
940         else {
941                 write(fd, "-17", 3);
942                 close(fd);
943         }
944
945         /* in trace mode run one event after the other */
946         if (debug_trace) {
947                 max_childs = 1;
948         } else {
949                 int memsize = mem_size_mb();
950
951                 if (memsize > 0)
952                         max_childs = 128 + (memsize / 8);
953                 else
954                         max_childs = 128;
955         }
956
957         /* possibly overwrite maximum limit of executed events */
958         value = getenv("UDEVD_MAX_CHILDS");
959         if (value)
960                 max_childs = strtoul(value, NULL, 10);
961         info(udev, "initialize max_childs to %u\n", max_childs);
962
963         udev_list_init(&event_list);
964         udev_list_init(&worker_list);
965
966         while (!udev_exit) {
967                 int fdcount;
968                 int timeout;
969
970                 /* set timeout to kill idle workers */
971                 if (udev_list_is_empty(&event_list) && childs > 2)
972                         timeout = 3 * 1000;
973                 else
974                         timeout = -1;
975                 /* wait for events */
976                 fdcount = poll(pfd, ARRAY_SIZE(pfd), timeout);
977                 if (fdcount < 0)
978                         continue;
979
980                 /* timeout - kill idle workers */
981                 if (fdcount == 0)
982                         worker_kill(2);
983
984                 /* event has finished */
985                 if (pfd[FD_WORKER].revents & POLLIN)
986                         worker_returned();
987
988                 /* get kernel uevent */
989                 if (pfd[FD_NETLINK].revents & POLLIN) {
990                         struct udev_device *dev;
991
992                         dev = udev_monitor_receive_device(monitor);
993                         if (dev != NULL)
994                                 event_queue_insert(dev);
995                         else
996                                 udev_device_unref(dev);
997                 }
998
999                 /* start new events */
1000                 if (!udev_list_is_empty(&event_list) && !stop_exec_queue)
1001                         events_start(udev);
1002
1003                 /* get signal */
1004                 if (pfd[FD_SIGNAL].revents & POLLIN) {
1005                         struct signalfd_siginfo fdsi;
1006                         ssize_t size;
1007
1008                         size = read(pfd[FD_SIGNAL].fd, &fdsi, sizeof(struct signalfd_siginfo));
1009                         if (size == sizeof(struct signalfd_siginfo))
1010                                 handle_signal(fdsi.ssi_signo);
1011                 }
1012
1013                 /* device node and rules directory inotify watch */
1014                 if (pfd[FD_INOTIFY].revents & POLLIN)
1015                         handle_inotify(udev);
1016
1017                 /*
1018                  * get control message
1019                  *
1020                  * This needs to be after the inotify handling, to make sure,
1021                  * that the settle signal is send back after the possibly generated
1022                  * "change" events by the inotify device node watch.
1023                  */
1024                 if (pfd[FD_CONTROL].revents & POLLIN)
1025                         handle_ctrl_msg(udev_ctrl);
1026
1027                 /* rules changed, set by inotify or a HUP signal */
1028                 if (reload_config) {
1029                         struct udev_rules *rules_new;
1030
1031                         worker_kill(0);
1032                         rules_new = udev_rules_new(udev, resolve_names);
1033                         if (rules_new != NULL) {
1034                                 udev_rules_unref(rules);
1035                                 rules = rules_new;
1036                         }
1037                         reload_config = 0;
1038                 }
1039         }
1040
1041         udev_queue_export_cleanup(udev_queue_export);
1042         rc = 0;
1043 exit:
1044         udev_queue_export_unref(udev_queue_export);
1045         udev_rules_unref(rules);
1046         udev_ctrl_unref(udev_ctrl);
1047         if (pfd[FD_SIGNAL].fd >= 0)
1048                 close(pfd[FD_SIGNAL].fd);
1049         if (worker_watch[READ_END] >= 0)
1050                 close(worker_watch[READ_END]);
1051         if (worker_watch[WRITE_END] >= 0)
1052                 close(worker_watch[WRITE_END]);
1053         udev_monitor_unref(monitor);
1054         udev_selinux_exit(udev);
1055         udev_unref(udev);
1056         logging_close();
1057         return rc;
1058 }