chiark / gitweb /
volume_id: fail on undefined __BYTE_ORDER
[elogind.git] / udev / udevd.c
1 /*
2  * Copyright (C) 2004-2006 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 it
6  *      under the terms of the GNU General Public License as published by the
7  *      Free Software Foundation version 2 of the License.
8  *
9  *      This program is distributed in the hope that it will be useful, but
10  *      WITHOUT ANY WARRANTY; without even the implied warranty of
11  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *      General Public License for more details.
13  *
14  *      You should have received a copy of the GNU General Public License along
15  *      with this program; if not, write to the Free Software Foundation, Inc.,
16  *      51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  *
18  */
19
20 #include "config.h"
21
22 #include <stddef.h>
23 #include <signal.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <ctype.h>
30 #include <dirent.h>
31 #include <fcntl.h>
32 #include <syslog.h>
33 #include <time.h>
34 #include <getopt.h>
35 #include <sys/select.h>
36 #include <sys/wait.h>
37 #include <sys/types.h>
38 #include <sys/socket.h>
39 #include <sys/un.h>
40 #include <sys/stat.h>
41 #include <sys/ioctl.h>
42 #include <linux/types.h>
43 #include <linux/netlink.h>
44 #ifdef HAVE_INOTIFY
45 #include <sys/inotify.h>
46 #endif
47
48 #include "udev.h"
49 #include "udev_rules.h"
50 #include "udevd.h"
51 #include "udev_selinux.h"
52
53 static int debug_trace;
54 static int debug;
55
56 static struct udev_rules rules;
57 static int udevd_sock = -1;
58 static int uevent_netlink_sock = -1;
59 static int inotify_fd = -1;
60 static pid_t sid;
61
62 static int signal_pipe[2] = {-1, -1};
63 static volatile int sigchilds_waiting;
64 static volatile int udev_exit;
65 static volatile int reload_config;
66 static int run_exec_q;
67 static int stop_exec_q;
68 static int max_childs;
69 static int max_childs_running;
70 static char udev_log[32];
71
72 static LIST_HEAD(exec_list);
73 static LIST_HEAD(running_list);
74
75
76 #ifdef USE_LOG
77 void log_message(int priority, const char *format, ...)
78 {
79         va_list args;
80
81         if (priority > udev_log_priority)
82                 return;
83
84         va_start(args, format);
85         if (debug) {
86                 printf("[%d] ", (int) getpid());
87                 vprintf(format, args);
88         } else
89                 vsyslog(priority, format, args);
90         va_end(args);
91 }
92
93 #endif
94
95 static void asmlinkage udev_event_sig_handler(int signum)
96 {
97         if (signum == SIGALRM)
98                 exit(1);
99 }
100
101 static int udev_event_process(struct udevd_uevent_msg *msg)
102 {
103         struct sigaction act;
104         struct udevice *udev;
105         int i;
106         int retval;
107
108         /* set signal handlers */
109         memset(&act, 0x00, sizeof(act));
110         act.sa_handler = (void (*)(int)) udev_event_sig_handler;
111         sigemptyset (&act.sa_mask);
112         act.sa_flags = 0;
113         sigaction(SIGALRM, &act, NULL);
114
115         /* reset to default */
116         act.sa_handler = SIG_DFL;
117         sigaction(SIGINT, &act, NULL);
118         sigaction(SIGTERM, &act, NULL);
119         sigaction(SIGCHLD, &act, NULL);
120         sigaction(SIGHUP, &act, NULL);
121
122         /* trigger timeout to prevent hanging processes */
123         alarm(UDEV_EVENT_TIMEOUT);
124
125         /* reconstruct event environment from message */
126         for (i = 0; msg->envp[i]; i++)
127                 putenv(msg->envp[i]);
128
129         udev = udev_device_init(NULL);
130         if (udev == NULL)
131                 return -1;
132         strlcpy(udev->action, msg->action, sizeof(udev->action));
133         sysfs_device_set_values(udev->dev, msg->devpath, msg->subsystem, msg->driver);
134         udev->devpath_old = msg->devpath_old;
135         udev->devt = msg->devt;
136
137         retval = udev_device_event(&rules, udev);
138
139         /* rules may change/disable the timeout */
140         if (udev->event_timeout >= 0)
141                 alarm(udev->event_timeout);
142
143         /* run programs collected by RUN-key*/
144         if (retval == 0 && !udev->ignore_device && udev_run)
145                 retval = udev_rules_run(udev);
146
147         udev_device_cleanup(udev);
148         return retval;
149 }
150
151 enum event_state {
152         EVENT_QUEUED,
153         EVENT_FINISHED,
154         EVENT_FAILED,
155 };
156
157 static void export_event_state(struct udevd_uevent_msg *msg, enum event_state state)
158 {
159         char filename[PATH_SIZE];
160         char filename_failed[PATH_SIZE];
161         size_t start;
162
163         /* location of queue file */
164         snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu", udev_root, msg->seqnum);
165
166         /* location of failed file */
167         strlcpy(filename_failed, udev_root, sizeof(filename_failed));
168         strlcat(filename_failed, "/", sizeof(filename_failed));
169         start = strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
170         strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
171         path_encode(&filename_failed[start], sizeof(filename_failed) - start);
172
173         switch (state) {
174         case EVENT_QUEUED:
175                 unlink(filename_failed);
176                 delete_path(filename_failed);
177
178                 create_path(filename);
179                 selinux_setfscreatecon(filename, NULL, S_IFLNK);        
180                 symlink(msg->devpath, filename);
181                 selinux_resetfscreatecon();
182                 break;
183         case EVENT_FINISHED:
184                 if (msg->devpath_old != NULL) {
185                         /* "move" event - rename failed file to current name, do not delete failed */
186                         char filename_failed_old[PATH_SIZE];
187
188                         strlcpy(filename_failed_old, udev_root, sizeof(filename_failed_old));
189                         strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
190                         start = strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
191                         strlcat(filename_failed_old, msg->devpath_old, sizeof(filename_failed_old));
192                         path_encode(&filename_failed_old[start], sizeof(filename) - start);
193
194                         if (rename(filename_failed_old, filename_failed) == 0)
195                                 info("renamed devpath, moved failed state of '%s' to %s'\n",
196                                      msg->devpath_old, msg->devpath);
197                 } else {
198                         unlink(filename_failed);
199                         delete_path(filename_failed);
200                 }
201
202                 unlink(filename);
203                 delete_path(filename);
204                 break;
205         case EVENT_FAILED:
206                 /* move failed event to the failed directory */
207                 create_path(filename_failed);
208                 rename(filename, filename_failed);
209
210                 /* clean up possibly empty queue directory */
211                 delete_path(filename);
212                 break;
213         }
214
215         return;
216 }
217
218 static void msg_queue_delete(struct udevd_uevent_msg *msg)
219 {
220         list_del(&msg->node);
221
222         /* mark as failed, if "add" event returns non-zero */
223         if (msg->exitstatus && strcmp(msg->action, "add") == 0)
224                 export_event_state(msg, EVENT_FAILED);
225         else
226                 export_event_state(msg, EVENT_FINISHED);
227
228         free(msg);
229 }
230
231 static void udev_event_run(struct udevd_uevent_msg *msg)
232 {
233         pid_t pid;
234         int retval;
235
236         pid = fork();
237         switch (pid) {
238         case 0:
239                 /* child */
240                 close(uevent_netlink_sock);
241                 close(udevd_sock);
242                 if (inotify_fd >= 0)
243                         close(inotify_fd);
244                 close(signal_pipe[READ_END]);
245                 close(signal_pipe[WRITE_END]);
246                 logging_close();
247
248                 logging_init("udevd-event");
249                 setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY);
250
251                 retval = udev_event_process(msg);
252                 info("seq %llu finished with %i\n", msg->seqnum, retval);
253
254                 logging_close();
255                 if (retval)
256                         exit(1);
257                 exit(0);
258         case -1:
259                 err("fork of child failed: %s\n", strerror(errno));
260                 msg_queue_delete(msg);
261                 break;
262         default:
263                 /* get SIGCHLD in main loop */
264                 info("seq %llu forked, pid [%d], '%s' '%s', %ld seconds old\n",
265                      msg->seqnum, pid,  msg->action, msg->subsystem, time(NULL) - msg->queue_time);
266                 msg->pid = pid;
267         }
268 }
269
270 static void msg_queue_insert(struct udevd_uevent_msg *msg)
271 {
272         char filename[PATH_SIZE];
273         int fd;
274
275         msg->queue_time = time(NULL);
276
277         export_event_state(msg, EVENT_QUEUED);
278         info("seq %llu queued, '%s' '%s'\n", msg->seqnum, msg->action, msg->subsystem);
279
280         strlcpy(filename, udev_root, sizeof(filename));
281         strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
282         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
283         if (fd >= 0) {
284                 char str[32];
285                 int len;
286
287                 len = sprintf(str, "%llu\n", msg->seqnum);
288                 write(fd, str, len);
289                 close(fd);
290         }
291
292         /* run one event after the other in debug mode */
293         if (debug_trace) {
294                 list_add_tail(&msg->node, &running_list);
295                 udev_event_run(msg);
296                 waitpid(msg->pid, NULL, 0);
297                 msg_queue_delete(msg);
298                 return;
299         }
300
301         /* run all events with a timeout set immediately */
302         if (msg->timeout != 0) {
303                 list_add_tail(&msg->node, &running_list);
304                 udev_event_run(msg);
305                 return;
306         }
307
308         list_add_tail(&msg->node, &exec_list);
309         run_exec_q = 1;
310 }
311
312 static int mem_size_mb(void)
313 {
314         FILE* f;
315         char buf[4096];
316         long int memsize = -1;
317
318         f = fopen("/proc/meminfo", "r");
319         if (f == NULL)
320                 return -1;
321
322         while (fgets(buf, sizeof(buf), f) != NULL) {
323                 long int value;
324
325                 if (sscanf(buf, "MemTotal: %ld kB", &value) == 1) {
326                         memsize = value / 1024;
327                         break;
328                 }
329         }
330
331         fclose(f);
332         return memsize;
333 }
334
335 static int cpu_count(void)
336 {
337         FILE* f;
338         char buf[4096];
339         int count = 0;
340
341         f = fopen("/proc/stat", "r");
342         if (f == NULL)
343                 return -1;
344
345         while (fgets(buf, sizeof(buf), f) != NULL) {
346                 if (strncmp(buf, "cpu", 3) == 0 && isdigit(buf[3]))
347                         count++;
348         }
349
350         fclose(f);
351         if (count == 0)
352                 return -1;
353         return count;
354 }
355
356 static int running_processes(void)
357 {
358         FILE* f;
359         char buf[4096];
360         int running = -1;
361
362         f = fopen("/proc/stat", "r");
363         if (f == NULL)
364                 return -1;
365
366         while (fgets(buf, sizeof(buf), f) != NULL) {
367                 int value;
368
369                 if (sscanf(buf, "procs_running %u", &value) == 1) {
370                         running = value;
371                         break;
372                 }
373         }
374
375         fclose(f);
376         return running;
377 }
378
379 /* return the number of process es in our session, count only until limit */
380 static int running_processes_in_session(pid_t session, int limit)
381 {
382         DIR *dir;
383         struct dirent *dent;
384         int running = 0;
385
386         dir = opendir("/proc");
387         if (!dir)
388                 return -1;
389
390         /* read process info from /proc */
391         for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
392                 int f;
393                 char procdir[64];
394                 char line[256];
395                 const char *pos;
396                 char state;
397                 pid_t ppid, pgrp, sess;
398                 int len;
399
400                 if (!isdigit(dent->d_name[0]))
401                         continue;
402
403                 snprintf(procdir, sizeof(procdir), "/proc/%s/stat", dent->d_name);
404                 procdir[sizeof(procdir)-1] = '\0';
405
406                 f = open(procdir, O_RDONLY);
407                 if (f == -1)
408                         continue;
409
410                 len = read(f, line, sizeof(line)-1);
411                 close(f);
412
413                 if (len <= 0)
414                         continue;
415                 else
416                         line[len] = '\0';
417
418                 /* skip ugly program name */
419                 pos = strrchr(line, ')') + 2;
420                 if (pos == NULL)
421                         continue;
422
423                 if (sscanf(pos, "%c %d %d %d ", &state, &ppid, &pgrp, &sess) != 4)
424                         continue;
425
426                 /* count only processes in our session */
427                 if (sess != session)
428                         continue;
429
430                 /* count only running, no sleeping processes */
431                 if (state != 'R')
432                         continue;
433
434                 running++;
435                 if (limit > 0 && running >= limit)
436                         break;
437         }
438         closedir(dir);
439
440         return running;
441 }
442
443 static int compare_devpath(const char *running, const char *waiting)
444 {
445         int i;
446
447         for (i = 0; i < PATH_SIZE; i++) {
448                 /* identical device event found */
449                 if (running[i] == '\0' && waiting[i] == '\0')
450                         return 1;
451
452                 /* parent device event found */
453                 if (running[i] == '\0' && waiting[i] == '/')
454                         return 2;
455
456                 /* child device event found */
457                 if (running[i] == '/' && waiting[i] == '\0')
458                         return 3;
459
460                 /* no matching event */
461                 if (running[i] != waiting[i])
462                         break;
463         }
464
465         return 0;
466 }
467
468 /* lookup event for identical, parent, child, or physical device */
469 static int devpath_busy(struct udevd_uevent_msg *msg, int limit)
470 {
471         struct udevd_uevent_msg *loop_msg;
472         int childs_count = 0;
473
474         /* check exec-queue which may still contain delayed events we depend on */
475         list_for_each_entry(loop_msg, &exec_list, node) {
476                 /* skip ourself and all later events */
477                 if (loop_msg->seqnum >= msg->seqnum)
478                         break;
479
480                 /* check our old name */
481                 if (msg->devpath_old != NULL)
482                         if (strcmp(loop_msg->devpath , msg->devpath_old) == 0)
483                                 return 2;
484
485                 /* check identical, parent, or child device event */
486                 if (compare_devpath(loop_msg->devpath, msg->devpath) != 0) {
487                         dbg("%llu, device event still pending %llu (%s)\n",
488                             msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
489                         return 3;
490                 }
491
492                 /* check for our major:minor number */
493                 if (msg->devt && loop_msg->devt == msg->devt &&
494                     strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
495                         dbg("%llu, device event still pending %llu (%d:%d)\n", msg->seqnum,
496                             loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
497                         return 4;
498                 }
499
500                 /* check physical device event (special case of parent) */
501                 if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
502                         if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
503                                 dbg("%llu, physical device event still pending %llu (%s)\n",
504                                     msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
505                                 return 5;
506                         }
507         }
508
509         /* check run queue for still running events */
510         list_for_each_entry(loop_msg, &running_list, node) {
511                 if (limit && childs_count++ > limit) {
512                         dbg("%llu, maximum number (%i) of childs reached\n", msg->seqnum, childs_count);
513                         return 1;
514                 }
515
516                 /* check our old name */
517                 if (msg->devpath_old != NULL)
518                         if (strcmp(loop_msg->devpath , msg->devpath_old) == 0)
519                                 return 2;
520
521                 /* check identical, parent, or child device event */
522                 if (compare_devpath(loop_msg->devpath, msg->devpath) != 0) {
523                         dbg("%llu, device event still running %llu (%s)\n",
524                             msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
525                         return 3;
526                 }
527
528                 /* check for our major:minor number */
529                 if (msg->devt && loop_msg->devt == msg->devt &&
530                     strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
531                         dbg("%llu, device event still running %llu (%d:%d)\n", msg->seqnum,
532                             loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
533                         return 4;
534                 }
535
536                 /* check physical device event (special case of parent) */
537                 if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
538                         if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
539                                 dbg("%llu, physical device event still running %llu (%s)\n",
540                                     msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
541                                 return 5;
542                         }
543         }
544         return 0;
545 }
546
547 /* serializes events for the identical and parent and child devices */
548 static void msg_queue_manager(void)
549 {
550         struct udevd_uevent_msg *loop_msg;
551         struct udevd_uevent_msg *tmp_msg;
552         int running;
553
554         if (list_empty(&exec_list))
555                 return;
556
557         running = running_processes();
558         dbg("%d processes runnning on system\n", running);
559         if (running < 0)
560                 running = max_childs_running;
561
562         list_for_each_entry_safe(loop_msg, tmp_msg, &exec_list, node) {
563                 /* check running processes in our session and possibly throttle */
564                 if (running >= max_childs_running) {
565                         running = running_processes_in_session(sid, max_childs_running+10);
566                         dbg("at least %d processes running in session\n", running);
567                         if (running >= max_childs_running) {
568                                 dbg("delay seq %llu, too many processes already running\n", loop_msg->seqnum);
569                                 return;
570                         }
571                 }
572
573                 /* serialize and wait for parent or child events */
574                 if (devpath_busy(loop_msg, max_childs) != 0) {
575                         dbg("delay seq %llu (%s)\n", loop_msg->seqnum, loop_msg->devpath);
576                         continue;
577                 }
578
579                 /* move event to run list */
580                 list_move_tail(&loop_msg->node, &running_list);
581                 udev_event_run(loop_msg);
582                 running++;
583                 dbg("moved seq %llu to running list\n", loop_msg->seqnum);
584         }
585 }
586
587 static struct udevd_uevent_msg *get_msg_from_envbuf(const char *buf, int buf_size)
588 {
589         int bufpos;
590         int i;
591         struct udevd_uevent_msg *msg;
592         char *physdevdriver_key = NULL;
593         int maj = 0;
594         int min = 0;
595
596         msg = malloc(sizeof(struct udevd_uevent_msg) + buf_size);
597         if (msg == NULL)
598                 return NULL;
599         memset(msg, 0x00, sizeof(struct udevd_uevent_msg) + buf_size);
600
601         /* copy environment buffer and reconstruct envp */
602         memcpy(msg->envbuf, buf, buf_size);
603         bufpos = 0;
604         for (i = 0; (bufpos < buf_size) && (i < UEVENT_NUM_ENVP-2); i++) {
605                 int keylen;
606                 char *key;
607
608                 key = &msg->envbuf[bufpos];
609                 keylen = strlen(key);
610                 msg->envp[i] = key;
611                 bufpos += keylen + 1;
612                 dbg("add '%s' to msg.envp[%i]\n", msg->envp[i], i);
613
614                 /* remember some keys for further processing */
615                 if (strncmp(key, "ACTION=", 7) == 0)
616                         msg->action = &key[7];
617                 else if (strncmp(key, "DEVPATH=", 8) == 0)
618                         msg->devpath = &key[8];
619                 else if (strncmp(key, "SUBSYSTEM=", 10) == 0)
620                         msg->subsystem = &key[10];
621                 else if (strncmp(key, "DRIVER=", 7) == 0)
622                         msg->driver = &key[7];
623                 else if (strncmp(key, "SEQNUM=", 7) == 0)
624                         msg->seqnum = strtoull(&key[7], NULL, 10);
625                 else if (strncmp(key, "DEVPATH_OLD=", 12) == 0)
626                         msg->devpath_old = &key[12];
627                 else if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
628                         msg->physdevpath = &key[12];
629                 else if (strncmp(key, "PHYSDEVDRIVER=", 14) == 0)
630                         physdevdriver_key = key;
631                 else if (strncmp(key, "MAJOR=", 6) == 0)
632                         maj = strtoull(&key[6], NULL, 10);
633                 else if (strncmp(key, "MINOR=", 6) == 0)
634                         min = strtoull(&key[6], NULL, 10);
635                 else if (strncmp(key, "TIMEOUT=", 8) == 0)
636                         msg->timeout = strtoull(&key[8], NULL, 10);
637         }
638         msg->devt = makedev(maj, min);
639         msg->envp[i++] = "UDEVD_EVENT=1";
640
641         if (msg->driver == NULL && msg->physdevpath == NULL && physdevdriver_key != NULL) {
642                 /* for older kernels DRIVER is empty for a bus device, export PHYSDEVDRIVER as DRIVER */
643                 msg->envp[i++] = &physdevdriver_key[7];
644                 msg->driver = &physdevdriver_key[14];
645         }
646
647         msg->envp[i] = NULL;
648
649         if (msg->devpath == NULL || msg->action == NULL) {
650                 info("DEVPATH or ACTION missing, ignore message\n");
651                 free(msg);
652                 return NULL;
653         }
654         return msg;
655 }
656
657 /* receive the udevd message from userspace */
658 static void get_ctrl_msg(void)
659 {
660         struct udevd_ctrl_msg ctrl_msg;
661         ssize_t size;
662         struct msghdr smsg;
663         struct cmsghdr *cmsg;
664         struct iovec iov;
665         struct ucred *cred;
666         char cred_msg[CMSG_SPACE(sizeof(struct ucred))];
667         int *intval;
668         char *pos;
669
670         memset(&ctrl_msg, 0x00, sizeof(struct udevd_ctrl_msg));
671         iov.iov_base = &ctrl_msg;
672         iov.iov_len = sizeof(struct udevd_ctrl_msg);
673
674         memset(&smsg, 0x00, sizeof(struct msghdr));
675         smsg.msg_iov = &iov;
676         smsg.msg_iovlen = 1;
677         smsg.msg_control = cred_msg;
678         smsg.msg_controllen = sizeof(cred_msg);
679
680         size = recvmsg(udevd_sock, &smsg, 0);
681         if (size <  0) {
682                 if (errno != EINTR)
683                         err("unable to receive user udevd message: %s\n", strerror(errno));
684                 return;
685         }
686         cmsg = CMSG_FIRSTHDR(&smsg);
687         cred = (struct ucred *) CMSG_DATA(cmsg);
688
689         if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) {
690                 err("no sender credentials received, message ignored\n");
691                 return;
692         }
693
694         if (cred->uid != 0) {
695                 err("sender uid=%i, message ignored\n", cred->uid);
696                 return;
697         }
698
699         if (strncmp(ctrl_msg.magic, UDEVD_CTRL_MAGIC, sizeof(UDEVD_CTRL_MAGIC)) != 0 ) {
700                 err("message magic '%s' doesn't match, ignore it\n", ctrl_msg.magic);
701                 return;
702         }
703
704         switch (ctrl_msg.type) {
705         case UDEVD_CTRL_ENV:
706                 pos = strchr(ctrl_msg.buf, '=');
707                 if (pos == NULL) {
708                         err("wrong key format '%s'\n", ctrl_msg.buf);
709                         break;
710                 }
711                 pos[0] = '\0';
712                 if (pos[1] == '\0') {
713                         info("udevd message (ENV) received, unset '%s'\n", ctrl_msg.buf);
714                         unsetenv(ctrl_msg.buf);
715                 } else {
716                         info("udevd message (ENV) received, set '%s=%s'\n", ctrl_msg.buf, &pos[1]);
717                         setenv(ctrl_msg.buf, &pos[1], 1);
718                 }
719                 break;
720         case UDEVD_CTRL_STOP_EXEC_QUEUE:
721                 info("udevd message (STOP_EXEC_QUEUE) received\n");
722                 stop_exec_q = 1;
723                 break;
724         case UDEVD_CTRL_START_EXEC_QUEUE:
725                 info("udevd message (START_EXEC_QUEUE) received\n");
726                 stop_exec_q = 0;
727                 msg_queue_manager();
728                 break;
729         case UDEVD_CTRL_SET_LOG_LEVEL:
730                 intval = (int *) ctrl_msg.buf;
731                 info("udevd message (SET_LOG_PRIORITY) received, udev_log_priority=%i\n", *intval);
732                 udev_log_priority = *intval;
733                 sprintf(udev_log, "UDEV_LOG=%i", udev_log_priority);
734                 putenv(udev_log);
735                 break;
736         case UDEVD_CTRL_SET_MAX_CHILDS:
737                 intval = (int *) ctrl_msg.buf;
738                 info("udevd message (UDEVD_SET_MAX_CHILDS) received, max_childs=%i\n", *intval);
739                 max_childs = *intval;
740                 break;
741         case UDEVD_CTRL_SET_MAX_CHILDS_RUNNING:
742                 intval = (int *) ctrl_msg.buf;
743                 info("udevd message (UDEVD_SET_MAX_CHILDS_RUNNING) received, max_childs=%i\n", *intval);
744                 max_childs_running = *intval;
745                 break;
746         case UDEVD_CTRL_RELOAD_RULES:
747                 info("udevd message (RELOAD_RULES) received\n");
748                 reload_config = 1;
749                 break;
750         default:
751                 err("unknown control message type\n");
752         }
753 }
754
755 /* receive the kernel user event message and do some sanity checks */
756 static struct udevd_uevent_msg *get_netlink_msg(void)
757 {
758         struct udevd_uevent_msg *msg;
759         int bufpos;
760         ssize_t size;
761         static char buffer[UEVENT_BUFFER_SIZE+512];
762         char *pos;
763
764         size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0);
765         if (size <  0) {
766                 if (errno != EINTR)
767                         err("unable to receive kernel netlink message: %s\n", strerror(errno));
768                 return NULL;
769         }
770
771         if ((size_t)size > sizeof(buffer)-1)
772                 size = sizeof(buffer)-1;
773         buffer[size] = '\0';
774         dbg("uevent_size=%zi\n", size);
775
776         /* start of event payload */
777         bufpos = strlen(buffer)+1;
778         msg = get_msg_from_envbuf(&buffer[bufpos], size-bufpos);
779         if (msg == NULL)
780                 return NULL;
781
782         /* validate message */
783         pos = strchr(buffer, '@');
784         if (pos == NULL) {
785                 err("invalid uevent '%s'\n", buffer);
786                 free(msg);
787                 return NULL;
788         }
789         pos[0] = '\0';
790
791         if (msg->action == NULL) {
792                 info("no ACTION in payload found, skip event '%s'\n", buffer);
793                 free(msg);
794                 return NULL;
795         }
796
797         if (strcmp(msg->action, buffer) != 0) {
798                 err("ACTION in payload does not match uevent, skip event '%s'\n", buffer);
799                 free(msg);
800                 return NULL;
801         }
802
803         return msg;
804 }
805
806 static void asmlinkage sig_handler(int signum)
807 {
808         switch (signum) {
809                 case SIGINT:
810                 case SIGTERM:
811                         udev_exit = 1;
812                         break;
813                 case SIGCHLD:
814                         /* set flag, then write to pipe if needed */
815                         sigchilds_waiting = 1;
816                         break;
817                 case SIGHUP:
818                         reload_config = 1;
819                         break;
820         }
821
822         /* write to pipe, which will wakeup select() in our mainloop */
823         write(signal_pipe[WRITE_END], "", 1);
824 }
825
826 static void udev_done(int pid, int exitstatus)
827 {
828         /* find msg associated with pid and delete it */
829         struct udevd_uevent_msg *msg;
830
831         list_for_each_entry(msg, &running_list, node) {
832                 if (msg->pid == pid) {
833                         info("seq %llu, pid [%d] exit with %i, %ld seconds old\n", msg->seqnum, msg->pid,
834                              exitstatus, time(NULL) - msg->queue_time);
835                         msg->exitstatus = exitstatus;
836                         msg_queue_delete(msg);
837
838                         /* there may be events waiting with the same devpath */
839                         run_exec_q = 1;
840                         return;
841                 }
842         }
843 }
844
845 static void reap_sigchilds(void)
846 {
847         pid_t pid;
848         int status;
849
850         while (1) {
851                 pid = waitpid(-1, &status, WNOHANG);
852                 if (pid <= 0)
853                         break;
854                 if (WIFEXITED(status))
855                         status = WEXITSTATUS(status);
856                 else if (WIFSIGNALED(status))
857                         status = WTERMSIG(status) + 128;
858                 else
859                         status = 0;
860                 udev_done(pid, status);
861         }
862 }
863
864 static int init_udevd_socket(void)
865 {
866         struct sockaddr_un saddr;
867         socklen_t addrlen;
868         const int feature_on = 1;
869         int retval;
870
871         memset(&saddr, 0x00, sizeof(saddr));
872         saddr.sun_family = AF_LOCAL;
873         /* use abstract namespace for socket path */
874         strcpy(&saddr.sun_path[1], UDEVD_CTRL_SOCK_PATH);
875         addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]);
876
877         udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
878         if (udevd_sock == -1) {
879                 err("error getting socket: %s\n", strerror(errno));
880                 return -1;
881         }
882
883         /* the bind takes care of ensuring only one copy running */
884         retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen);
885         if (retval < 0) {
886                 err("bind failed: %s\n", strerror(errno));
887                 close(udevd_sock);
888                 udevd_sock = -1;
889                 return -1;
890         }
891
892         /* enable receiving of the sender credentials */
893         setsockopt(udevd_sock, SOL_SOCKET, SO_PASSCRED, &feature_on, sizeof(feature_on));
894
895         return 0;
896 }
897
898 static int init_uevent_netlink_sock(void)
899 {
900         struct sockaddr_nl snl;
901         const int buffersize = 16 * 1024 * 1024;
902         int retval;
903
904         memset(&snl, 0x00, sizeof(struct sockaddr_nl));
905         snl.nl_family = AF_NETLINK;
906         snl.nl_pid = getpid();
907         snl.nl_groups = 1;
908
909         uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
910         if (uevent_netlink_sock == -1) {
911                 err("error getting socket: %s\n", strerror(errno));
912                 return -1;
913         }
914
915         /* set receive buffersize */
916         setsockopt(uevent_netlink_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
917
918         retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
919         if (retval < 0) {
920                 err("bind failed: %s\n", strerror(errno));
921                 close(uevent_netlink_sock);
922                 uevent_netlink_sock = -1;
923                 return -1;
924         }
925         return 0;
926 }
927
928 static void export_initial_seqnum(void)
929 {
930         char filename[PATH_SIZE];
931         int fd;
932         char seqnum[32];
933         ssize_t len = 0;
934
935         strlcpy(filename, sysfs_path, sizeof(filename));
936         strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename));
937         fd = open(filename, O_RDONLY);
938         if (fd >= 0) {
939                 len = read(fd, seqnum, sizeof(seqnum)-1);
940                 close(fd);
941         }
942         if (len <= 0) {
943                 strcpy(seqnum, "0\n");
944                 len = 3;
945         }
946         strlcpy(filename, udev_root, sizeof(filename));
947         strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
948         create_path(filename);
949         fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
950         if (fd >= 0) {
951                 write(fd, seqnum, len);
952                 close(fd);
953         }
954 }
955
956 int main(int argc, char *argv[], char *envp[])
957 {
958         int retval;
959         int fd;
960         struct sigaction act;
961         fd_set readfds;
962         const char *value;
963         int daemonize = 0;
964         int option;
965         static const struct option options[] = {
966                 { "daemon", 0, NULL, 'd' },
967                 { "debug-trace", 0, NULL, 't' },
968                 { "debug", 0, NULL, 'D' },
969                 { "help", 0, NULL, 'h' },
970                 { "version", 0, NULL, 'V' },
971                 {}
972         };
973         int rc = 1;
974         int maxfd;
975
976         logging_init("udevd");
977         udev_config_init();
978         selinux_init();
979         dbg("version %s\n", VERSION);
980
981         while (1) {
982                 option = getopt_long(argc, argv, "dDthV", options, NULL);
983                 if (option == -1)
984                         break;
985
986                 switch (option) {
987                 case 'd':
988                         daemonize = 1;
989                         break;
990                 case 't':
991                         debug_trace = 1;
992                         break;
993                 case 'D':
994                         debug = 1;
995                         if (udev_log_priority < LOG_INFO)
996                                 udev_log_priority = LOG_INFO;
997                         break;
998                 case 'h':
999                         printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--version]\n");
1000                         goto exit;
1001                 case 'V':
1002                         printf("%s\n", VERSION);
1003                         goto exit;
1004                 default:
1005                         goto exit;
1006                 }
1007         }
1008
1009         if (getuid() != 0) {
1010                 fprintf(stderr, "root privileges required\n");
1011                 err("root privileges required\n");
1012                 goto exit;
1013         }
1014
1015         /* make sure std{in,out,err} fd's are in a sane state */
1016         fd = open("/dev/null", O_RDWR);
1017         if (fd < 0) {
1018                 fprintf(stderr, "cannot open /dev/null\n");
1019                 err("cannot open /dev/null\n");
1020         }
1021         if (fd > STDIN_FILENO)
1022                 dup2(fd, STDIN_FILENO);
1023         if (write(STDOUT_FILENO, 0, 0) < 0)
1024                 dup2(fd, STDOUT_FILENO);
1025         if (write(STDERR_FILENO, 0, 0) < 0)
1026                 dup2(fd, STDERR_FILENO);
1027
1028         /* init sockets to receive events */
1029         if (init_udevd_socket() < 0) {
1030                 if (errno == EADDRINUSE) {
1031                         fprintf(stderr, "another udev daemon already running\n");
1032                         err("another udev daemon already running\n");
1033                         rc = 1;
1034                 } else {
1035                         fprintf(stderr, "error initializing udevd socket\n");
1036                         err("error initializing udevd socket\n");
1037                         rc = 2;
1038                 }
1039                 goto exit;
1040         }
1041
1042         if (init_uevent_netlink_sock() < 0) {
1043                 fprintf(stderr, "error initializing netlink socket\n");
1044                 err("error initializing netlink socket\n");
1045                 rc = 3;
1046                 goto exit;
1047         }
1048
1049         /* setup signal handler pipe */
1050         retval = pipe(signal_pipe);
1051         if (retval < 0) {
1052                 err("error getting pipes: %s\n", strerror(errno));
1053                 goto exit;
1054         }
1055
1056         retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
1057         if (retval < 0) {
1058                 err("error fcntl on read pipe: %s\n", strerror(errno));
1059                 goto exit;
1060         }
1061         retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
1062         if (retval < 0) {
1063                 err("error fcntl on read pipe: %s\n", strerror(errno));
1064                 goto exit;
1065         }
1066
1067         retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
1068         if (retval < 0) {
1069                 err("error fcntl on write pipe: %s\n", strerror(errno));
1070                 goto exit;
1071         }
1072         retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
1073         if (retval < 0) {
1074                 err("error fcntl on write pipe: %s\n", strerror(errno));
1075                 goto exit;
1076         }
1077
1078         /* parse the rules and keep them in memory */
1079         sysfs_init();
1080         udev_rules_init(&rules, 1);
1081
1082         export_initial_seqnum();
1083
1084         if (daemonize) {
1085                 pid_t pid;
1086
1087                 pid = fork();
1088                 switch (pid) {
1089                 case 0:
1090                         dbg("daemonized fork running\n");
1091                         break;
1092                 case -1:
1093                         err("fork of daemon failed: %s\n", strerror(errno));
1094                         rc = 4;
1095                         goto exit;
1096                 default:
1097                         dbg("child [%u] running, parent exits\n", pid);
1098                         rc = 0;
1099                         goto exit;
1100                 }
1101         }
1102
1103         /* redirect std{out,err} fd's */
1104         if (!debug)
1105                 dup2(fd, STDOUT_FILENO);
1106         dup2(fd, STDERR_FILENO);
1107         if (fd > STDERR_FILENO)
1108                 close(fd);
1109
1110         /* set scheduling priority for the daemon */
1111         setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
1112
1113         chdir("/");
1114         umask(022);
1115
1116         /* become session leader */
1117         sid = setsid();
1118         dbg("our session is %d\n", sid);
1119
1120         /* OOM_DISABLE == -17 */
1121         fd = open("/proc/self/oom_adj", O_RDWR);
1122         if (fd < 0)
1123                 err("error disabling OOM: %s\n", strerror(errno));
1124         else {
1125                 write(fd, "-17", 3);
1126                 close(fd);
1127         }
1128
1129         fd = open("/dev/kmsg", O_WRONLY);
1130         if (fd > 0) {
1131                 const char *str = "<6>udevd version " VERSION " started\n";
1132
1133                 write(fd, str, strlen(str));
1134                 close(fd);
1135         }
1136
1137         /* set signal handlers */
1138         memset(&act, 0x00, sizeof(struct sigaction));
1139         act.sa_handler = (void (*)(int)) sig_handler;
1140         sigemptyset(&act.sa_mask);
1141         act.sa_flags = SA_RESTART;
1142         sigaction(SIGINT, &act, NULL);
1143         sigaction(SIGTERM, &act, NULL);
1144         sigaction(SIGCHLD, &act, NULL);
1145         sigaction(SIGHUP, &act, NULL);
1146
1147         /* watch rules directory */
1148         inotify_fd = inotify_init();
1149         if (inotify_fd >= 0) {
1150                 if (udev_rules_dir[0] != '\0') {
1151                         inotify_add_watch(inotify_fd, udev_rules_dir,
1152                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
1153                 } else {
1154                         char filename[PATH_MAX];
1155
1156                         inotify_add_watch(inotify_fd, UDEV_PREFIX "/lib/udev/rules.d",
1157                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
1158                         inotify_add_watch(inotify_fd, SYSCONFDIR "/udev/rules.d",
1159                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
1160
1161                         /* watch dynamic rules directory */
1162                         strlcpy(filename, udev_root, sizeof(filename));
1163                         strlcat(filename, "/.udev/rules.d", sizeof(filename));
1164                         inotify_add_watch(inotify_fd, filename,
1165                                           IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
1166                 }
1167         } else if (errno == ENOSYS)
1168                 err("the kernel does not support inotify, udevd can't monitor rules file changes\n");
1169         else
1170                 err("inotify_init failed: %s\n", strerror(errno));
1171
1172         /* maximum limit of forked childs */
1173         value = getenv("UDEVD_MAX_CHILDS");
1174         if (value)
1175                 max_childs = strtoul(value, NULL, 10);
1176         else {
1177                 int memsize = mem_size_mb();
1178                 if (memsize > 0)
1179                         max_childs = 128 + (memsize / 4);
1180                 else
1181                         max_childs = UDEVD_MAX_CHILDS;
1182         }
1183         info("initialize max_childs to %u\n", max_childs);
1184
1185         /* start to throttle forking if maximum number of _running_ childs is reached */
1186         value = getenv("UDEVD_MAX_CHILDS_RUNNING");
1187         if (value)
1188                 max_childs_running = strtoull(value, NULL, 10);
1189         else {
1190                 int cpus = cpu_count();
1191                 if (cpus > 0)
1192                         max_childs_running = 8 + (8 * cpus);
1193                 else
1194                         max_childs_running = UDEVD_MAX_CHILDS_RUNNING;
1195         }
1196         info("initialize max_childs_running to %u\n", max_childs_running);
1197
1198         /* clear environment for forked event processes */
1199         clearenv();
1200
1201         /* export log_priority , as called programs may want to follow that setting */
1202         sprintf(udev_log, "UDEV_LOG=%i", udev_log_priority);
1203         putenv(udev_log);
1204         if (debug_trace)
1205                 putenv("DEBUG=1");
1206
1207         maxfd = udevd_sock;
1208         maxfd = UDEV_MAX(maxfd, uevent_netlink_sock);
1209         maxfd = UDEV_MAX(maxfd, signal_pipe[READ_END]);
1210         maxfd = UDEV_MAX(maxfd, inotify_fd);
1211
1212         while (!udev_exit) {
1213                 struct udevd_uevent_msg *msg;
1214                 int fdcount;
1215
1216                 FD_ZERO(&readfds);
1217                 FD_SET(signal_pipe[READ_END], &readfds);
1218                 FD_SET(udevd_sock, &readfds);
1219                 FD_SET(uevent_netlink_sock, &readfds);
1220                 if (inotify_fd >= 0)
1221                         FD_SET(inotify_fd, &readfds);
1222
1223                 fdcount = select(maxfd+1, &readfds, NULL, NULL, NULL);
1224                 if (fdcount < 0) {
1225                         if (errno != EINTR)
1226                                 err("error in select: %s\n", strerror(errno));
1227                         continue;
1228                 }
1229
1230                 /* get control message */
1231                 if (FD_ISSET(udevd_sock, &readfds))
1232                         get_ctrl_msg();
1233
1234                 /* get netlink message */
1235                 if (FD_ISSET(uevent_netlink_sock, &readfds)) {
1236                         msg = get_netlink_msg();
1237                         if (msg)
1238                                 msg_queue_insert(msg);
1239                 }
1240
1241                 /* received a signal, clear our notification pipe */
1242                 if (FD_ISSET(signal_pipe[READ_END], &readfds)) {
1243                         char buf[256];
1244
1245                         read(signal_pipe[READ_END], &buf, sizeof(buf));
1246                 }
1247
1248                 /* rules directory inotify watch */
1249                 if ((inotify_fd >= 0) && FD_ISSET(inotify_fd, &readfds)) {
1250                         int nbytes;
1251
1252                         /* discard all possible events, we can just reload the config */
1253                         if ((ioctl(inotify_fd, FIONREAD, &nbytes) == 0) && nbytes > 0) {
1254                                 char *buf;
1255
1256                                 reload_config = 1;
1257                                 buf = malloc(nbytes);
1258                                 if (buf == NULL) {
1259                                         err("error getting buffer for inotify, disable watching\n");
1260                                         close(inotify_fd);
1261                                         inotify_fd = -1;
1262                                 }
1263                                 read(inotify_fd, buf, nbytes);
1264                                 free(buf);
1265                         }
1266                 }
1267
1268                 /* rules changed, set by inotify or a HUP signal */
1269                 if (reload_config) {
1270                         reload_config = 0;
1271                         udev_rules_cleanup(&rules);
1272                         udev_rules_init(&rules, 1);
1273                 }
1274
1275                 /* forked child has returned */
1276                 if (sigchilds_waiting) {
1277                         sigchilds_waiting = 0;
1278                         reap_sigchilds();
1279                 }
1280
1281                 if (run_exec_q) {
1282                         run_exec_q = 0;
1283                         if (!stop_exec_q)
1284                                 msg_queue_manager();
1285                 }
1286         }
1287         rc = 0;
1288
1289 exit:
1290         udev_rules_cleanup(&rules);
1291         sysfs_cleanup();
1292         selinux_exit();
1293
1294         if (signal_pipe[READ_END] >= 0)
1295                 close(signal_pipe[READ_END]);
1296         if (signal_pipe[WRITE_END] >= 0)
1297                 close(signal_pipe[WRITE_END]);
1298
1299         if (udevd_sock >= 0)
1300                 close(udevd_sock);
1301         if (inotify_fd >= 0)
1302                 close(inotify_fd);
1303         if (uevent_netlink_sock >= 0)
1304                 close(uevent_netlink_sock);
1305
1306         logging_close();
1307
1308         return rc;
1309 }