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