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