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