chiark / gitweb /
15ec0fbb033949d9c1a63e35bfb2ec1f750f2914
[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  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <stddef.h>
20 #include <signal.h>
21 #include <unistd.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <dirent.h>
28 #include <fcntl.h>
29 #include <syslog.h>
30 #include <time.h>
31 #include <getopt.h>
32 #include <sys/select.h>
33 #include <sys/wait.h>
34 #include <sys/types.h>
35 #include <sys/socket.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 #include "udev_rules.h"
44
45 #define UDEVD_PRIORITY                  -4
46 #define UDEV_PRIORITY                   -2
47
48 /* maximum limit of forked childs */
49 #define UDEVD_MAX_CHILDS                256
50
51 static int debug;
52
53 static void log_fn(struct udev *udev, int priority,
54                    const char *file, int line, const char *fn,
55                    const char *format, va_list args)
56 {
57         if (debug) {
58                 fprintf(stderr, "[%d] %s: ", (int) getpid(), fn);
59                 vfprintf(stderr, format, args);
60         } else {
61                 vsyslog(priority, format, args);
62         }
63 }
64
65 static int debug_trace;
66 static struct udev_rules rules;
67 static struct udev_ctrl *udev_ctrl;
68 static struct udev_monitor *kernel_monitor;
69 static int inotify_fd = -1;
70
71 static int signal_pipe[2] = {-1, -1};
72 static volatile int sigchilds_waiting;
73 static volatile int udev_exit;
74 static volatile int reload_config;
75 static int run_exec_q;
76 static int stop_exec_q;
77 static int max_childs;
78
79 static LIST_HEAD(exec_list);
80 static LIST_HEAD(running_list);
81
82 enum event_state {
83         EVENT_QUEUED,
84         EVENT_FINISHED,
85         EVENT_FAILED,
86 };
87
88 static void export_event_state(struct udev_event *event, enum event_state state)
89 {
90         char filename[UTIL_PATH_SIZE];
91         char filename_failed[UTIL_PATH_SIZE];
92         size_t start;
93
94         /* location of queue file */
95         snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu",
96                  udev_get_dev_path(event->udev), udev_device_get_seqnum(event->dev));
97
98         /* location of failed file */
99         util_strlcpy(filename_failed, udev_get_dev_path(event->udev), sizeof(filename_failed));
100         util_strlcat(filename_failed, "/", sizeof(filename_failed));
101         start = util_strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
102         util_strlcat(filename_failed, udev_device_get_devpath(event->dev), sizeof(filename_failed));
103         util_path_encode(&filename_failed[start], sizeof(filename_failed) - start);
104
105         switch (state) {
106         case EVENT_QUEUED:
107                 unlink(filename_failed);
108                 delete_path(event->udev, filename_failed);
109                 create_path(event->udev, filename);
110                 udev_selinux_setfscreatecon(event->udev, filename, S_IFLNK);
111                 symlink(udev_device_get_devpath(event->dev), filename);
112                 udev_selinux_resetfscreatecon(event->udev);
113                 break;
114         case EVENT_FINISHED:
115                 if (udev_device_get_devpath_old(event->dev) != NULL) {
116                         /* "move" event - rename failed file to current name, do not delete failed */
117                         char filename_failed_old[UTIL_PATH_SIZE];
118
119                         util_strlcpy(filename_failed_old, udev_get_dev_path(event->udev), sizeof(filename_failed_old));
120                         util_strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
121                         start = util_strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
122                         util_strlcat(filename_failed_old, udev_device_get_devpath_old(event->dev), sizeof(filename_failed_old));
123                         util_path_encode(&filename_failed_old[start], sizeof(filename) - start);
124
125                         if (rename(filename_failed_old, filename_failed) == 0)
126                                 info(event->udev, "renamed devpath, moved failed state of '%s' to %s'\n",
127                                      udev_device_get_devpath_old(event->dev), udev_device_get_devpath(event->dev));
128                 } else {
129                         unlink(filename_failed);
130                         delete_path(event->udev, filename_failed);
131                 }
132
133                 unlink(filename);
134                 delete_path(event->udev, filename);
135                 break;
136         case EVENT_FAILED:
137                 /* move failed event to the failed directory */
138                 create_path(event->udev, filename_failed);
139                 rename(filename, filename_failed);
140
141                 /* clean up possibly empty queue directory */
142                 delete_path(event->udev, filename);
143                 break;
144         }
145
146         return;
147 }
148
149 static void event_queue_delete(struct udev_event *event)
150 {
151         list_del(&event->node);
152
153         /* mark as failed, if "add" event returns non-zero */
154         if (event->exitstatus && strcmp(udev_device_get_action(event->dev), "add") == 0)
155                 export_event_state(event, EVENT_FAILED);
156         else
157                 export_event_state(event, EVENT_FINISHED);
158
159         udev_device_unref(event->dev);
160         udev_event_unref(event);
161 }
162
163 static void asmlinkage event_sig_handler(int signum)
164 {
165         if (signum == SIGALRM)
166                 exit(1);
167 }
168
169 static void event_fork(struct udev_event *event)
170 {
171         pid_t pid;
172         struct sigaction act;
173         int err;
174
175         pid = fork();
176         switch (pid) {
177         case 0:
178                 /* child */
179                 udev_monitor_unref(kernel_monitor);
180                 udev_ctrl_unref(udev_ctrl);
181                 if (inotify_fd >= 0)
182                         close(inotify_fd);
183                 close(signal_pipe[READ_END]);
184                 close(signal_pipe[WRITE_END]);
185                 logging_close();
186                 logging_init("udevd-event");
187                 setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY);
188
189                 /* set signal handlers */
190                 memset(&act, 0x00, sizeof(act));
191                 act.sa_handler = (void (*)(int)) event_sig_handler;
192                 sigemptyset (&act.sa_mask);
193                 act.sa_flags = 0;
194                 sigaction(SIGALRM, &act, NULL);
195
196                 /* reset to default */
197                 act.sa_handler = SIG_DFL;
198                 sigaction(SIGINT, &act, NULL);
199                 sigaction(SIGTERM, &act, NULL);
200                 sigaction(SIGCHLD, &act, NULL);
201                 sigaction(SIGHUP, &act, NULL);
202
203                 /* set timeout to prevent hanging processes */
204                 alarm(UDEV_EVENT_TIMEOUT);
205
206                 /* apply rules, create node, symlinks */
207                 err = udev_event_run(event, &rules);
208
209                 /* rules may change/disable the timeout */
210                 if (udev_device_get_event_timeout(event->dev) >= 0)
211                         alarm(udev_device_get_event_timeout(event->dev));
212
213                 /* execute RUN= */
214                 if (err == 0 && !event->ignore_device && udev_get_run(event->udev))
215                         udev_rules_run(event);
216                 info(event->udev, "seq %llu finished with %i\n", udev_device_get_seqnum(event->dev), err);
217                 logging_close();
218                 if (err != 0)
219                         exit(1);
220                 exit(0);
221         case -1:
222                 err(event->udev, "fork of child failed: %m\n");
223                 event_queue_delete(event);
224                 break;
225         default:
226                 /* get SIGCHLD in main loop */
227                 info(event->udev, "seq %llu forked, pid [%d], '%s' '%s', %ld seconds old\n",
228                      udev_device_get_seqnum(event->dev),
229                      pid,
230                      udev_device_get_action(event->dev),
231                      udev_device_get_subsystem(event->dev),
232                      time(NULL) - event->queue_time);
233                 event->pid = pid;
234         }
235 }
236
237 static void event_queue_insert(struct udev_event *event)
238 {
239         char filename[UTIL_PATH_SIZE];
240         int fd;
241
242         event->queue_time = time(NULL);
243
244         export_event_state(event, EVENT_QUEUED);
245         info(event->udev, "seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(event->dev), udev_device_get_action(event->dev), udev_device_get_subsystem(event->dev));
246
247         util_strlcpy(filename, udev_get_dev_path(event->udev), sizeof(filename));
248         util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
249         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
250         if (fd >= 0) {
251                 char str[32];
252                 int len;
253
254                 len = sprintf(str, "%llu\n", udev_device_get_seqnum(event->dev));
255                 write(fd, str, len);
256                 close(fd);
257         }
258
259         /* run one event after the other in debug mode */
260         if (debug_trace) {
261                 list_add_tail(&event->node, &running_list);
262                 event_fork(event);
263                 waitpid(event->pid, NULL, 0);
264                 event_queue_delete(event);
265                 return;
266         }
267
268         /* run all events with a timeout set immediately */
269         if (udev_device_get_timeout(event->dev) > 0) {
270                 list_add_tail(&event->node, &running_list);
271                 event_fork(event);
272                 return;
273         }
274
275         list_add_tail(&event->node, &exec_list);
276         run_exec_q = 1;
277 }
278
279 static int mem_size_mb(void)
280 {
281         FILE* f;
282         char buf[4096];
283         long int memsize = -1;
284
285         f = fopen("/proc/meminfo", "r");
286         if (f == NULL)
287                 return -1;
288
289         while (fgets(buf, sizeof(buf), f) != NULL) {
290                 long int value;
291
292                 if (sscanf(buf, "MemTotal: %ld kB", &value) == 1) {
293                         memsize = value / 1024;
294                         break;
295                 }
296         }
297
298         fclose(f);
299         return memsize;
300 }
301
302 static int compare_devpath(const char *running, const char *waiting)
303 {
304         int i;
305
306         for (i = 0; i < UTIL_PATH_SIZE; i++) {
307                 /* identical device event found */
308                 if (running[i] == '\0' && waiting[i] == '\0')
309                         return 1;
310
311                 /* parent device event found */
312                 if (running[i] == '\0' && waiting[i] == '/')
313                         return 2;
314
315                 /* child device event found */
316                 if (running[i] == '/' && waiting[i] == '\0')
317                         return 3;
318
319                 /* no matching event */
320                 if (running[i] != waiting[i])
321                         break;
322         }
323
324         return 0;
325 }
326
327 /* lookup event for identical, parent, child, or physical device */
328 static int devpath_busy(struct udev_event *event, int limit)
329 {
330         struct udev_event *loop_event;
331         int childs_count = 0;
332
333         /* check exec-queue which may still contain delayed events we depend on */
334         list_for_each_entry(loop_event, &exec_list, node) {
335                 /* skip ourself and all later events */
336                 if (udev_device_get_seqnum(loop_event->dev) >= udev_device_get_seqnum(event->dev))
337                         break;
338
339                 /* check our old name */
340                 if (udev_device_get_devpath_old(event->dev) != NULL)
341                         if (strcmp(udev_device_get_devpath(loop_event->dev), udev_device_get_devpath_old(event->dev)) == 0)
342                                 return 2;
343
344                 /* check identical, parent, or child device event */
345                 if (compare_devpath(udev_device_get_devpath(loop_event->dev), udev_device_get_devpath(event->dev)) != 0) {
346                         dbg(event->udev, "%llu, device event still pending %llu (%s)\n",
347                             udev_device_get_seqnum(event->dev),
348                             udev_device_get_seqnum(loop_event->dev),
349                             udev_device_get_devpath(loop_event->dev));
350                         return 3;
351                 }
352
353                 /* check for our major:minor number */
354                 if (major(udev_device_get_devnum(event->dev)) > 0 &&
355                     udev_device_get_devnum(loop_event->dev) == udev_device_get_devnum(event->dev) &&
356                     strcmp(udev_device_get_subsystem(event->dev), udev_device_get_subsystem(loop_event->dev)) == 0) {
357                         dbg(event->udev, "%llu, device event still pending %llu (%d:%d)\n",
358                             udev_device_get_seqnum(event->dev),
359                             udev_device_get_seqnum(loop_event->dev),
360                             major(udev_device_get_devnum(loop_event->dev)), minor(udev_device_get_devnum(loop_event->dev)));
361                         return 4;
362                 }
363
364                 /* check physical device event (special case of parent) */
365                 if (udev_device_get_physdevpath(event->dev) != NULL &&
366                     strcmp(udev_device_get_action(event->dev), "add") == 0)
367                         if (compare_devpath(udev_device_get_devpath(loop_event->dev),
368                                             udev_device_get_physdevpath(event->dev)) != 0) {
369                                 dbg(event->udev, "%llu, physical 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                                 return 5;
374                         }
375         }
376
377         /* check run queue for still running events */
378         list_for_each_entry(loop_event, &running_list, node) {
379                 childs_count++;
380
381                 if (childs_count++ >= limit) {
382                         info(event->udev, "%llu, maximum number (%i) of childs reached\n",
383                              udev_device_get_seqnum(event->dev), childs_count);
384                         return 1;
385                 }
386
387                 /* check our old name */
388                 if (udev_device_get_devpath_old(event->dev) != NULL)
389                         if (strcmp(udev_device_get_devpath(loop_event->dev), udev_device_get_devpath_old(event->dev)) == 0)
390                                 return 2;
391
392                 /* check identical, parent, or child device event */
393                 if (compare_devpath(udev_device_get_devpath(loop_event->dev), udev_device_get_devpath(event->dev)) != 0) {
394                         dbg(event->udev, "%llu, device event still running %llu (%s)\n",
395                             udev_device_get_seqnum(event->dev),
396                             udev_device_get_seqnum(loop_event->dev),
397                             udev_device_get_devpath(loop_event->dev));
398                         return 3;
399                 }
400
401                 /* check for our major:minor number */
402                 if (major(udev_device_get_devnum(event->dev)) > 0 &&
403                     udev_device_get_devnum(loop_event->dev) == udev_device_get_devnum(event->dev) &&
404                     strcmp(udev_device_get_subsystem(event->dev), udev_device_get_subsystem(loop_event->dev)) == 0) {
405                         dbg(event->udev, "%llu, device event still pending %llu (%d:%d)\n",
406                             udev_device_get_seqnum(event->dev),
407                             udev_device_get_seqnum(loop_event->dev),
408                             major(udev_device_get_devnum(loop_event->dev)), minor(udev_device_get_devnum(loop_event->dev)));
409                         return 4;
410                 }
411
412                 /* check physical device event (special case of parent) */
413                 if (udev_device_get_physdevpath(event->dev) != NULL &&
414                     strcmp(udev_device_get_action(event->dev), "add") == 0)
415                         if (compare_devpath(udev_device_get_devpath(loop_event->dev),
416                                             udev_device_get_physdevpath(event->dev)) != 0) {
417                                 dbg(event->udev, "%llu, physical device event still pending %llu (%s)\n",
418                                     udev_device_get_seqnum(event->dev),
419                                     udev_device_get_seqnum(loop_event->dev),
420                                     udev_device_get_devpath(loop_event->dev));
421                                 return 5;
422                         }
423         }
424         return 0;
425 }
426
427 /* serializes events for the identical and parent and child devices */
428 static void event_queue_manager(struct udev *udev)
429 {
430         struct udev_event *loop_event;
431         struct udev_event *tmp_event;
432
433         if (list_empty(&exec_list))
434                 return;
435
436         list_for_each_entry_safe(loop_event, tmp_event, &exec_list, node) {
437                 /* serialize and wait for parent or child events */
438                 if (devpath_busy(loop_event, max_childs) != 0) {
439                         dbg(udev, "delay seq %llu (%s)\n",
440                             udev_device_get_seqnum(loop_event->dev),
441                             udev_device_get_devpath(loop_event->dev));
442                         continue;
443                 }
444
445                 /* move event to run list */
446                 list_move_tail(&loop_event->node, &running_list);
447                 event_fork(loop_event);
448                 dbg(udev, "moved seq %llu to running list\n", udev_device_get_seqnum(loop_event->dev));
449         }
450 }
451
452 /* receive the udevd message from userspace */
453 static void handle_ctrl_msg(struct udev_ctrl *uctrl)
454 {
455         struct udev *udev = udev_ctrl_get_udev(uctrl);
456         struct udev_ctrl_msg *ctrl_msg;
457         const char *str;
458         int i;
459
460         ctrl_msg = udev_ctrl_receive_msg(uctrl);
461         if (ctrl_msg == NULL)
462                 return;
463
464         i = udev_ctrl_get_set_log_level(ctrl_msg);
465         if (i >= 0) {
466                 info(udev, "udevd message (SET_LOG_PRIORITY) received, log_priority=%i\n", i);
467                 udev_set_log_priority(udev, i);
468         }
469
470         if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
471                 info(udev, "udevd message (STOP_EXEC_QUEUE) received\n");
472                 stop_exec_q = 1;
473         }
474
475         if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
476                 info(udev, "udevd message (START_EXEC_QUEUE) received\n");
477                 stop_exec_q = 0;
478                 event_queue_manager(udev);
479         }
480
481         if (udev_ctrl_get_reload_rules(ctrl_msg) > 0) {
482                 info(udev, "udevd message (RELOAD_RULES) received\n");
483                 reload_config = 1;
484         }
485
486         str = udev_ctrl_get_set_env(ctrl_msg);
487         if (str != NULL) {
488                 char *key;
489
490                 key = strdup(str);
491                 if (key != NULL) {
492                         char *val;
493
494                         val = strchr(key, '=');
495                         if (val != NULL) {
496                                 val[0] = '\0';
497                                 val = &val[1];
498                                 if (val[0] == '\0') {
499                                         info(udev, "udevd message (ENV) received, unset '%s'\n", key);
500                                         udev_add_property(udev, key, NULL);
501                                 } else {
502                                         info(udev, "udevd message (ENV) received, set '%s=%s'\n", key, val);
503                                         udev_add_property(udev, key, val);
504                                 }
505                         } else {
506                                 err(udev, "wrong key format '%s'\n", key);
507                         }
508                         free(key);
509                 }
510         }
511
512         i = udev_ctrl_get_set_max_childs(ctrl_msg);
513         if (i >= 0) {
514                 info(udev, "udevd message (SET_MAX_CHILDS) received, max_childs=%i\n", i);
515                 max_childs = i;
516         }
517
518         udev_ctrl_msg_unref(ctrl_msg);
519 }
520
521 static void asmlinkage sig_handler(int signum)
522 {
523         switch (signum) {
524                 case SIGINT:
525                 case SIGTERM:
526                         udev_exit = 1;
527                         break;
528                 case SIGCHLD:
529                         /* set flag, then write to pipe if needed */
530                         sigchilds_waiting = 1;
531                         break;
532                 case SIGHUP:
533                         reload_config = 1;
534                         break;
535         }
536
537         /* write to pipe, which will wakeup select() in our mainloop */
538         write(signal_pipe[WRITE_END], "", 1);
539 }
540
541 static void udev_done(int pid, int exitstatus)
542 {
543         /* find event associated with pid and delete it */
544         struct udev_event *event;
545
546         list_for_each_entry(event, &running_list, node) {
547                 if (event->pid == pid) {
548                         info(event->udev, "seq %llu, pid [%d] exit with %i, %ld seconds old\n",
549                              udev_device_get_seqnum(event->dev), event->pid,
550                              exitstatus, time(NULL) - event->queue_time);
551                         event->exitstatus = exitstatus;
552                         event_queue_delete(event);
553
554                         /* there may be events waiting with the same devpath */
555                         run_exec_q = 1;
556                         return;
557                 }
558         }
559 }
560
561 static void reap_sigchilds(void)
562 {
563         pid_t pid;
564         int status;
565
566         while (1) {
567                 pid = waitpid(-1, &status, WNOHANG);
568                 if (pid <= 0)
569                         break;
570                 if (WIFEXITED(status))
571                         status = WEXITSTATUS(status);
572                 else if (WIFSIGNALED(status))
573                         status = WTERMSIG(status) + 128;
574                 else
575                         status = 0;
576                 udev_done(pid, status);
577         }
578 }
579
580 static void export_initial_seqnum(struct udev *udev)
581 {
582         char filename[UTIL_PATH_SIZE];
583         int fd;
584         char seqnum[32];
585         ssize_t len = 0;
586
587         util_strlcpy(filename, udev_get_sys_path(udev), sizeof(filename));
588         util_strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename));
589         fd = open(filename, O_RDONLY);
590         if (fd >= 0) {
591                 len = read(fd, seqnum, sizeof(seqnum)-1);
592                 close(fd);
593         }
594         if (len <= 0) {
595                 strcpy(seqnum, "0\n");
596                 len = 3;
597         }
598         util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
599         util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
600         create_path(udev, filename);
601         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
602         if (fd >= 0) {
603                 write(fd, seqnum, len);
604                 close(fd);
605         }
606 }
607
608 int main(int argc, char *argv[])
609 {
610         struct udev *udev;
611         int err;
612         int fd;
613         struct sigaction act;
614         fd_set readfds;
615         const char *value;
616         int daemonize = 0;
617         static const struct option options[] = {
618                 { "daemon", no_argument, NULL, 'd' },
619                 { "debug-trace", no_argument, NULL, 't' },
620                 { "debug", no_argument, NULL, 'D' },
621                 { "help", no_argument, NULL, 'h' },
622                 { "version", no_argument, NULL, 'V' },
623                 {}
624         };
625         int rc = 1;
626         int maxfd;
627
628         udev = udev_new();
629         if (udev == NULL)
630                 goto exit;
631
632         logging_init("udevd");
633         udev_set_log_fn(udev, log_fn);
634         info(udev, "version %s\n", VERSION);
635         selinux_init(udev);
636
637         while (1) {
638                 int option;
639
640                 option = getopt_long(argc, argv, "dDthV", options, NULL);
641                 if (option == -1)
642                         break;
643
644                 switch (option) {
645                 case 'd':
646                         daemonize = 1;
647                         break;
648                 case 't':
649                         debug_trace = 1;
650                         break;
651                 case 'D':
652                         debug = 1;
653                         if (udev_get_log_priority(udev) < LOG_INFO)
654                                 udev_set_log_priority(udev, LOG_INFO);
655                         break;
656                 case 'h':
657                         printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--version]\n");
658                         goto exit;
659                 case 'V':
660                         printf("%s\n", VERSION);
661                         goto exit;
662                 default:
663                         goto exit;
664                 }
665         }
666
667         if (getuid() != 0) {
668                 fprintf(stderr, "root privileges required\n");
669                 err(udev, "root privileges required\n");
670                 goto exit;
671         }
672
673         /* make sure std{in,out,err} fd's are in a sane state */
674         fd = open("/dev/null", O_RDWR);
675         if (fd < 0) {
676                 fprintf(stderr, "cannot open /dev/null\n");
677                 err(udev, "cannot open /dev/null\n");
678         }
679         if (fd > STDIN_FILENO)
680                 dup2(fd, STDIN_FILENO);
681         if (write(STDOUT_FILENO, 0, 0) < 0)
682                 dup2(fd, STDOUT_FILENO);
683         if (write(STDERR_FILENO, 0, 0) < 0)
684                 dup2(fd, STDERR_FILENO);
685
686         /* init control socket, bind() ensures, that only one udevd instance is running */
687         udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
688         if (udev_ctrl == NULL) {
689                 fprintf(stderr, "error initializing control socket");
690                 err(udev, "error initializing udevd socket");
691                 rc = 1;
692                 goto exit;
693         }
694
695         if (udev_ctrl_enable_receiving(udev_ctrl) < 0) {
696                 fprintf(stderr, "error binding control socket, seems udevd is already running\n");
697                 err(udev, "error binding control socket, seems udevd is already running\n");
698                 rc = 1;
699                 goto exit;
700         }
701
702         kernel_monitor = udev_monitor_new_from_netlink(udev);
703         if (kernel_monitor == NULL || udev_monitor_enable_receiving(kernel_monitor) < 0) {
704                 fprintf(stderr, "error initializing netlink socket\n");
705                 err(udev, "error initializing netlink socket\n");
706                 rc = 3;
707                 goto exit;
708         } else {
709                 /* set receive buffersize */
710                 const int buffersize = 32 * 1024 * 1024;
711
712                 setsockopt(udev_monitor_get_fd(kernel_monitor),
713                            SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
714         }
715
716         err = pipe(signal_pipe);
717         if (err < 0) {
718                 err(udev, "error getting pipes: %m\n");
719                 goto exit;
720         }
721
722         err = fcntl(signal_pipe[READ_END], F_GETFL, 0);
723         if (err < 0) {
724                 err(udev, "error fcntl on read pipe: %m\n");
725                 goto exit;
726         }
727         err = fcntl(signal_pipe[READ_END], F_SETFL, err | O_NONBLOCK);
728         if (err < 0) {
729                 err(udev, "error fcntl on read pipe: %m\n");
730                 goto exit;
731         }
732
733         err = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
734         if (err < 0) {
735                 err(udev, "error fcntl on write pipe: %m\n");
736                 goto exit;
737         }
738         err = fcntl(signal_pipe[WRITE_END], F_SETFL, err | O_NONBLOCK);
739         if (err < 0) {
740                 err(udev, "error fcntl on write pipe: %m\n");
741                 goto exit;
742         }
743
744         udev_rules_init(udev, &rules, 1);
745         export_initial_seqnum(udev);
746
747         if (daemonize) {
748                 pid_t pid;
749
750                 pid = fork();
751                 switch (pid) {
752                 case 0:
753                         dbg(udev, "daemonized fork running\n");
754                         break;
755                 case -1:
756                         err(udev, "fork of daemon failed: %m\n");
757                         rc = 4;
758                         goto exit;
759                 default:
760                         dbg(udev, "child [%u] running, parent exits\n", pid);
761                         rc = 0;
762                         goto exit;
763                 }
764         }
765
766         /* redirect std{out,err} */
767         if (!debug) {
768                 dup2(fd, STDOUT_FILENO);
769                 dup2(fd, STDERR_FILENO);
770         }
771         if (fd > STDERR_FILENO)
772                 close(fd);
773
774         /* set scheduling priority for the daemon */
775         setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
776
777         chdir("/");
778         umask(022);
779         setsid();
780
781         /* OOM_DISABLE == -17 */
782         fd = open("/proc/self/oom_adj", O_RDWR);
783         if (fd < 0)
784                 err(udev, "error disabling OOM: %m\n");
785         else {
786                 write(fd, "-17", 3);
787                 close(fd);
788         }
789
790         fd = open("/dev/kmsg", O_WRONLY);
791         if (fd > 0) {
792                 const char *ver_str = "<6>udev: starting version " VERSION "\n";
793                 char path[UTIL_PATH_SIZE];
794                 struct stat statbuf;
795
796                 write(fd, ver_str, strlen(ver_str));
797                 util_strlcpy(path, udev_get_sys_path(udev), sizeof(path));
798                 util_strlcat(path, "/class/mem/null", sizeof(path));
799                 if (lstat(path, &statbuf) == 0) {
800                         if (S_ISDIR(statbuf.st_mode)) {
801                                 const char *depr_str = "<6>udev: deprecated sysfs layout (kernel too old, "
802                                                         "or CONFIG_SYSFS_DEPRECATED) is unsupported, some "
803                                                         "udev features may fail\n";
804
805                                 write(fd, depr_str, strlen(depr_str));
806                         }
807                 }
808                 close(fd);
809         }
810
811         /* set signal handlers */
812         memset(&act, 0x00, sizeof(struct sigaction));
813         act.sa_handler = (void (*)(int)) sig_handler;
814         sigemptyset(&act.sa_mask);
815         act.sa_flags = SA_RESTART;
816         sigaction(SIGINT, &act, NULL);
817         sigaction(SIGTERM, &act, NULL);
818         sigaction(SIGCHLD, &act, NULL);
819         sigaction(SIGHUP, &act, NULL);
820
821         /* watch rules directory */
822         inotify_fd = inotify_init();
823         if (inotify_fd >= 0) {
824                 if (udev_get_rules_path(udev) != NULL) {
825                         inotify_add_watch(inotify_fd, udev_get_rules_path(udev),
826                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
827                 } else {
828                         char filename[PATH_MAX];
829
830                         inotify_add_watch(inotify_fd, UDEV_PREFIX "/lib/udev/rules.d",
831                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
832                         inotify_add_watch(inotify_fd, SYSCONFDIR "/udev/rules.d",
833                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
834
835                         /* watch dynamic rules directory */
836                         util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
837                         util_strlcat(filename, "/.udev/rules.d", sizeof(filename));
838                         inotify_add_watch(inotify_fd, filename,
839                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
840                 }
841         } else if (errno == ENOSYS)
842                 err(udev, "the kernel does not support inotify, udevd can't monitor rules file changes\n");
843         else
844                 err(udev, "inotify_init failed: %m\n");
845
846         /* maximum limit of forked childs */
847         value = getenv("UDEVD_MAX_CHILDS");
848         if (value)
849                 max_childs = strtoul(value, NULL, 10);
850         else {
851                 int memsize = mem_size_mb();
852                 if (memsize > 0)
853                         max_childs = 128 + (memsize / 4);
854                 else
855                         max_childs = UDEVD_MAX_CHILDS;
856         }
857         info(udev, "initialize max_childs to %u\n", max_childs);
858
859         maxfd = udev_ctrl_get_fd(udev_ctrl);
860         maxfd = UDEV_MAX(maxfd, udev_monitor_get_fd(kernel_monitor));
861         maxfd = UDEV_MAX(maxfd, signal_pipe[READ_END]);
862         maxfd = UDEV_MAX(maxfd, inotify_fd);
863
864         while (!udev_exit) {
865                 int fdcount;
866
867                 FD_ZERO(&readfds);
868                 FD_SET(signal_pipe[READ_END], &readfds);
869                 FD_SET(udev_ctrl_get_fd(udev_ctrl), &readfds);
870                 FD_SET(udev_monitor_get_fd(kernel_monitor), &readfds);
871                 if (inotify_fd >= 0)
872                         FD_SET(inotify_fd, &readfds);
873
874                 fdcount = select(maxfd+1, &readfds, NULL, NULL, NULL);
875                 if (fdcount < 0) {
876                         if (errno != EINTR)
877                                 err(udev, "error in select: %m\n");
878                         continue;
879                 }
880
881                 /* get control message */
882                 if (FD_ISSET(udev_ctrl_get_fd(udev_ctrl), &readfds))
883                         handle_ctrl_msg(udev_ctrl);
884
885                 /* get kernel uevent */
886                 if (FD_ISSET(udev_monitor_get_fd(kernel_monitor), &readfds)) {
887                         struct udev_device *dev;
888
889                         dev = udev_monitor_receive_device(kernel_monitor);
890                         if (dev != NULL) {
891                                 struct udev_event *event;
892
893                                 event = udev_event_new(dev);
894                                 if (event != NULL)
895                                         event_queue_insert(event);
896                                 else
897                                         udev_device_unref(dev);
898                         }
899                 }
900
901                 /* received a signal, clear our notification pipe */
902                 if (FD_ISSET(signal_pipe[READ_END], &readfds)) {
903                         char buf[256];
904
905                         read(signal_pipe[READ_END], &buf, sizeof(buf));
906                 }
907
908                 /* rules directory inotify watch */
909                 if ((inotify_fd >= 0) && FD_ISSET(inotify_fd, &readfds)) {
910                         int nbytes;
911
912                         /* discard all possible events, we can just reload the config */
913                         if ((ioctl(inotify_fd, FIONREAD, &nbytes) == 0) && nbytes > 0) {
914                                 char *buf;
915
916                                 reload_config = 1;
917                                 buf = malloc(nbytes);
918                                 if (buf == NULL) {
919                                         err(udev, "error getting buffer for inotify, disable watching\n");
920                                         close(inotify_fd);
921                                         inotify_fd = -1;
922                                 }
923                                 read(inotify_fd, buf, nbytes);
924                                 free(buf);
925                         }
926                 }
927
928                 /* rules changed, set by inotify or a HUP signal */
929                 if (reload_config) {
930                         reload_config = 0;
931                         udev_rules_cleanup(&rules);
932                         udev_rules_init(udev, &rules, 1);
933                 }
934
935                 if (sigchilds_waiting) {
936                         sigchilds_waiting = 0;
937                         reap_sigchilds();
938                 }
939
940                 if (run_exec_q) {
941                         run_exec_q = 0;
942                         if (!stop_exec_q)
943                                 event_queue_manager(udev);
944                 }
945         }
946         rc = 0;
947
948 exit:
949         udev_rules_cleanup(&rules);
950
951         if (signal_pipe[READ_END] >= 0)
952                 close(signal_pipe[READ_END]);
953         if (signal_pipe[WRITE_END] >= 0)
954                 close(signal_pipe[WRITE_END]);
955
956         udev_ctrl_unref(udev_ctrl);
957         if (inotify_fd >= 0)
958                 close(inotify_fd);
959         udev_monitor_unref(kernel_monitor);
960
961         selinux_exit(udev);
962         udev_unref(udev);
963         logging_close();
964         return rc;
965 }