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