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