chiark / gitweb /
06bfbd953e51de79c79acb655926b51122fd6ab9
[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 "config.h"
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 <dirent.h>
30 #include <fcntl.h>
31 #include <syslog.h>
32 #include <time.h>
33 #include <getopt.h>
34 #include <sys/select.h>
35 #include <sys/wait.h>
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <sys/un.h>
39 #include <sys/stat.h>
40 #include <sys/ioctl.h>
41 #include <linux/types.h>
42 #include <linux/netlink.h>
43 #ifdef HAVE_INOTIFY
44 #include <sys/inotify.h>
45 #endif
46
47 #include "udev.h"
48 #include "udev_rules.h"
49
50 #define UDEVD_PRIORITY                  -4
51 #define UDEV_PRIORITY                   -2
52
53 /* maximum limit of forked childs */
54 #define UDEVD_MAX_CHILDS                256
55
56 static int debug;
57
58 static void log_fn(struct udev *udev, int priority,
59                    const char *file, int line, const char *fn,
60                    const char *format, va_list args)
61 {
62         if (debug) {
63                 fprintf(stderr, "[%d] %s: ", (int) getpid(), fn);
64                 vfprintf(stderr, format, args);
65         } else {
66                 vsyslog(priority, format, args);
67         }
68 }
69
70 struct udevd_uevent_msg {
71         struct udev *udev;
72         struct list_head node;
73         pid_t pid;
74         int exitstatus;
75         time_t queue_time;
76         char *action;
77         char *devpath;
78         char *subsystem;
79         char *driver;
80         dev_t devt;
81         unsigned long long seqnum;
82         char *devpath_old;
83         char *physdevpath;
84         unsigned int timeout;
85         char *envp[UEVENT_NUM_ENVP+1];
86         char envbuf[];
87 };
88
89 static int debug_trace;
90 static struct udev_rules rules;
91 static struct udev_ctrl *udev_ctrl;
92 static int uevent_netlink_sock = -1;
93 static int inotify_fd = -1;
94
95 static int signal_pipe[2] = {-1, -1};
96 static volatile int sigchilds_waiting;
97 static volatile int udev_exit;
98 static volatile int reload_config;
99 static int run_exec_q;
100 static int stop_exec_q;
101 static int max_childs;
102 static char udev_log_env[32];
103
104 static LIST_HEAD(exec_list);
105 static LIST_HEAD(running_list);
106
107 static void asmlinkage udev_event_sig_handler(int signum)
108 {
109         if (signum == SIGALRM)
110                 exit(1);
111 }
112
113 static int udev_event_process(struct udevd_uevent_msg *msg)
114 {
115         struct sigaction act;
116         struct udevice *udevice;
117         int i;
118         int retval;
119
120         /* set signal handlers */
121         memset(&act, 0x00, sizeof(act));
122         act.sa_handler = (void (*)(int)) udev_event_sig_handler;
123         sigemptyset (&act.sa_mask);
124         act.sa_flags = 0;
125         sigaction(SIGALRM, &act, NULL);
126
127         /* reset to default */
128         act.sa_handler = SIG_DFL;
129         sigaction(SIGINT, &act, NULL);
130         sigaction(SIGTERM, &act, NULL);
131         sigaction(SIGCHLD, &act, NULL);
132         sigaction(SIGHUP, &act, NULL);
133
134         /* trigger timeout to prevent hanging processes */
135         alarm(UDEV_EVENT_TIMEOUT);
136
137         /* reconstruct event environment from message */
138         for (i = 0; msg->envp[i]; i++)
139                 putenv(msg->envp[i]);
140
141         udevice = udev_device_init(msg->udev);
142         if (udevice == NULL)
143                 return -1;
144         strlcpy(udevice->action, msg->action, sizeof(udevice->action));
145         sysfs_device_set_values(udevice->udev, udevice->dev, msg->devpath, msg->subsystem, msg->driver);
146         udevice->devpath_old = msg->devpath_old;
147         udevice->devt = msg->devt;
148
149         retval = udev_device_event(&rules, udevice);
150
151         /* rules may change/disable the timeout */
152         if (udevice->event_timeout >= 0)
153                 alarm(udevice->event_timeout);
154
155         /* run programs collected by RUN-key*/
156         if (retval == 0 && !udevice->ignore_device && udev_get_run(msg->udev))
157                 retval = udev_rules_run(udevice);
158
159         udev_device_cleanup(udevice);
160         return retval;
161 }
162
163 enum event_state {
164         EVENT_QUEUED,
165         EVENT_FINISHED,
166         EVENT_FAILED,
167 };
168
169 static void export_event_state(struct udevd_uevent_msg *msg, enum event_state state)
170 {
171         char filename[PATH_SIZE];
172         char filename_failed[PATH_SIZE];
173         size_t start;
174
175         /* location of queue file */
176         snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu", udev_get_dev_path(msg->udev), msg->seqnum);
177
178         /* location of failed file */
179         strlcpy(filename_failed, udev_get_dev_path(msg->udev), sizeof(filename_failed));
180         strlcat(filename_failed, "/", sizeof(filename_failed));
181         start = strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
182         strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
183         util_path_encode(&filename_failed[start], sizeof(filename_failed) - start);
184
185         switch (state) {
186         case EVENT_QUEUED:
187                 unlink(filename_failed);
188                 delete_path(msg->udev, filename_failed);
189                 create_path(msg->udev, filename);
190                 udev_selinux_setfscreatecon(msg->udev, filename, S_IFLNK);
191                 symlink(msg->devpath, filename);
192                 udev_selinux_resetfscreatecon(msg->udev);
193                 break;
194         case EVENT_FINISHED:
195                 if (msg->devpath_old != NULL) {
196                         /* "move" event - rename failed file to current name, do not delete failed */
197                         char filename_failed_old[PATH_SIZE];
198
199                         strlcpy(filename_failed_old, udev_get_dev_path(msg->udev), sizeof(filename_failed_old));
200                         strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
201                         start = strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
202                         strlcat(filename_failed_old, msg->devpath_old, sizeof(filename_failed_old));
203                         util_path_encode(&filename_failed_old[start], sizeof(filename) - start);
204
205                         if (rename(filename_failed_old, filename_failed) == 0)
206                                 info(msg->udev, "renamed devpath, moved failed state of '%s' to %s'\n",
207                                      msg->devpath_old, msg->devpath);
208                 } else {
209                         unlink(filename_failed);
210                         delete_path(msg->udev, filename_failed);
211                 }
212
213                 unlink(filename);
214                 delete_path(msg->udev, filename);
215                 break;
216         case EVENT_FAILED:
217                 /* move failed event to the failed directory */
218                 create_path(msg->udev, filename_failed);
219                 rename(filename, filename_failed);
220
221                 /* clean up possibly empty queue directory */
222                 delete_path(msg->udev, filename);
223                 break;
224         }
225
226         return;
227 }
228
229 static void msg_queue_delete(struct udevd_uevent_msg *msg)
230 {
231         list_del(&msg->node);
232
233         /* mark as failed, if "add" event returns non-zero */
234         if (msg->exitstatus && strcmp(msg->action, "add") == 0)
235                 export_event_state(msg, EVENT_FAILED);
236         else
237                 export_event_state(msg, EVENT_FINISHED);
238
239         free(msg);
240 }
241
242 static void udev_event_run(struct udevd_uevent_msg *msg)
243 {
244         pid_t pid;
245         int retval;
246
247         pid = fork();
248         switch (pid) {
249         case 0:
250                 /* child */
251                 close(uevent_netlink_sock);
252                 udev_ctrl_unref(udev_ctrl);
253                 if (inotify_fd >= 0)
254                         close(inotify_fd);
255                 close(signal_pipe[READ_END]);
256                 close(signal_pipe[WRITE_END]);
257                 logging_close();
258                 logging_init("udevd-event");
259                 setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY);
260
261                 retval = udev_event_process(msg);
262                 info(msg->udev, "seq %llu finished with %i\n", msg->seqnum, retval);
263
264                 logging_close();
265                 if (retval)
266                         exit(1);
267                 exit(0);
268         case -1:
269                 err(msg->udev, "fork of child failed: %s\n", strerror(errno));
270                 msg_queue_delete(msg);
271                 break;
272         default:
273                 /* get SIGCHLD in main loop */
274                 info(msg->udev, "seq %llu forked, pid [%d], '%s' '%s', %ld seconds old\n",
275                      msg->seqnum, pid,  msg->action, msg->subsystem, time(NULL) - msg->queue_time);
276                 msg->pid = pid;
277         }
278 }
279
280 static void msg_queue_insert(struct udevd_uevent_msg *msg)
281 {
282         char filename[PATH_SIZE];
283         int fd;
284
285         msg->queue_time = time(NULL);
286
287         export_event_state(msg, EVENT_QUEUED);
288         info(msg->udev, "seq %llu queued, '%s' '%s'\n", msg->seqnum, msg->action, msg->subsystem);
289
290         strlcpy(filename, udev_get_dev_path(msg->udev), sizeof(filename));
291         strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
292         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
293         if (fd >= 0) {
294                 char str[32];
295                 int len;
296
297                 len = sprintf(str, "%llu\n", msg->seqnum);
298                 write(fd, str, len);
299                 close(fd);
300         }
301
302         /* run one event after the other in debug mode */
303         if (debug_trace) {
304                 list_add_tail(&msg->node, &running_list);
305                 udev_event_run(msg);
306                 waitpid(msg->pid, NULL, 0);
307                 msg_queue_delete(msg);
308                 return;
309         }
310
311         /* run all events with a timeout set immediately */
312         if (msg->timeout != 0) {
313                 list_add_tail(&msg->node, &running_list);
314                 udev_event_run(msg);
315                 return;
316         }
317
318         list_add_tail(&msg->node, &exec_list);
319         run_exec_q = 1;
320 }
321
322 static int mem_size_mb(void)
323 {
324         FILE* f;
325         char buf[4096];
326         long int memsize = -1;
327
328         f = fopen("/proc/meminfo", "r");
329         if (f == NULL)
330                 return -1;
331
332         while (fgets(buf, sizeof(buf), f) != NULL) {
333                 long int value;
334
335                 if (sscanf(buf, "MemTotal: %ld kB", &value) == 1) {
336                         memsize = value / 1024;
337                         break;
338                 }
339         }
340
341         fclose(f);
342         return memsize;
343 }
344
345 static int compare_devpath(const char *running, const char *waiting)
346 {
347         int i;
348
349         for (i = 0; i < PATH_SIZE; i++) {
350                 /* identical device event found */
351                 if (running[i] == '\0' && waiting[i] == '\0')
352                         return 1;
353
354                 /* parent device event found */
355                 if (running[i] == '\0' && waiting[i] == '/')
356                         return 2;
357
358                 /* child device event found */
359                 if (running[i] == '/' && waiting[i] == '\0')
360                         return 3;
361
362                 /* no matching event */
363                 if (running[i] != waiting[i])
364                         break;
365         }
366
367         return 0;
368 }
369
370 /* lookup event for identical, parent, child, or physical device */
371 static int devpath_busy(struct udevd_uevent_msg *msg, int limit)
372 {
373         struct udevd_uevent_msg *loop_msg;
374         int childs_count = 0;
375
376         /* check exec-queue which may still contain delayed events we depend on */
377         list_for_each_entry(loop_msg, &exec_list, node) {
378                 /* skip ourself and all later events */
379                 if (loop_msg->seqnum >= msg->seqnum)
380                         break;
381
382                 /* check our old name */
383                 if (msg->devpath_old != NULL)
384                         if (strcmp(loop_msg->devpath , msg->devpath_old) == 0)
385                                 return 2;
386
387                 /* check identical, parent, or child device event */
388                 if (compare_devpath(loop_msg->devpath, msg->devpath) != 0) {
389                         dbg(msg->udev, "%llu, device event still pending %llu (%s)\n",
390                             msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
391                         return 3;
392                 }
393
394                 /* check for our major:minor number */
395                 if (msg->devt && loop_msg->devt == msg->devt &&
396                     strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
397                         dbg(msg->udev, "%llu, device event still pending %llu (%d:%d)\n", msg->seqnum,
398                             loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
399                         return 4;
400                 }
401
402                 /* check physical device event (special case of parent) */
403                 if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
404                         if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
405                                 dbg(msg->udev, "%llu, physical device event still pending %llu (%s)\n",
406                                     msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
407                                 return 5;
408                         }
409         }
410
411         /* check run queue for still running events */
412         list_for_each_entry(loop_msg, &running_list, node) {
413                 childs_count++;
414
415                 if (childs_count++ >= limit) {
416                         info(msg->udev, "%llu, maximum number (%i) of childs reached\n", msg->seqnum, childs_count);
417                         return 1;
418                 }
419
420                 /* check our old name */
421                 if (msg->devpath_old != NULL)
422                         if (strcmp(loop_msg->devpath , msg->devpath_old) == 0)
423                                 return 2;
424
425                 /* check identical, parent, or child device event */
426                 if (compare_devpath(loop_msg->devpath, msg->devpath) != 0) {
427                         dbg(msg->udev, "%llu, device event still running %llu (%s)\n",
428                             msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
429                         return 3;
430                 }
431
432                 /* check for our major:minor number */
433                 if (msg->devt && loop_msg->devt == msg->devt &&
434                     strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
435                         dbg(msg->udev, "%llu, device event still running %llu (%d:%d)\n", msg->seqnum,
436                             loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
437                         return 4;
438                 }
439
440                 /* check physical device event (special case of parent) */
441                 if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
442                         if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
443                                 dbg(msg->udev, "%llu, physical device event still running %llu (%s)\n",
444                                     msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
445                                 return 5;
446                         }
447         }
448         return 0;
449 }
450
451 /* serializes events for the identical and parent and child devices */
452 static void msg_queue_manager(struct udev *udev)
453 {
454         struct udevd_uevent_msg *loop_msg;
455         struct udevd_uevent_msg *tmp_msg;
456
457         if (list_empty(&exec_list))
458                 return;
459
460         list_for_each_entry_safe(loop_msg, tmp_msg, &exec_list, node) {
461                 /* serialize and wait for parent or child events */
462                 if (devpath_busy(loop_msg, max_childs) != 0) {
463                         dbg(udev, "delay seq %llu (%s)\n", loop_msg->seqnum, loop_msg->devpath);
464                         continue;
465                 }
466
467                 /* move event to run list */
468                 list_move_tail(&loop_msg->node, &running_list);
469                 udev_event_run(loop_msg);
470                 dbg(udev, "moved seq %llu to running list\n", loop_msg->seqnum);
471         }
472 }
473
474 static struct udevd_uevent_msg *get_msg_from_envbuf(struct udev *udev, const char *buf, int buf_size)
475 {
476         int bufpos;
477         int i;
478         struct udevd_uevent_msg *msg;
479         char *physdevdriver_key = NULL;
480         int maj = 0;
481         int min = 0;
482
483         msg = malloc(sizeof(struct udevd_uevent_msg) + buf_size);
484         if (msg == NULL)
485                 return NULL;
486         memset(msg, 0x00, sizeof(struct udevd_uevent_msg) + buf_size);
487         msg->udev = udev;
488
489         /* copy environment buffer and reconstruct envp */
490         memcpy(msg->envbuf, buf, buf_size);
491         bufpos = 0;
492         for (i = 0; (bufpos < buf_size) && (i < UEVENT_NUM_ENVP-2); i++) {
493                 int keylen;
494                 char *key;
495
496                 key = &msg->envbuf[bufpos];
497                 keylen = strlen(key);
498                 msg->envp[i] = key;
499                 bufpos += keylen + 1;
500                 dbg(udev, "add '%s' to msg.envp[%i]\n", msg->envp[i], i);
501
502                 /* remember some keys for further processing */
503                 if (strncmp(key, "ACTION=", 7) == 0)
504                         msg->action = &key[7];
505                 else if (strncmp(key, "DEVPATH=", 8) == 0)
506                         msg->devpath = &key[8];
507                 else if (strncmp(key, "SUBSYSTEM=", 10) == 0)
508                         msg->subsystem = &key[10];
509                 else if (strncmp(key, "DRIVER=", 7) == 0)
510                         msg->driver = &key[7];
511                 else if (strncmp(key, "SEQNUM=", 7) == 0)
512                         msg->seqnum = strtoull(&key[7], NULL, 10);
513                 else if (strncmp(key, "DEVPATH_OLD=", 12) == 0)
514                         msg->devpath_old = &key[12];
515                 else if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
516                         msg->physdevpath = &key[12];
517                 else if (strncmp(key, "PHYSDEVDRIVER=", 14) == 0)
518                         physdevdriver_key = key;
519                 else if (strncmp(key, "MAJOR=", 6) == 0)
520                         maj = strtoull(&key[6], NULL, 10);
521                 else if (strncmp(key, "MINOR=", 6) == 0)
522                         min = strtoull(&key[6], NULL, 10);
523                 else if (strncmp(key, "TIMEOUT=", 8) == 0)
524                         msg->timeout = strtoull(&key[8], NULL, 10);
525         }
526         msg->devt = makedev(maj, min);
527         msg->envp[i++] = "UDEVD_EVENT=1";
528
529         if (msg->driver == NULL && msg->physdevpath == NULL && physdevdriver_key != NULL) {
530                 /* for older kernels DRIVER is empty for a bus device, export PHYSDEVDRIVER as DRIVER */
531                 msg->envp[i++] = &physdevdriver_key[7];
532                 msg->driver = &physdevdriver_key[14];
533         }
534
535         msg->envp[i] = NULL;
536
537         if (msg->devpath == NULL || msg->action == NULL) {
538                 info(udev, "DEVPATH or ACTION missing, ignore message\n");
539                 free(msg);
540                 return NULL;
541         }
542         return msg;
543 }
544
545 /* receive the udevd message from userspace */
546 static void handle_ctrl_msg(struct udev_ctrl *uctrl)
547 {
548         struct udev *udev = udev_ctrl_get_udev(uctrl);
549         struct udev_ctrl_msg *ctrl_msg;
550         const char *str;
551         int i;
552
553         ctrl_msg = udev_ctrl_receive_msg(uctrl);
554         if (ctrl_msg == NULL)
555                 return;
556
557         i = udev_ctrl_get_set_log_level(ctrl_msg);
558         if (i >= 0) {
559                 info(udev, "udevd message (SET_LOG_PRIORITY) received, log_priority=%i\n", i);
560                 udev_set_log_priority(udev, i);
561                 sprintf(udev_log_env, "UDEV_LOG=%i", i);
562                 putenv(udev_log_env);
563         }
564
565         if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
566                 info(udev, "udevd message (STOP_EXEC_QUEUE) received\n");
567                 stop_exec_q = 1;
568         }
569
570         if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
571                 info(udev, "udevd message (START_EXEC_QUEUE) received\n");
572                 stop_exec_q = 0;
573                 msg_queue_manager(udev);
574         }
575
576         if (udev_ctrl_get_reload_rules(ctrl_msg) > 0) {
577                 info(udev, "udevd message (RELOAD_RULES) received\n");
578                 reload_config = 1;
579         }
580
581         str = udev_ctrl_get_set_env(ctrl_msg);
582         if (str != NULL) {
583                 char *key = strdup(str);
584                 char *val;
585
586                 val = strchr(str, '=');
587                 if (val != NULL) {
588                         val[0] = '\0';
589                         val = &val[1];
590                         if (val[0] == '\0') {
591                                 info(udev, "udevd message (ENV) received, unset '%s'\n", key);
592                                 unsetenv(str);
593                         } else {
594                                 info(udev, "udevd message (ENV) received, set '%s=%s'\n", key, val);
595                                 setenv(key, val, 1);
596                         }
597                 } else {
598                         err(udev, "wrong key format '%s'\n", key);
599                 }
600                 free(key);
601         }
602
603         i = udev_ctrl_get_set_max_childs(ctrl_msg);
604         if (i >= 0) {
605                 info(udev, "udevd message (SET_MAX_CHILDS) received, max_childs=%i\n", i);
606                 max_childs = i;
607         }
608
609         udev_ctrl_msg_unref(ctrl_msg);
610 }
611
612 /* receive the kernel user event message and do some sanity checks */
613 static struct udevd_uevent_msg *get_netlink_msg(struct udev *udev)
614 {
615         struct udevd_uevent_msg *msg;
616         int bufpos;
617         ssize_t size;
618         static char buffer[UEVENT_BUFFER_SIZE+512];
619         char *pos;
620
621         size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0);
622         if (size <  0) {
623                 if (errno != EINTR)
624                         err(udev, "unable to receive kernel netlink message: %s\n", strerror(errno));
625                 return NULL;
626         }
627
628         if ((size_t)size > sizeof(buffer)-1)
629                 size = sizeof(buffer)-1;
630         buffer[size] = '\0';
631         dbg(udev, "uevent_size=%zi\n", size);
632
633         /* start of event payload */
634         bufpos = strlen(buffer)+1;
635         msg = get_msg_from_envbuf(udev, &buffer[bufpos], size-bufpos);
636         if (msg == NULL)
637                 return NULL;
638
639         /* validate message */
640         pos = strchr(buffer, '@');
641         if (pos == NULL) {
642                 err(udev, "invalid uevent '%s'\n", buffer);
643                 free(msg);
644                 return NULL;
645         }
646         pos[0] = '\0';
647
648         if (msg->action == NULL) {
649                 info(udev, "no ACTION in payload found, skip event '%s'\n", buffer);
650                 free(msg);
651                 return NULL;
652         }
653
654         if (strcmp(msg->action, buffer) != 0) {
655                 err(udev, "ACTION in payload does not match uevent, skip event '%s'\n", buffer);
656                 free(msg);
657                 return NULL;
658         }
659
660         return msg;
661 }
662
663 static void asmlinkage sig_handler(int signum)
664 {
665         switch (signum) {
666                 case SIGINT:
667                 case SIGTERM:
668                         udev_exit = 1;
669                         break;
670                 case SIGCHLD:
671                         /* set flag, then write to pipe if needed */
672                         sigchilds_waiting = 1;
673                         break;
674                 case SIGHUP:
675                         reload_config = 1;
676                         break;
677         }
678
679         /* write to pipe, which will wakeup select() in our mainloop */
680         write(signal_pipe[WRITE_END], "", 1);
681 }
682
683 static void udev_done(int pid, int exitstatus)
684 {
685         /* find msg associated with pid and delete it */
686         struct udevd_uevent_msg *msg;
687
688         list_for_each_entry(msg, &running_list, node) {
689                 if (msg->pid == pid) {
690                         info(msg->udev, "seq %llu, pid [%d] exit with %i, %ld seconds old\n", msg->seqnum, msg->pid,
691                              exitstatus, time(NULL) - msg->queue_time);
692                         msg->exitstatus = exitstatus;
693                         msg_queue_delete(msg);
694
695                         /* there may be events waiting with the same devpath */
696                         run_exec_q = 1;
697                         return;
698                 }
699         }
700 }
701
702 static void reap_sigchilds(void)
703 {
704         pid_t pid;
705         int status;
706
707         while (1) {
708                 pid = waitpid(-1, &status, WNOHANG);
709                 if (pid <= 0)
710                         break;
711                 if (WIFEXITED(status))
712                         status = WEXITSTATUS(status);
713                 else if (WIFSIGNALED(status))
714                         status = WTERMSIG(status) + 128;
715                 else
716                         status = 0;
717                 udev_done(pid, status);
718         }
719 }
720
721 static int init_uevent_netlink_sock(struct udev *udev)
722 {
723         struct sockaddr_nl snl;
724         const int buffersize = 16 * 1024 * 1024;
725         int retval;
726
727         memset(&snl, 0x00, sizeof(struct sockaddr_nl));
728         snl.nl_family = AF_NETLINK;
729         snl.nl_pid = getpid();
730         snl.nl_groups = 1;
731
732         uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
733         if (uevent_netlink_sock == -1) {
734                 err(udev, "error getting socket: %s\n", strerror(errno));
735                 return -1;
736         }
737
738         /* set receive buffersize */
739         setsockopt(uevent_netlink_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
740
741         retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
742         if (retval < 0) {
743                 err(udev, "bind failed: %s\n", strerror(errno));
744                 close(uevent_netlink_sock);
745                 uevent_netlink_sock = -1;
746                 return -1;
747         }
748         return 0;
749 }
750
751 static void export_initial_seqnum(struct udev *udev)
752 {
753         char filename[PATH_SIZE];
754         int fd;
755         char seqnum[32];
756         ssize_t len = 0;
757
758         strlcpy(filename, udev_get_sys_path(udev), sizeof(filename));
759         strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename));
760         fd = open(filename, O_RDONLY);
761         if (fd >= 0) {
762                 len = read(fd, seqnum, sizeof(seqnum)-1);
763                 close(fd);
764         }
765         if (len <= 0) {
766                 strcpy(seqnum, "0\n");
767                 len = 3;
768         }
769         strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
770         strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
771         create_path(udev, filename);
772         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
773         if (fd >= 0) {
774                 write(fd, seqnum, len);
775                 close(fd);
776         }
777 }
778
779 int main(int argc, char *argv[])
780 {
781         struct udev *udev;
782         int retval;
783         int fd;
784         struct sigaction act;
785         fd_set readfds;
786         const char *value;
787         int daemonize = 0;
788         static const struct option options[] = {
789                 { "daemon", 0, NULL, 'd' },
790                 { "debug-trace", 0, NULL, 't' },
791                 { "debug", 0, NULL, 'D' },
792                 { "help", 0, NULL, 'h' },
793                 { "version", 0, NULL, 'V' },
794                 {}
795         };
796         int rc = 1;
797         int maxfd;
798
799         udev = udev_new();
800         if (udev == NULL)
801                 goto exit;
802
803         logging_init("udevd");
804         udev_set_log_fn(udev, log_fn);
805         dbg(udev, "version %s\n", VERSION);
806
807         while (1) {
808                 int option;
809
810                 option = getopt_long(argc, argv, "dDthV", options, NULL);
811                 if (option == -1)
812                         break;
813
814                 switch (option) {
815                 case 'd':
816                         daemonize = 1;
817                         break;
818                 case 't':
819                         debug_trace = 1;
820                         break;
821                 case 'D':
822                         debug = 1;
823                         if (udev_get_log_priority(udev) < LOG_INFO)
824                                 udev_set_log_priority(udev, LOG_INFO);
825                         break;
826                 case 'h':
827                         printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--version]\n");
828                         goto exit;
829                 case 'V':
830                         printf("%s\n", VERSION);
831                         goto exit;
832                 default:
833                         goto exit;
834                 }
835         }
836
837         if (getuid() != 0) {
838                 fprintf(stderr, "root privileges required\n");
839                 err(udev, "root privileges required\n");
840                 goto exit;
841         }
842
843         /* make sure std{in,out,err} fd's are in a sane state */
844         fd = open("/dev/null", O_RDWR);
845         if (fd < 0) {
846                 fprintf(stderr, "cannot open /dev/null\n");
847                 err(udev, "cannot open /dev/null\n");
848         }
849         if (fd > STDIN_FILENO)
850                 dup2(fd, STDIN_FILENO);
851         if (write(STDOUT_FILENO, 0, 0) < 0)
852                 dup2(fd, STDOUT_FILENO);
853         if (write(STDERR_FILENO, 0, 0) < 0)
854                 dup2(fd, STDERR_FILENO);
855
856         /* init control socket, bind() ensures, that only one udevd instance is running */
857         udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
858         if (udev_ctrl == NULL) {
859                 fprintf(stderr, "error initializing control socket");
860                 err(udev, "error initializing udevd socket");
861                 rc = 1;
862                 goto exit;
863         }
864
865         if (udev_ctrl_enable_receiving(udev_ctrl) < 0) {
866                 fprintf(stderr, "error binding control socket, seems udevd is already running\n");
867                 err(udev, "error binding control socket, seems udevd is already running\n");
868                 rc = 1;
869                 goto exit;
870         }
871
872         if (init_uevent_netlink_sock(udev) < 0) {
873                 fprintf(stderr, "error initializing netlink socket\n");
874                 err(udev, "error initializing netlink socket\n");
875                 rc = 3;
876                 goto exit;
877         }
878
879         retval = pipe(signal_pipe);
880         if (retval < 0) {
881                 err(udev, "error getting pipes: %s\n", strerror(errno));
882                 goto exit;
883         }
884
885         retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
886         if (retval < 0) {
887                 err(udev, "error fcntl on read pipe: %s\n", strerror(errno));
888                 goto exit;
889         }
890         retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
891         if (retval < 0) {
892                 err(udev, "error fcntl on read pipe: %s\n", strerror(errno));
893                 goto exit;
894         }
895
896         retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
897         if (retval < 0) {
898                 err(udev, "error fcntl on write pipe: %s\n", strerror(errno));
899                 goto exit;
900         }
901         retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
902         if (retval < 0) {
903                 err(udev, "error fcntl on write pipe: %s\n", strerror(errno));
904                 goto exit;
905         }
906
907         /* parse the rules and keep them in memory */
908         sysfs_init();
909         udev_rules_init(udev, &rules, 1);
910
911         export_initial_seqnum(udev);
912
913         if (daemonize) {
914                 pid_t pid;
915
916                 pid = fork();
917                 switch (pid) {
918                 case 0:
919                         dbg(udev, "daemonized fork running\n");
920                         break;
921                 case -1:
922                         err(udev, "fork of daemon failed: %s\n", strerror(errno));
923                         rc = 4;
924                         goto exit;
925                 default:
926                         dbg(udev, "child [%u] running, parent exits\n", pid);
927                         rc = 0;
928                         goto exit;
929                 }
930         }
931
932         /* redirect std{out,err} */
933         if (!debug) {
934                 dup2(fd, STDOUT_FILENO);
935                 dup2(fd, STDERR_FILENO);
936         }
937         if (fd > STDERR_FILENO)
938                 close(fd);
939
940         /* set scheduling priority for the daemon */
941         setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
942
943         chdir("/");
944         umask(022);
945         setsid();
946
947         /* OOM_DISABLE == -17 */
948         fd = open("/proc/self/oom_adj", O_RDWR);
949         if (fd < 0)
950                 err(udev, "error disabling OOM: %s\n", strerror(errno));
951         else {
952                 write(fd, "-17", 3);
953                 close(fd);
954         }
955
956         fd = open("/dev/kmsg", O_WRONLY);
957         if (fd > 0) {
958                 const char *str = "<6>udevd version " VERSION " started\n";
959
960                 write(fd, str, strlen(str));
961                 close(fd);
962         }
963
964         /* set signal handlers */
965         memset(&act, 0x00, sizeof(struct sigaction));
966         act.sa_handler = (void (*)(int)) sig_handler;
967         sigemptyset(&act.sa_mask);
968         act.sa_flags = SA_RESTART;
969         sigaction(SIGINT, &act, NULL);
970         sigaction(SIGTERM, &act, NULL);
971         sigaction(SIGCHLD, &act, NULL);
972         sigaction(SIGHUP, &act, NULL);
973
974         /* watch rules directory */
975         inotify_fd = inotify_init();
976         if (inotify_fd >= 0) {
977                 if (udev_get_rules_path(udev) != NULL) {
978                         inotify_add_watch(inotify_fd, udev_get_rules_path(udev),
979                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
980                 } else {
981                         char filename[PATH_MAX];
982
983                         inotify_add_watch(inotify_fd, UDEV_PREFIX "/lib/udev/rules.d",
984                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
985                         inotify_add_watch(inotify_fd, SYSCONFDIR "/udev/rules.d",
986                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
987
988                         /* watch dynamic rules directory */
989                         strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
990                         strlcat(filename, "/.udev/rules.d", sizeof(filename));
991                         inotify_add_watch(inotify_fd, filename,
992                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
993                 }
994         } else if (errno == ENOSYS)
995                 err(udev, "the kernel does not support inotify, udevd can't monitor rules file changes\n");
996         else
997                 err(udev, "inotify_init failed: %s\n", strerror(errno));
998
999         /* maximum limit of forked childs */
1000         value = getenv("UDEVD_MAX_CHILDS");
1001         if (value)
1002                 max_childs = strtoul(value, NULL, 10);
1003         else {
1004                 int memsize = mem_size_mb();
1005                 if (memsize > 0)
1006                         max_childs = 128 + (memsize / 4);
1007                 else
1008                         max_childs = UDEVD_MAX_CHILDS;
1009         }
1010         info(udev, "initialize max_childs to %u\n", max_childs);
1011
1012         /* clear environment for forked event processes */
1013         clearenv();
1014
1015         /* export log_priority , as called programs may want to follow that setting */
1016         sprintf(udev_log_env, "UDEV_LOG=%i", udev_get_log_priority(udev));
1017         putenv(udev_log_env);
1018         if (debug_trace)
1019                 putenv("DEBUG=1");
1020
1021         maxfd = udev_ctrl_get_fd(udev_ctrl);
1022         maxfd = UDEV_MAX(maxfd, uevent_netlink_sock);
1023         maxfd = UDEV_MAX(maxfd, signal_pipe[READ_END]);
1024         maxfd = UDEV_MAX(maxfd, inotify_fd);
1025
1026         while (!udev_exit) {
1027                 struct udevd_uevent_msg *msg;
1028                 int fdcount;
1029
1030                 FD_ZERO(&readfds);
1031                 FD_SET(signal_pipe[READ_END], &readfds);
1032                 FD_SET(udev_ctrl_get_fd(udev_ctrl), &readfds);
1033                 FD_SET(uevent_netlink_sock, &readfds);
1034                 if (inotify_fd >= 0)
1035                         FD_SET(inotify_fd, &readfds);
1036
1037                 fdcount = select(maxfd+1, &readfds, NULL, NULL, NULL);
1038                 if (fdcount < 0) {
1039                         if (errno != EINTR)
1040                                 err(udev, "error in select: %s\n", strerror(errno));
1041                         continue;
1042                 }
1043
1044                 /* get control message */
1045                 if (FD_ISSET(udev_ctrl_get_fd(udev_ctrl), &readfds))
1046                         handle_ctrl_msg(udev_ctrl);
1047
1048                 /* get netlink message */
1049                 if (FD_ISSET(uevent_netlink_sock, &readfds)) {
1050                         msg = get_netlink_msg(udev);
1051                         if (msg)
1052                                 msg_queue_insert(msg);
1053                 }
1054
1055                 /* received a signal, clear our notification pipe */
1056                 if (FD_ISSET(signal_pipe[READ_END], &readfds)) {
1057                         char buf[256];
1058
1059                         read(signal_pipe[READ_END], &buf, sizeof(buf));
1060                 }
1061
1062                 /* rules directory inotify watch */
1063                 if ((inotify_fd >= 0) && FD_ISSET(inotify_fd, &readfds)) {
1064                         int nbytes;
1065
1066                         /* discard all possible events, we can just reload the config */
1067                         if ((ioctl(inotify_fd, FIONREAD, &nbytes) == 0) && nbytes > 0) {
1068                                 char *buf;
1069
1070                                 reload_config = 1;
1071                                 buf = malloc(nbytes);
1072                                 if (buf == NULL) {
1073                                         err(udev, "error getting buffer for inotify, disable watching\n");
1074                                         close(inotify_fd);
1075                                         inotify_fd = -1;
1076                                 }
1077                                 read(inotify_fd, buf, nbytes);
1078                                 free(buf);
1079                         }
1080                 }
1081
1082                 /* rules changed, set by inotify or a HUP signal */
1083                 if (reload_config) {
1084                         reload_config = 0;
1085                         udev_rules_cleanup(&rules);
1086                         udev_rules_init(udev, &rules, 1);
1087                 }
1088
1089                 /* forked child has returned */
1090                 if (sigchilds_waiting) {
1091                         sigchilds_waiting = 0;
1092                         reap_sigchilds();
1093                 }
1094
1095                 if (run_exec_q) {
1096                         run_exec_q = 0;
1097                         if (!stop_exec_q)
1098                                 msg_queue_manager(udev);
1099                 }
1100         }
1101         rc = 0;
1102
1103 exit:
1104         udev_rules_cleanup(&rules);
1105         sysfs_cleanup();
1106
1107         if (signal_pipe[READ_END] >= 0)
1108                 close(signal_pipe[READ_END]);
1109         if (signal_pipe[WRITE_END] >= 0)
1110                 close(signal_pipe[WRITE_END]);
1111
1112         udev_ctrl_unref(udev_ctrl);
1113         if (inotify_fd >= 0)
1114                 close(inotify_fd);
1115         if (uevent_netlink_sock >= 0)
1116                 close(uevent_netlink_sock);
1117
1118         logging_close();
1119         return rc;
1120 }