]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/udev/udevd.c
Merge pull request #106 from teg/man-mac-random
[thirdparty/systemd.git] / src / udev / udevd.c
CommitLineData
7fafc032 1/*
1298001e 2 * Copyright (C) 2004-2012 Kay Sievers <kay@vrfy.org>
2f6cbd19 3 * Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
bb38678e
SJR
4 * Copyright (C) 2009 Canonical Ltd.
5 * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
7fafc032 6 *
55e9959b
KS
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 2 of the License, or
10 * (at your option) any later version.
7fafc032 11 *
55e9959b
KS
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
7fafc032 16 *
55e9959b
KS
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
7fafc032
KS
19 */
20
a695feae 21#include <stddef.h>
7fafc032
KS
22#include <signal.h>
23#include <unistd.h>
24#include <errno.h>
25#include <stdio.h>
26#include <stdlib.h>
c3804728 27#include <stdbool.h>
7fafc032 28#include <string.h>
085cce37 29#include <fcntl.h>
b52a01ee 30#include <getopt.h>
3ebdb81e 31#include <sys/file.h>
820fc48f 32#include <sys/time.h>
1e03b754
KS
33#include <sys/prctl.h>
34#include <sys/socket.h>
35#include <sys/signalfd.h>
ff2c503d 36#include <sys/epoll.h>
ede34445 37#include <sys/mount.h>
138068d6 38#include <sys/wait.h>
dc117daa 39#include <sys/stat.h>
c895fd00 40#include <sys/ioctl.h>
01618658 41#include <sys/inotify.h>
7fafc032 42
392ef7a2 43#include "sd-daemon.h"
693d371d 44#include "sd-event.h"
8314de1d
TG
45
46#include "signal-util.h"
693d371d 47#include "event-util.h"
d7b8eec7 48#include "rtnl-util.h"
194bbe33 49#include "cgroup-util.h"
4fa4d885 50#include "process-util.h"
5ba2dc25 51#include "dev-setup.h"
a5c32cff 52#include "fileio.h"
d7b8eec7
LP
53#include "selinux-util.h"
54#include "udev.h"
55#include "udev-util.h"
6482f626 56#include "formats-util.h"
a505965d 57#include "hashmap.h"
7fafc032 58
bba7a484
TG
59static bool arg_debug = false;
60static int arg_daemonize = false;
61static int arg_resolve_names = 1;
020328e1 62static unsigned arg_children_max;
bba7a484
TG
63static int arg_exec_delay;
64static usec_t arg_event_timeout_usec = 180 * USEC_PER_SEC;
65static usec_t arg_event_timeout_warn_usec = 180 * USEC_PER_SEC / 3;
c0c6806b
TG
66
67typedef struct Manager {
68 struct udev *udev;
693d371d 69 sd_event *event;
c0c6806b 70 Hashmap *workers;
ecb17862 71 struct udev_list_node events;
c26d1879 72 const char *cgroup;
cb49a4f2 73 pid_t pid; /* the process that originally allocated the manager object */
c0c6806b 74
ecb17862 75 struct udev_rules *rules;
c0c6806b
TG
76 struct udev_list properties;
77
78 struct udev_monitor *monitor;
79 struct udev_ctrl *ctrl;
80 struct udev_ctrl_connection *ctrl_conn_blocking;
e237d8cb 81 int fd_inotify;
e237d8cb
TG
82 int worker_watch[2];
83
693d371d
TG
84 sd_event_source *ctrl_event;
85 sd_event_source *uevent_event;
86 sd_event_source *inotify_event;
87
7c4c7e89
TG
88 usec_t last_usec;
89
c0c6806b 90 bool stop_exec_queue:1;
c0c6806b
TG
91 bool exit:1;
92} Manager;
1e03b754 93
1e03b754 94enum event_state {
912541b0
KS
95 EVENT_UNDEF,
96 EVENT_QUEUED,
97 EVENT_RUNNING,
1e03b754
KS
98};
99
100struct event {
912541b0 101 struct udev_list_node node;
cb49a4f2 102 Manager *manager;
912541b0
KS
103 struct udev *udev;
104 struct udev_device *dev;
6969c349 105 struct udev_device *dev_kernel;
c6aa11f2 106 struct worker *worker;
912541b0 107 enum event_state state;
912541b0
KS
108 unsigned long long int delaying_seqnum;
109 unsigned long long int seqnum;
110 const char *devpath;
111 size_t devpath_len;
112 const char *devpath_old;
113 dev_t devnum;
912541b0 114 int ifindex;
ea6039a3 115 bool is_block;
693d371d
TG
116 sd_event_source *timeout_warning;
117 sd_event_source *timeout;
1e03b754
KS
118};
119
9ec6e95b 120static inline struct event *node_to_event(struct udev_list_node *node) {
b27ee00b 121 return container_of(node, struct event, node);
1e03b754
KS
122}
123
ecb17862 124static void event_queue_cleanup(Manager *manager, enum event_state type);
ff2c503d 125
1e03b754 126enum worker_state {
912541b0
KS
127 WORKER_UNDEF,
128 WORKER_RUNNING,
129 WORKER_IDLE,
130 WORKER_KILLED,
1e03b754
KS
131};
132
133struct worker {
c0c6806b 134 Manager *manager;
912541b0 135 struct udev_list_node node;
912541b0
KS
136 int refcount;
137 pid_t pid;
138 struct udev_monitor *monitor;
139 enum worker_state state;
140 struct event *event;
1e03b754
KS
141};
142
143/* passed from worker to main process */
144struct worker_message {
1e03b754
KS
145};
146
c6aa11f2 147static void event_free(struct event *event) {
cb49a4f2
TG
148 int r;
149
c6aa11f2
TG
150 if (!event)
151 return;
152
912541b0 153 udev_list_node_remove(&event->node);
912541b0 154 udev_device_unref(event->dev);
6969c349 155 udev_device_unref(event->dev_kernel);
c6aa11f2 156
693d371d
TG
157 sd_event_source_unref(event->timeout_warning);
158 sd_event_source_unref(event->timeout);
159
c6aa11f2
TG
160 if (event->worker)
161 event->worker->event = NULL;
162
cb49a4f2
TG
163 assert(event->manager);
164
165 if (udev_list_node_is_empty(&event->manager->events)) {
166 /* only clean up the queue from the process that created it */
167 if (event->manager->pid == getpid()) {
168 r = unlink("/run/udev/queue");
169 if (r < 0)
170 log_warning_errno(errno, "could not unlink /run/udev/queue: %m");
171 }
172 }
173
912541b0 174 free(event);
aa8734ff 175}
7a770250 176
c6aa11f2
TG
177static void worker_free(struct worker *worker) {
178 if (!worker)
179 return;
bc113de9 180
c0c6806b
TG
181 assert(worker->manager);
182
183 hashmap_remove(worker->manager->workers, UINT_TO_PTR(worker->pid));
912541b0 184 udev_monitor_unref(worker->monitor);
c6aa11f2
TG
185 event_free(worker->event);
186
c6aa11f2 187 free(worker);
ff2c503d
KS
188}
189
c0c6806b 190static void manager_workers_free(Manager *manager) {
a505965d
TG
191 struct worker *worker;
192 Iterator i;
ff2c503d 193
c0c6806b
TG
194 assert(manager);
195
196 HASHMAP_FOREACH(worker, manager->workers, i)
c6aa11f2 197 worker_free(worker);
a505965d 198
c0c6806b 199 manager->workers = hashmap_free(manager->workers);
fc465079
KS
200}
201
c0c6806b 202static int worker_new(struct worker **ret, Manager *manager, struct udev_monitor *worker_monitor, pid_t pid) {
a505965d
TG
203 _cleanup_free_ struct worker *worker = NULL;
204 int r;
3a19b32a
TG
205
206 assert(ret);
c0c6806b 207 assert(manager);
3a19b32a
TG
208 assert(worker_monitor);
209 assert(pid > 1);
210
211 worker = new0(struct worker, 1);
212 if (!worker)
213 return -ENOMEM;
214
39c19cf1 215 worker->refcount = 1;
c0c6806b 216 worker->manager = manager;
3a19b32a
TG
217 /* close monitor, but keep address around */
218 udev_monitor_disconnect(worker_monitor);
219 worker->monitor = udev_monitor_ref(worker_monitor);
220 worker->pid = pid;
a505965d 221
c0c6806b 222 r = hashmap_ensure_allocated(&manager->workers, NULL);
a505965d
TG
223 if (r < 0)
224 return r;
225
c0c6806b 226 r = hashmap_put(manager->workers, UINT_TO_PTR(pid), worker);
a505965d
TG
227 if (r < 0)
228 return r;
229
3a19b32a 230 *ret = worker;
a505965d 231 worker = NULL;
3a19b32a
TG
232
233 return 0;
234}
235
4fa4d885
TG
236static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
237 struct event *event = userdata;
238
239 assert(event);
240 assert(event->worker);
241
242 kill_and_sigcont(event->worker->pid, SIGKILL);
243 event->worker->state = WORKER_KILLED;
244
245 log_error("seq %llu '%s' killed", udev_device_get_seqnum(event->dev), event->devpath);
246
247 return 1;
248}
249
250static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
251 struct event *event = userdata;
252
253 assert(event);
254
255 log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event->dev), event->devpath);
256
257 return 1;
258}
259
39c19cf1 260static void worker_attach_event(struct worker *worker, struct event *event) {
693d371d
TG
261 sd_event *e;
262 uint64_t usec;
263 int r;
264
c6aa11f2 265 assert(worker);
693d371d 266 assert(worker->manager);
c6aa11f2
TG
267 assert(event);
268 assert(!event->worker);
269 assert(!worker->event);
270
39c19cf1 271 worker->state = WORKER_RUNNING;
39c19cf1
TG
272 worker->event = event;
273 event->state = EVENT_RUNNING;
c6aa11f2 274 event->worker = worker;
693d371d
TG
275
276 e = worker->manager->event;
277
278 r = sd_event_now(e, clock_boottime_or_monotonic(), &usec);
279 if (r < 0)
280 return;
281
282 (void) sd_event_add_time(e, &event->timeout_warning, clock_boottime_or_monotonic(),
283 usec + arg_event_timeout_warn_usec, USEC_PER_SEC, on_event_timeout_warning, event);
284
285 (void) sd_event_add_time(e, &event->timeout, clock_boottime_or_monotonic(),
286 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
39c19cf1
TG
287}
288
e237d8cb
TG
289static void manager_free(Manager *manager) {
290 if (!manager)
291 return;
292
b2d21d93
TG
293 udev_builtin_exit(manager->udev);
294
693d371d
TG
295 sd_event_source_unref(manager->ctrl_event);
296 sd_event_source_unref(manager->uevent_event);
297 sd_event_source_unref(manager->inotify_event);
298
e237d8cb 299 udev_unref(manager->udev);
693d371d 300 sd_event_unref(manager->event);
e237d8cb
TG
301 manager_workers_free(manager);
302 event_queue_cleanup(manager, EVENT_UNDEF);
303
304 udev_monitor_unref(manager->monitor);
305 udev_ctrl_unref(manager->ctrl);
306 udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
307
308 udev_list_cleanup(&manager->properties);
309 udev_rules_unref(manager->rules);
e237d8cb 310
e237d8cb
TG
311 safe_close(manager->fd_inotify);
312 safe_close_pair(manager->worker_watch);
313
314 free(manager);
315}
316
317DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
318
9a73bd7c
TG
319static int worker_send_message(int fd) {
320 struct worker_message message = {};
321
322 return loop_write(fd, &message, sizeof(message), false);
323}
324
c0c6806b 325static void worker_spawn(Manager *manager, struct event *event) {
912541b0 326 struct udev *udev = event->udev;
3a19b32a 327 _cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
912541b0
KS
328 pid_t pid;
329
330 /* listen for new events */
331 worker_monitor = udev_monitor_new_from_netlink(udev, NULL);
332 if (worker_monitor == NULL)
333 return;
334 /* allow the main daemon netlink address to send devices to the worker */
c0c6806b 335 udev_monitor_allow_unicast_sender(worker_monitor, manager->monitor);
912541b0
KS
336 udev_monitor_enable_receiving(worker_monitor);
337
912541b0
KS
338 pid = fork();
339 switch (pid) {
340 case 0: {
341 struct udev_device *dev = NULL;
2dd9f98d 342 _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
912541b0 343 int fd_monitor;
e237d8cb 344 _cleanup_close_ int fd_signal = -1, fd_ep = -1;
2dd9f98d
TG
345 struct epoll_event ep_signal = { .events = EPOLLIN };
346 struct epoll_event ep_monitor = { .events = EPOLLIN };
912541b0 347 sigset_t mask;
6af5e6a4 348 int r = 0;
912541b0 349
43095991 350 /* take initial device from queue */
912541b0
KS
351 dev = event->dev;
352 event->dev = NULL;
353
39fd2ca1
TG
354 unsetenv("NOTIFY_SOCKET");
355
c0c6806b 356 manager_workers_free(manager);
ecb17862 357 event_queue_cleanup(manager, EVENT_UNDEF);
6d1b1e0b 358
e237d8cb 359 manager->monitor = udev_monitor_unref(manager->monitor);
6d1b1e0b 360 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
e237d8cb 361 manager->ctrl = udev_ctrl_unref(manager->ctrl);
693d371d 362 manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
e237d8cb 363 manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
912541b0 364
693d371d
TG
365 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
366 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
367 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
368
369 manager->event = sd_event_unref(manager->event);
370
912541b0
KS
371 sigfillset(&mask);
372 fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
373 if (fd_signal < 0) {
6af5e6a4 374 r = log_error_errno(errno, "error creating signalfd %m");
912541b0
KS
375 goto out;
376 }
2dd9f98d
TG
377 ep_signal.data.fd = fd_signal;
378
379 fd_monitor = udev_monitor_get_fd(worker_monitor);
380 ep_monitor.data.fd = fd_monitor;
912541b0
KS
381
382 fd_ep = epoll_create1(EPOLL_CLOEXEC);
383 if (fd_ep < 0) {
6af5e6a4 384 r = log_error_errno(errno, "error creating epoll fd: %m");
912541b0
KS
385 goto out;
386 }
387
912541b0
KS
388 if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
389 epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) {
6af5e6a4 390 r = log_error_errno(errno, "fail to add fds to epoll: %m");
912541b0
KS
391 goto out;
392 }
393
394 /* request TERM signal if parent exits */
395 prctl(PR_SET_PDEATHSIG, SIGTERM);
396
145dae7e 397 /* reset OOM score, we only protect the main daemon */
574d5f2d 398 write_string_file("/proc/self/oom_score_adj", "0");
145dae7e 399
912541b0
KS
400 for (;;) {
401 struct udev_event *udev_event;
6af5e6a4 402 int fd_lock = -1;
912541b0 403
3b64e4d4
TG
404 assert(dev);
405
9f6445e3 406 log_debug("seq %llu running", udev_device_get_seqnum(dev));
912541b0
KS
407 udev_event = udev_event_new(dev);
408 if (udev_event == NULL) {
6af5e6a4 409 r = -ENOMEM;
912541b0
KS
410 goto out;
411 }
412
bba7a484
TG
413 if (arg_exec_delay > 0)
414 udev_event->exec_delay = arg_exec_delay;
912541b0 415
3ebdb81e 416 /*
2e5b17d0 417 * Take a shared lock on the device node; this establishes
3ebdb81e 418 * a concept of device "ownership" to serialize device
2e5b17d0 419 * access. External processes holding an exclusive lock will
3ebdb81e 420 * cause udev to skip the event handling; in the case udev
2e5b17d0 421 * acquired the lock, the external process can block until
3ebdb81e
KS
422 * udev has finished its event handling.
423 */
2e5b17d0
KS
424 if (!streq_ptr(udev_device_get_action(dev), "remove") &&
425 streq_ptr("block", udev_device_get_subsystem(dev)) &&
426 !startswith(udev_device_get_sysname(dev), "dm-") &&
427 !startswith(udev_device_get_sysname(dev), "md")) {
3ebdb81e
KS
428 struct udev_device *d = dev;
429
430 if (streq_ptr("partition", udev_device_get_devtype(d)))
431 d = udev_device_get_parent(d);
432
433 if (d) {
434 fd_lock = open(udev_device_get_devnode(d), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
435 if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
56f64d95 436 log_debug_errno(errno, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
3d06f418 437 fd_lock = safe_close(fd_lock);
6af5e6a4 438 r = -EAGAIN;
3ebdb81e
KS
439 goto skip;
440 }
441 }
442 }
443
4c83d994
TG
444 /* needed for renaming netifs */
445 udev_event->rtnl = rtnl;
446
912541b0 447 /* apply rules, create node, symlinks */
adeba500
KS
448 udev_event_execute_rules(udev_event,
449 arg_event_timeout_usec, arg_event_timeout_warn_usec,
c0c6806b 450 &manager->properties,
8314de1d 451 manager->rules);
adeba500
KS
452
453 udev_event_execute_run(udev_event,
8314de1d 454 arg_event_timeout_usec, arg_event_timeout_warn_usec);
912541b0 455
523c620b
TG
456 if (udev_event->rtnl)
457 /* in case rtnl was initialized */
458 rtnl = sd_rtnl_ref(udev_event->rtnl);
4c83d994 459
912541b0 460 /* apply/restore inotify watch */
bf9bead1 461 if (udev_event->inotify_watch) {
912541b0
KS
462 udev_watch_begin(udev, dev);
463 udev_device_update_db(dev);
464 }
465
3d06f418 466 safe_close(fd_lock);
3ebdb81e 467
912541b0
KS
468 /* send processed event back to libudev listeners */
469 udev_monitor_send_device(worker_monitor, NULL, dev);
470
3ebdb81e 471skip:
4914cb2d 472 log_debug("seq %llu processed", udev_device_get_seqnum(dev));
b66f29a1 473
912541b0 474 /* send udevd the result of the event execution */
e237d8cb 475 r = worker_send_message(manager->worker_watch[WRITE_END]);
b66f29a1 476 if (r < 0)
9a73bd7c 477 log_error_errno(r, "failed to send result of seq %llu to main daemon: %m",
b66f29a1 478 udev_device_get_seqnum(dev));
912541b0
KS
479
480 udev_device_unref(dev);
481 dev = NULL;
482
73814ca2 483 udev_event_unref(udev_event);
47e737dc 484
912541b0
KS
485 /* wait for more device messages from main udevd, or term signal */
486 while (dev == NULL) {
487 struct epoll_event ev[4];
488 int fdcount;
489 int i;
490
8fef0ff2 491 fdcount = epoll_wait(fd_ep, ev, ELEMENTSOF(ev), -1);
912541b0
KS
492 if (fdcount < 0) {
493 if (errno == EINTR)
494 continue;
6af5e6a4 495 r = log_error_errno(errno, "failed to poll: %m");
912541b0
KS
496 goto out;
497 }
498
499 for (i = 0; i < fdcount; i++) {
500 if (ev[i].data.fd == fd_monitor && ev[i].events & EPOLLIN) {
501 dev = udev_monitor_receive_device(worker_monitor);
502 break;
503 } else if (ev[i].data.fd == fd_signal && ev[i].events & EPOLLIN) {
504 struct signalfd_siginfo fdsi;
505 ssize_t size;
506
507 size = read(fd_signal, &fdsi, sizeof(struct signalfd_siginfo));
508 if (size != sizeof(struct signalfd_siginfo))
509 continue;
510 switch (fdsi.ssi_signo) {
511 case SIGTERM:
512 goto out;
513 }
514 }
515 }
516 }
517 }
82063a88 518out:
912541b0 519 udev_device_unref(dev);
e237d8cb 520 manager_free(manager);
baa30fbc 521 log_close();
8b46c3fc 522 _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
912541b0
KS
523 }
524 case -1:
912541b0 525 event->state = EVENT_QUEUED;
56f64d95 526 log_error_errno(errno, "fork of child failed: %m");
912541b0
KS
527 break;
528 default:
e03c7cc2
TG
529 {
530 struct worker *worker;
3a19b32a 531 int r;
e03c7cc2 532
c0c6806b 533 r = worker_new(&worker, manager, worker_monitor, pid);
3a19b32a 534 if (r < 0)
e03c7cc2 535 return;
e03c7cc2 536
39c19cf1
TG
537 worker_attach_event(worker, event);
538
1fa2f38f 539 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
912541b0
KS
540 break;
541 }
e03c7cc2 542 }
7fafc032
KS
543}
544
c0c6806b 545static void event_run(Manager *manager, struct event *event) {
a505965d
TG
546 struct worker *worker;
547 Iterator i;
912541b0 548
c0c6806b
TG
549 assert(manager);
550 assert(event);
551
552 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
553 ssize_t count;
554
555 if (worker->state != WORKER_IDLE)
556 continue;
557
c0c6806b 558 count = udev_monitor_send_device(manager->monitor, worker->monitor, event->dev);
912541b0 559 if (count < 0) {
1fa2f38f
ZJS
560 log_error_errno(errno, "worker ["PID_FMT"] did not accept message %zi (%m), kill it",
561 worker->pid, count);
912541b0
KS
562 kill(worker->pid, SIGKILL);
563 worker->state = WORKER_KILLED;
564 continue;
565 }
39c19cf1 566 worker_attach_event(worker, event);
912541b0
KS
567 return;
568 }
569
c0c6806b 570 if (hashmap_size(manager->workers) >= arg_children_max) {
bba7a484 571 if (arg_children_max > 1)
c0c6806b 572 log_debug("maximum number (%i) of children reached", hashmap_size(manager->workers));
912541b0
KS
573 return;
574 }
575
576 /* start new worker and pass initial device */
c0c6806b 577 worker_spawn(manager, event);
1e03b754
KS
578}
579
ecb17862 580static int event_queue_insert(Manager *manager, struct udev_device *dev) {
912541b0 581 struct event *event;
cb49a4f2 582 int r;
912541b0 583
ecb17862
TG
584 assert(manager);
585 assert(dev);
586
040e6896
TG
587 /* only one process can add events to the queue */
588 if (manager->pid == 0)
589 manager->pid = getpid();
590
cb49a4f2
TG
591 assert(manager->pid == getpid());
592
955d98c9 593 event = new0(struct event, 1);
cb49a4f2
TG
594 if (!event)
595 return -ENOMEM;
912541b0
KS
596
597 event->udev = udev_device_get_udev(dev);
cb49a4f2 598 event->manager = manager;
912541b0 599 event->dev = dev;
6969c349
TG
600 event->dev_kernel = udev_device_shallow_clone(dev);
601 udev_device_copy_properties(event->dev_kernel, dev);
912541b0
KS
602 event->seqnum = udev_device_get_seqnum(dev);
603 event->devpath = udev_device_get_devpath(dev);
604 event->devpath_len = strlen(event->devpath);
605 event->devpath_old = udev_device_get_devpath_old(dev);
606 event->devnum = udev_device_get_devnum(dev);
ea6039a3 607 event->is_block = streq("block", udev_device_get_subsystem(dev));
912541b0
KS
608 event->ifindex = udev_device_get_ifindex(dev);
609
9f6445e3 610 log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev),
912541b0
KS
611 udev_device_get_action(dev), udev_device_get_subsystem(dev));
612
613 event->state = EVENT_QUEUED;
cb49a4f2
TG
614
615 if (udev_list_node_is_empty(&manager->events)) {
616 r = touch("/run/udev/queue");
617 if (r < 0)
618 log_warning_errno(r, "could not touch /run/udev/queue: %m");
619 }
620
ecb17862 621 udev_list_node_append(&event->node, &manager->events);
cb49a4f2 622
912541b0 623 return 0;
fc465079
KS
624}
625
c0c6806b 626static void manager_kill_workers(Manager *manager) {
a505965d
TG
627 struct worker *worker;
628 Iterator i;
1e03b754 629
c0c6806b
TG
630 assert(manager);
631
632 HASHMAP_FOREACH(worker, manager->workers, i) {
912541b0
KS
633 if (worker->state == WORKER_KILLED)
634 continue;
1e03b754 635
912541b0
KS
636 worker->state = WORKER_KILLED;
637 kill(worker->pid, SIGTERM);
638 }
1e03b754
KS
639}
640
e3196993 641/* lookup event for identical, parent, child device */
ecb17862 642static bool is_devpath_busy(Manager *manager, struct event *event) {
912541b0
KS
643 struct udev_list_node *loop;
644 size_t common;
645
646 /* check if queue contains events we depend on */
ecb17862 647 udev_list_node_foreach(loop, &manager->events) {
912541b0
KS
648 struct event *loop_event = node_to_event(loop);
649
650 /* we already found a later event, earlier can not block us, no need to check again */
651 if (loop_event->seqnum < event->delaying_seqnum)
652 continue;
653
654 /* event we checked earlier still exists, no need to check again */
655 if (loop_event->seqnum == event->delaying_seqnum)
656 return true;
657
658 /* found ourself, no later event can block us */
659 if (loop_event->seqnum >= event->seqnum)
660 break;
661
662 /* check major/minor */
663 if (major(event->devnum) != 0 && event->devnum == loop_event->devnum && event->is_block == loop_event->is_block)
664 return true;
665
666 /* check network device ifindex */
667 if (event->ifindex != 0 && event->ifindex == loop_event->ifindex)
668 return true;
669
670 /* check our old name */
090be865 671 if (event->devpath_old != NULL && streq(loop_event->devpath, event->devpath_old)) {
912541b0
KS
672 event->delaying_seqnum = loop_event->seqnum;
673 return true;
674 }
675
676 /* compare devpath */
677 common = MIN(loop_event->devpath_len, event->devpath_len);
678
679 /* one devpath is contained in the other? */
680 if (memcmp(loop_event->devpath, event->devpath, common) != 0)
681 continue;
682
683 /* identical device event found */
684 if (loop_event->devpath_len == event->devpath_len) {
685 /* devices names might have changed/swapped in the meantime */
686 if (major(event->devnum) != 0 && (event->devnum != loop_event->devnum || event->is_block != loop_event->is_block))
687 continue;
688 if (event->ifindex != 0 && event->ifindex != loop_event->ifindex)
689 continue;
690 event->delaying_seqnum = loop_event->seqnum;
691 return true;
692 }
693
694 /* parent device event found */
695 if (event->devpath[common] == '/') {
696 event->delaying_seqnum = loop_event->seqnum;
697 return true;
698 }
699
700 /* child device event found */
701 if (loop_event->devpath[common] == '/') {
702 event->delaying_seqnum = loop_event->seqnum;
703 return true;
704 }
705
706 /* no matching device */
707 continue;
708 }
709
710 return false;
7fafc032
KS
711}
712
693d371d
TG
713static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
714 Manager *manager = userdata;
715
716 assert(manager);
717
718 log_error_errno(ETIMEDOUT, "giving up waiting for workers to finish");
719
720 sd_event_exit(manager->event, -ETIMEDOUT);
721
722 return 1;
723}
724
62d43dac 725static void manager_exit(Manager *manager) {
693d371d
TG
726 uint64_t usec;
727 int r;
62d43dac
TG
728
729 assert(manager);
730
731 manager->exit = true;
732
b79aacbf
TG
733 sd_notify(false,
734 "STOPPING=1\n"
735 "STATUS=Starting shutdown...");
736
62d43dac 737 /* close sources of new events and discard buffered events */
693d371d
TG
738 manager->ctrl = udev_ctrl_unref(manager->ctrl);
739 manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
62d43dac 740
693d371d
TG
741 manager->fd_inotify = safe_close(manager->fd_inotify);
742 manager->inotify_event = sd_event_source_unref(manager->inotify_event);
62d43dac 743
693d371d
TG
744 manager->monitor = udev_monitor_unref(manager->monitor);
745 manager->uevent_event = sd_event_source_unref(manager->uevent_event);
62d43dac
TG
746
747 /* discard queued events and kill workers */
748 event_queue_cleanup(manager, EVENT_QUEUED);
749 manager_kill_workers(manager);
693d371d
TG
750
751 r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
752 if (r < 0)
753 return;
754
755 r = sd_event_add_time(manager->event, NULL, clock_boottime_or_monotonic(),
756 usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
757 if (r < 0)
758 return;
62d43dac
TG
759}
760
761/* reload requested, HUP signal received, rules changed, builtin changed */
762static void manager_reload(Manager *manager) {
763
764 assert(manager);
765
b79aacbf
TG
766 sd_notify(false,
767 "RELOADING=1\n"
768 "STATUS=Flushing configuration...");
769
62d43dac
TG
770 manager_kill_workers(manager);
771 manager->rules = udev_rules_unref(manager->rules);
772 udev_builtin_exit(manager->udev);
b79aacbf
TG
773
774 sd_notify(false,
775 "READY=1\n"
776 "STATUS=Processing...");
62d43dac
TG
777}
778
c0c6806b 779static void event_queue_start(Manager *manager) {
912541b0 780 struct udev_list_node *loop;
693d371d
TG
781 usec_t usec;
782 int r;
8ab44e3f 783
c0c6806b
TG
784 assert(manager);
785
7c4c7e89
TG
786 if (udev_list_node_is_empty(&manager->events) ||
787 manager->exit || manager->stop_exec_queue)
788 return;
789
693d371d
TG
790 r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
791 if (r >= 0) {
792 /* check for changed config, every 3 seconds at most */
793 if (manager->last_usec == 0 ||
794 (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
795 if (udev_rules_check_timestamp(manager->rules) ||
796 udev_builtin_validate(manager->udev))
797 manager_reload(manager);
798
799 manager->last_usec = usec;
800 }
7c4c7e89
TG
801 }
802
803 udev_builtin_init(manager->udev);
804
805 if (!manager->rules) {
806 manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
807 if (!manager->rules)
808 return;
809 }
810
ecb17862 811 udev_list_node_foreach(loop, &manager->events) {
912541b0 812 struct event *event = node_to_event(loop);
0bc74ea7 813
912541b0
KS
814 if (event->state != EVENT_QUEUED)
815 continue;
0bc74ea7 816
912541b0 817 /* do not start event if parent or child event is still running */
ecb17862 818 if (is_devpath_busy(manager, event))
912541b0 819 continue;
fc465079 820
c0c6806b 821 event_run(manager, event);
912541b0 822 }
1e03b754
KS
823}
824
ecb17862 825static void event_queue_cleanup(Manager *manager, enum event_state match_type) {
912541b0 826 struct udev_list_node *loop, *tmp;
ff2c503d 827
ecb17862 828 udev_list_node_foreach_safe(loop, tmp, &manager->events) {
912541b0 829 struct event *event = node_to_event(loop);
ff2c503d 830
912541b0
KS
831 if (match_type != EVENT_UNDEF && match_type != event->state)
832 continue;
ff2c503d 833
c6aa11f2 834 event_free(event);
912541b0 835 }
ff2c503d
KS
836}
837
e82e8fa5 838static int on_worker(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b
TG
839 Manager *manager = userdata;
840
841 assert(manager);
842
912541b0
KS
843 for (;;) {
844 struct worker_message msg;
979558f3
TG
845 struct iovec iovec = {
846 .iov_base = &msg,
847 .iov_len = sizeof(msg),
848 };
849 union {
850 struct cmsghdr cmsghdr;
851 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
852 } control = {};
853 struct msghdr msghdr = {
854 .msg_iov = &iovec,
855 .msg_iovlen = 1,
856 .msg_control = &control,
857 .msg_controllen = sizeof(control),
858 };
859 struct cmsghdr *cmsg;
912541b0 860 ssize_t size;
979558f3 861 struct ucred *ucred = NULL;
a505965d 862 struct worker *worker;
912541b0 863
e82e8fa5 864 size = recvmsg(fd, &msghdr, MSG_DONTWAIT);
979558f3 865 if (size < 0) {
738a7907
TG
866 if (errno == EINTR)
867 continue;
868 else if (errno == EAGAIN)
869 /* nothing more to read */
870 break;
979558f3 871
e82e8fa5 872 return log_error_errno(errno, "failed to receive message: %m");
979558f3
TG
873 } else if (size != sizeof(struct worker_message)) {
874 log_warning_errno(EIO, "ignoring worker message with invalid size %zi bytes", size);
e82e8fa5 875 continue;
979558f3
TG
876 }
877
878 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
879 if (cmsg->cmsg_level == SOL_SOCKET &&
880 cmsg->cmsg_type == SCM_CREDENTIALS &&
881 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
882 ucred = (struct ucred*) CMSG_DATA(cmsg);
883 }
884
885 if (!ucred || ucred->pid <= 0) {
886 log_warning_errno(EIO, "ignoring worker message without valid PID");
887 continue;
888 }
912541b0
KS
889
890 /* lookup worker who sent the signal */
c0c6806b 891 worker = hashmap_get(manager->workers, UINT_TO_PTR(ucred->pid));
a505965d
TG
892 if (!worker) {
893 log_debug("worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
894 continue;
912541b0 895 }
c0bbfd72 896
a505965d
TG
897 if (worker->state != WORKER_KILLED)
898 worker->state = WORKER_IDLE;
899
900 /* worker returned */
901 event_free(worker->event);
912541b0 902 }
e82e8fa5 903
8302fe5a
TG
904 /* we have free workers, try to schedule events */
905 event_queue_start(manager);
906
e82e8fa5
TG
907 return 1;
908}
909
910static int on_uevent(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 911 Manager *manager = userdata;
e82e8fa5
TG
912 struct udev_device *dev;
913 int r;
914
c0c6806b 915 assert(manager);
e82e8fa5 916
c0c6806b 917 dev = udev_monitor_receive_device(manager->monitor);
e82e8fa5
TG
918 if (dev) {
919 udev_device_ensure_usec_initialized(dev, NULL);
ecb17862 920 r = event_queue_insert(manager, dev);
e82e8fa5
TG
921 if (r < 0)
922 udev_device_unref(dev);
8302fe5a
TG
923 else
924 /* we have fresh events, try to schedule them */
925 event_queue_start(manager);
e82e8fa5
TG
926 }
927
928 return 1;
88f4b648
KS
929}
930
3b47c739 931/* receive the udevd message from userspace */
e82e8fa5 932static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 933 Manager *manager = userdata;
e4f66b77
TG
934 _cleanup_udev_ctrl_connection_unref_ struct udev_ctrl_connection *ctrl_conn = NULL;
935 _cleanup_udev_ctrl_msg_unref_ struct udev_ctrl_msg *ctrl_msg = NULL;
912541b0
KS
936 const char *str;
937 int i;
938
c0c6806b 939 assert(manager);
e4f66b77 940
c0c6806b 941 ctrl_conn = udev_ctrl_get_connection(manager->ctrl);
e4f66b77 942 if (!ctrl_conn)
e82e8fa5 943 return 1;
912541b0
KS
944
945 ctrl_msg = udev_ctrl_receive_msg(ctrl_conn);
e4f66b77 946 if (!ctrl_msg)
e82e8fa5 947 return 1;
912541b0
KS
948
949 i = udev_ctrl_get_set_log_level(ctrl_msg);
950 if (i >= 0) {
ed14edc0 951 log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i);
baa30fbc 952 log_set_max_level(i);
c0c6806b 953 manager_kill_workers(manager);
912541b0
KS
954 }
955
956 if (udev_ctrl_get_stop_exec_queue(ctrl_msg) > 0) {
9f6445e3 957 log_debug("udevd message (STOP_EXEC_QUEUE) received");
c0c6806b 958 manager->stop_exec_queue = true;
912541b0
KS
959 }
960
961 if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
9f6445e3 962 log_debug("udevd message (START_EXEC_QUEUE) received");
c0c6806b 963 manager->stop_exec_queue = false;
8302fe5a 964 event_queue_start(manager);
912541b0
KS
965 }
966
967 if (udev_ctrl_get_reload(ctrl_msg) > 0) {
9f6445e3 968 log_debug("udevd message (RELOAD) received");
62d43dac 969 manager_reload(manager);
912541b0
KS
970 }
971
972 str = udev_ctrl_get_set_env(ctrl_msg);
973 if (str != NULL) {
c0c6806b 974 _cleanup_free_ char *key = NULL;
912541b0
KS
975
976 key = strdup(str);
c0c6806b 977 if (key) {
912541b0
KS
978 char *val;
979
980 val = strchr(key, '=');
981 if (val != NULL) {
982 val[0] = '\0';
983 val = &val[1];
984 if (val[0] == '\0') {
9f6445e3 985 log_debug("udevd message (ENV) received, unset '%s'", key);
c0c6806b 986 udev_list_entry_add(&manager->properties, key, NULL);
912541b0 987 } else {
9f6445e3 988 log_debug("udevd message (ENV) received, set '%s=%s'", key, val);
c0c6806b 989 udev_list_entry_add(&manager->properties, key, val);
912541b0 990 }
c0c6806b 991 } else
9f6445e3 992 log_error("wrong key format '%s'", key);
912541b0 993 }
c0c6806b 994 manager_kill_workers(manager);
912541b0
KS
995 }
996
997 i = udev_ctrl_get_set_children_max(ctrl_msg);
998 if (i >= 0) {
9f6445e3 999 log_debug("udevd message (SET_MAX_CHILDREN) received, children_max=%i", i);
bba7a484 1000 arg_children_max = i;
912541b0
KS
1001 }
1002
cb49a4f2 1003 if (udev_ctrl_get_ping(ctrl_msg) > 0)
9f6445e3 1004 log_debug("udevd message (SYNC) received");
912541b0
KS
1005
1006 if (udev_ctrl_get_exit(ctrl_msg) > 0) {
9f6445e3 1007 log_debug("udevd message (EXIT) received");
62d43dac 1008 manager_exit(manager);
c0c6806b
TG
1009 /* keep reference to block the client until we exit
1010 TODO: deal with several blocking exit requests */
1011 manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
912541b0 1012 }
e4f66b77 1013
e82e8fa5 1014 return 1;
88f4b648 1015}
4a231017 1016
f3a740a5 1017static int synthesize_change(struct udev_device *dev) {
edd32000 1018 char filename[UTIL_PATH_SIZE];
f3a740a5 1019 int r;
edd32000 1020
f3a740a5 1021 if (streq_ptr("block", udev_device_get_subsystem(dev)) &&
ede34445 1022 streq_ptr("disk", udev_device_get_devtype(dev)) &&
638ca89c 1023 !startswith(udev_device_get_sysname(dev), "dm-")) {
e9fc29f4
KS
1024 bool part_table_read = false;
1025 bool has_partitions = false;
ede34445 1026 int fd;
f3a740a5
KS
1027 struct udev *udev = udev_device_get_udev(dev);
1028 _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
1029 struct udev_list_entry *item;
1030
ede34445 1031 /*
e9fc29f4
KS
1032 * Try to re-read the partition table. This only succeeds if
1033 * none of the devices is busy. The kernel returns 0 if no
1034 * partition table is found, and we will not get an event for
1035 * the disk.
ede34445 1036 */
02ba8fb3 1037 fd = open(udev_device_get_devnode(dev), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
ede34445 1038 if (fd >= 0) {
02ba8fb3
KS
1039 r = flock(fd, LOCK_EX|LOCK_NB);
1040 if (r >= 0)
1041 r = ioctl(fd, BLKRRPART, 0);
1042
ede34445
KS
1043 close(fd);
1044 if (r >= 0)
e9fc29f4 1045 part_table_read = true;
ede34445
KS
1046 }
1047
e9fc29f4 1048 /* search for partitions */
f3a740a5
KS
1049 e = udev_enumerate_new(udev);
1050 if (!e)
1051 return -ENOMEM;
1052
1053 r = udev_enumerate_add_match_parent(e, dev);
1054 if (r < 0)
1055 return r;
1056
1057 r = udev_enumerate_add_match_subsystem(e, "block");
1058 if (r < 0)
1059 return r;
1060
1061 r = udev_enumerate_scan_devices(e);
47a3fa0f
TA
1062 if (r < 0)
1063 return r;
e9fc29f4
KS
1064
1065 udev_list_entry_foreach(item, udev_enumerate_get_list_entry(e)) {
1066 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
1067
1068 d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
1069 if (!d)
1070 continue;
1071
1072 if (!streq_ptr("partition", udev_device_get_devtype(d)))
1073 continue;
1074
1075 has_partitions = true;
1076 break;
1077 }
1078
1079 /*
1080 * We have partitions and re-read the table, the kernel already sent
1081 * out a "change" event for the disk, and "remove/add" for all
1082 * partitions.
1083 */
1084 if (part_table_read && has_partitions)
1085 return 0;
1086
1087 /*
1088 * We have partitions but re-reading the partition table did not
1089 * work, synthesize "change" for the disk and all partitions.
1090 */
1091 log_debug("device %s closed, synthesising 'change'", udev_device_get_devnode(dev));
1092 strscpyl(filename, sizeof(filename), udev_device_get_syspath(dev), "/uevent", NULL);
1093 write_string_file(filename, "change");
1094
f3a740a5
KS
1095 udev_list_entry_foreach(item, udev_enumerate_get_list_entry(e)) {
1096 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
1097
1098 d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
1099 if (!d)
1100 continue;
1101
1102 if (!streq_ptr("partition", udev_device_get_devtype(d)))
1103 continue;
1104
1105 log_debug("device %s closed, synthesising partition '%s' 'change'",
1106 udev_device_get_devnode(dev), udev_device_get_devnode(d));
1107 strscpyl(filename, sizeof(filename), udev_device_get_syspath(d), "/uevent", NULL);
1108 write_string_file(filename, "change");
1109 }
ede34445
KS
1110
1111 return 0;
f3a740a5
KS
1112 }
1113
ede34445
KS
1114 log_debug("device %s closed, synthesising 'change'", udev_device_get_devnode(dev));
1115 strscpyl(filename, sizeof(filename), udev_device_get_syspath(dev), "/uevent", NULL);
1116 write_string_file(filename, "change");
1117
f3a740a5 1118 return 0;
edd32000
KS
1119}
1120
e82e8fa5 1121static int on_inotify(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
c0c6806b 1122 Manager *manager = userdata;
0254e944 1123 union inotify_event_buffer buffer;
f7c1ad4f
LP
1124 struct inotify_event *e;
1125 ssize_t l;
912541b0 1126
c0c6806b 1127 assert(manager);
e82e8fa5
TG
1128
1129 l = read(fd, &buffer, sizeof(buffer));
f7c1ad4f
LP
1130 if (l < 0) {
1131 if (errno == EAGAIN || errno == EINTR)
e82e8fa5 1132 return 1;
912541b0 1133
f7c1ad4f 1134 return log_error_errno(errno, "Failed to read inotify fd: %m");
912541b0
KS
1135 }
1136
f7c1ad4f 1137 FOREACH_INOTIFY_EVENT(e, buffer, l) {
e82e8fa5 1138 _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
912541b0 1139
c0c6806b 1140 dev = udev_watch_lookup(manager->udev, e->wd);
edd32000
KS
1141 if (!dev)
1142 continue;
912541b0 1143
f7c1ad4f 1144 log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev));
a8389097 1145 if (e->mask & IN_CLOSE_WRITE) {
edd32000 1146 synthesize_change(dev);
a8389097
TG
1147
1148 /* settle might be waiting on us to determine the queue
1149 * state. If we just handled an inotify event, we might have
1150 * generated a "change" event, but we won't have queued up
1151 * the resultant uevent yet. Do that.
1152 */
c0c6806b 1153 on_uevent(NULL, -1, 0, manager);
a8389097 1154 } else if (e->mask & IN_IGNORED)
c0c6806b 1155 udev_watch_end(manager->udev, dev);
912541b0
KS
1156 }
1157
e82e8fa5 1158 return 1;
bd284db1
SJR
1159}
1160
0561329d 1161static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1162 Manager *manager = userdata;
1163
1164 assert(manager);
1165
62d43dac 1166 manager_exit(manager);
912541b0 1167
e82e8fa5
TG
1168 return 1;
1169}
912541b0 1170
0561329d 1171static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1172 Manager *manager = userdata;
1173
1174 assert(manager);
1175
62d43dac 1176 manager_reload(manager);
912541b0 1177
e82e8fa5
TG
1178 return 1;
1179}
912541b0 1180
e82e8fa5 1181static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
c0c6806b
TG
1182 Manager *manager = userdata;
1183
1184 assert(manager);
1185
e82e8fa5
TG
1186 for (;;) {
1187 pid_t pid;
1188 int status;
1189 struct worker *worker;
d1317d02 1190
e82e8fa5
TG
1191 pid = waitpid(-1, &status, WNOHANG);
1192 if (pid <= 0)
f29328d6 1193 break;
e82e8fa5 1194
c0c6806b 1195 worker = hashmap_get(manager->workers, UINT_TO_PTR(pid));
e82e8fa5
TG
1196 if (!worker) {
1197 log_warning("worker ["PID_FMT"] is unknown, ignoring", pid);
f29328d6 1198 continue;
912541b0 1199 }
e82e8fa5
TG
1200
1201 if (WIFEXITED(status)) {
1202 if (WEXITSTATUS(status) == 0)
1203 log_debug("worker ["PID_FMT"] exited", pid);
1204 else
1205 log_warning("worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
1206 } else if (WIFSIGNALED(status)) {
1207 log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
1208 } else if (WIFSTOPPED(status)) {
1209 log_info("worker ["PID_FMT"] stopped", pid);
f29328d6 1210 continue;
e82e8fa5
TG
1211 } else if (WIFCONTINUED(status)) {
1212 log_info("worker ["PID_FMT"] continued", pid);
f29328d6 1213 continue;
e82e8fa5
TG
1214 } else
1215 log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);
1216
1217 if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
1218 if (worker->event) {
1219 log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath);
1220 /* delete state from disk */
1221 udev_device_delete_db(worker->event->dev);
1222 udev_device_tag_index(worker->event->dev, NULL, false);
1223 /* forward kernel event without amending it */
c0c6806b 1224 udev_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
e82e8fa5
TG
1225 }
1226 }
1227
1228 worker_free(worker);
912541b0 1229 }
e82e8fa5 1230
8302fe5a
TG
1231 /* we can start new workers, try to schedule events */
1232 event_queue_start(manager);
1233
e82e8fa5 1234 return 1;
f27125f9 1235}
1236
693d371d
TG
1237static int on_post(sd_event_source *s, void *userdata) {
1238 Manager *manager = userdata;
1239 int r;
1240
1241 assert(manager);
1242
1243 if (udev_list_node_is_empty(&manager->events)) {
1244 /* no pending events */
1245 if (!hashmap_isempty(manager->workers)) {
1246 /* there are idle workers */
1247 log_debug("cleanup idle workers");
1248 manager_kill_workers(manager);
1249 } else {
1250 /* we are idle */
1251 if (manager->exit) {
1252 r = sd_event_exit(manager->event, 0);
1253 if (r < 0)
1254 return r;
1255 } else if (manager->cgroup)
1256 /* cleanup possible left-over processes in our cgroup */
1257 cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, false, true, NULL);
1258 }
1259 }
1260
1261 return 1;
1262}
1263
fcff1e72 1264static int listen_fds(int *rctrl, int *rnetlink) {
f59118ec 1265 _cleanup_udev_unref_ struct udev *udev = NULL;
fcff1e72 1266 int ctrl_fd = -1, netlink_fd = -1;
f59118ec 1267 int fd, n, r;
912541b0 1268
fcff1e72
TG
1269 assert(rctrl);
1270 assert(rnetlink);
1271
912541b0 1272 n = sd_listen_fds(true);
fcff1e72
TG
1273 if (n < 0)
1274 return n;
912541b0
KS
1275
1276 for (fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) {
1277 if (sd_is_socket(fd, AF_LOCAL, SOCK_SEQPACKET, -1)) {
fcff1e72
TG
1278 if (ctrl_fd >= 0)
1279 return -EINVAL;
1280 ctrl_fd = fd;
912541b0
KS
1281 continue;
1282 }
1283
1284 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1)) {
fcff1e72
TG
1285 if (netlink_fd >= 0)
1286 return -EINVAL;
1287 netlink_fd = fd;
912541b0
KS
1288 continue;
1289 }
1290
fcff1e72 1291 return -EINVAL;
912541b0
KS
1292 }
1293
f59118ec
TG
1294 if (ctrl_fd < 0) {
1295 _cleanup_udev_ctrl_unref_ struct udev_ctrl *ctrl = NULL;
1296
1297 udev = udev_new();
1298 if (!udev)
1299 return -ENOMEM;
1300
1301 ctrl = udev_ctrl_new(udev);
1302 if (!ctrl)
1303 return log_error_errno(EINVAL, "error initializing udev control socket");
1304
1305 r = udev_ctrl_enable_receiving(ctrl);
1306 if (r < 0)
1307 return log_error_errno(EINVAL, "error binding udev control socket");
1308
1309 fd = udev_ctrl_get_fd(ctrl);
1310 if (fd < 0)
1311 return log_error_errno(EIO, "could not get ctrl fd");
fcff1e72 1312
f59118ec
TG
1313 ctrl_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
1314 if (ctrl_fd < 0)
1315 return log_error_errno(errno, "could not dup ctrl fd: %m");
1316 }
1317
1318 if (netlink_fd < 0) {
1319 _cleanup_udev_monitor_unref_ struct udev_monitor *monitor = NULL;
1320
1321 if (!udev) {
1322 udev = udev_new();
1323 if (!udev)
1324 return -ENOMEM;
1325 }
1326
1327 monitor = udev_monitor_new_from_netlink(udev, "kernel");
1328 if (!monitor)
1329 return log_error_errno(EINVAL, "error initializing netlink socket");
1330
1331 (void) udev_monitor_set_receive_buffer_size(monitor, 128 * 1024 * 1024);
1332
1333 r = udev_monitor_enable_receiving(monitor);
1334 if (r < 0)
1335 return log_error_errno(EINVAL, "error binding netlink socket");
1336
1337 fd = udev_monitor_get_fd(monitor);
1338 if (fd < 0)
1339 return log_error_errno(netlink_fd, "could not get uevent fd: %m");
1340
1341 netlink_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
1342 if (ctrl_fd < 0)
1343 return log_error_errno(errno, "could not dup netlink fd: %m");
1344 }
fcff1e72
TG
1345
1346 *rctrl = ctrl_fd;
1347 *rnetlink = netlink_fd;
912541b0 1348
912541b0 1349 return 0;
7459bcdc
KS
1350}
1351
e6f86cac 1352/*
3f85ef0f 1353 * read the kernel command line, in case we need to get into debug mode
614a823c
TG
1354 * udev.log-priority=<level> syslog priority
1355 * udev.children-max=<number of workers> events are fully serialized if set to 1
1356 * udev.exec-delay=<number of seconds> delay execution of every executed program
1357 * udev.event-timeout=<number of seconds> seconds to wait before terminating an event
e6f86cac 1358 */
614a823c 1359static int parse_proc_cmdline_item(const char *key, const char *value) {
74df0fca 1360 int r;
e6f86cac 1361
614a823c 1362 assert(key);
e6f86cac 1363
614a823c
TG
1364 if (!value)
1365 return 0;
e6f86cac 1366
614a823c
TG
1367 if (startswith(key, "rd."))
1368 key += strlen("rd.");
e6f86cac 1369
614a823c
TG
1370 if (startswith(key, "udev."))
1371 key += strlen("udev.");
1372 else
1373 return 0;
e6f86cac 1374
614a823c
TG
1375 if (streq(key, "log-priority")) {
1376 int prio;
e6f86cac 1377
614a823c
TG
1378 prio = util_log_priority(value);
1379 log_set_max_level(prio);
1380 } else if (streq(key, "children-max")) {
020328e1 1381 r = safe_atou(value, &arg_children_max);
614a823c
TG
1382 if (r < 0)
1383 log_warning("invalid udev.children-max ignored: %s", value);
1384 } else if (streq(key, "exec-delay")) {
1385 r = safe_atoi(value, &arg_exec_delay);
1386 if (r < 0)
1387 log_warning("invalid udev.exec-delay ignored: %s", value);
1388 } else if (streq(key, "event-timeout")) {
1389 r = safe_atou64(value, &arg_event_timeout_usec);
1390 if (r < 0)
1391 log_warning("invalid udev.event-timeout ignored: %s", value);
1392 else {
f1e8664e 1393 arg_event_timeout_usec *= USEC_PER_SEC;
bba7a484 1394 arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
023b9d33 1395 }
e6f86cac 1396 }
614a823c
TG
1397
1398 return 0;
e6f86cac
KS
1399}
1400
ed216e1f
TG
1401static void help(void) {
1402 printf("%s [OPTIONS...]\n\n"
1403 "Manages devices.\n\n"
5ac0162c
LP
1404 " -h --help Print this message\n"
1405 " --version Print version of the program\n"
1406 " --daemon Detach and run in the background\n"
1407 " --debug Enable debug output\n"
1408 " --children-max=INT Set maximum number of workers\n"
1409 " --exec-delay=SECONDS Seconds to wait before executing RUN=\n"
1410 " --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1411 " --resolve-names=early|late|never\n"
1412 " When to resolve users and groups\n"
ed216e1f
TG
1413 , program_invocation_short_name);
1414}
1415
bba7a484 1416static int parse_argv(int argc, char *argv[]) {
912541b0 1417 static const struct option options[] = {
bba7a484
TG
1418 { "daemon", no_argument, NULL, 'd' },
1419 { "debug", no_argument, NULL, 'D' },
1420 { "children-max", required_argument, NULL, 'c' },
1421 { "exec-delay", required_argument, NULL, 'e' },
1422 { "event-timeout", required_argument, NULL, 't' },
1423 { "resolve-names", required_argument, NULL, 'N' },
1424 { "help", no_argument, NULL, 'h' },
1425 { "version", no_argument, NULL, 'V' },
912541b0
KS
1426 {}
1427 };
689a97f5 1428
bba7a484 1429 int c;
689a97f5 1430
bba7a484
TG
1431 assert(argc >= 0);
1432 assert(argv);
912541b0 1433
bba7a484 1434 while ((c = getopt_long(argc, argv, "c:de:DtN:hV", options, NULL)) >= 0) {
f1e8664e 1435 int r;
912541b0 1436
bba7a484 1437 switch (c) {
912541b0 1438
912541b0 1439 case 'd':
bba7a484 1440 arg_daemonize = true;
912541b0
KS
1441 break;
1442 case 'c':
020328e1 1443 r = safe_atou(optarg, &arg_children_max);
6f5cf8a8
TG
1444 if (r < 0)
1445 log_warning("Invalid --children-max ignored: %s", optarg);
912541b0
KS
1446 break;
1447 case 'e':
6f5cf8a8
TG
1448 r = safe_atoi(optarg, &arg_exec_delay);
1449 if (r < 0)
1450 log_warning("Invalid --exec-delay ignored: %s", optarg);
912541b0 1451 break;
9719859c 1452 case 't':
f1e8664e
TG
1453 r = safe_atou64(optarg, &arg_event_timeout_usec);
1454 if (r < 0)
65fea570 1455 log_warning("Invalid --event-timeout ignored: %s", optarg);
6f5cf8a8
TG
1456 else {
1457 arg_event_timeout_usec *= USEC_PER_SEC;
1458 arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
1459 }
9719859c 1460 break;
912541b0 1461 case 'D':
bba7a484 1462 arg_debug = true;
912541b0
KS
1463 break;
1464 case 'N':
090be865 1465 if (streq(optarg, "early")) {
bba7a484 1466 arg_resolve_names = 1;
090be865 1467 } else if (streq(optarg, "late")) {
bba7a484 1468 arg_resolve_names = 0;
090be865 1469 } else if (streq(optarg, "never")) {
bba7a484 1470 arg_resolve_names = -1;
912541b0 1471 } else {
9f6445e3 1472 log_error("resolve-names must be early, late or never");
bba7a484 1473 return 0;
912541b0
KS
1474 }
1475 break;
1476 case 'h':
ed216e1f 1477 help();
bba7a484 1478 return 0;
912541b0
KS
1479 case 'V':
1480 printf("%s\n", VERSION);
bba7a484
TG
1481 return 0;
1482 case '?':
1483 return -EINVAL;
912541b0 1484 default:
bba7a484
TG
1485 assert_not_reached("Unhandled option");
1486
912541b0
KS
1487 }
1488 }
1489
bba7a484
TG
1490 return 1;
1491}
1492
b7f74dd4 1493static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cgroup) {
c0c6806b 1494 _cleanup_(manager_freep) Manager *manager = NULL;
11b1dd8c 1495 int r, fd_worker, one = 1;
c0c6806b
TG
1496
1497 assert(ret);
11b1dd8c
TG
1498 assert(fd_ctrl >= 0);
1499 assert(fd_uevent >= 0);
c0c6806b
TG
1500
1501 manager = new0(Manager, 1);
1502 if (!manager)
1503 return log_oom();
1504
e237d8cb
TG
1505 manager->fd_inotify = -1;
1506 manager->worker_watch[WRITE_END] = -1;
1507 manager->worker_watch[READ_END] = -1;
1508
c0c6806b
TG
1509 manager->udev = udev_new();
1510 if (!manager->udev)
1511 return log_error_errno(errno, "could not allocate udev context: %m");
1512
b2d21d93
TG
1513 udev_builtin_init(manager->udev);
1514
ecb17862
TG
1515 manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
1516 if (!manager->rules)
1517 return log_error_errno(ENOMEM, "error reading rules");
1518
1519 udev_list_node_init(&manager->events);
1520 udev_list_init(manager->udev, &manager->properties, true);
1521
c26d1879
TG
1522 manager->cgroup = cgroup;
1523
f59118ec
TG
1524 manager->ctrl = udev_ctrl_new_from_fd(manager->udev, fd_ctrl);
1525 if (!manager->ctrl)
1526 return log_error_errno(EINVAL, "error taking over udev control socket");
e237d8cb 1527
f59118ec
TG
1528 manager->monitor = udev_monitor_new_from_netlink_fd(manager->udev, "kernel", fd_uevent);
1529 if (!manager->monitor)
1530 return log_error_errno(EINVAL, "error taking over netlink socket");
e237d8cb
TG
1531
1532 /* unnamed socket from workers to the main daemon */
1533 r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
1534 if (r < 0)
1535 return log_error_errno(errno, "error creating socketpair: %m");
1536
693d371d 1537 fd_worker = manager->worker_watch[READ_END];
e237d8cb 1538
693d371d 1539 r = setsockopt(fd_worker, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
e237d8cb
TG
1540 if (r < 0)
1541 return log_error_errno(errno, "could not enable SO_PASSCRED: %m");
1542
1543 manager->fd_inotify = udev_watch_init(manager->udev);
1544 if (manager->fd_inotify < 0)
1545 return log_error_errno(ENOMEM, "error initializing inotify");
1546
1547 udev_watch_restore(manager->udev);
1548
1549 /* block and listen to all signals on signalfd */
8314de1d 1550 assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) == 0);
693d371d 1551
49f997f3
TG
1552 r = sd_event_default(&manager->event);
1553 if (r < 0)
1554 return log_error_errno(errno, "could not allocate event loop: %m");
1555
693d371d
TG
1556 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1557 if (r < 0)
1558 return log_error_errno(r, "error creating sigint event source: %m");
1559
1560 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1561 if (r < 0)
1562 return log_error_errno(r, "error creating sigterm event source: %m");
1563
1564 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1565 if (r < 0)
1566 return log_error_errno(r, "error creating sighup event source: %m");
1567
1568 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1569 if (r < 0)
1570 return log_error_errno(r, "error creating sigchld event source: %m");
1571
1572 r = sd_event_set_watchdog(manager->event, true);
1573 if (r < 0)
1574 return log_error_errno(r, "error creating watchdog event source: %m");
1575
11b1dd8c 1576 r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager);
693d371d
TG
1577 if (r < 0)
1578 return log_error_errno(r, "error creating ctrl event source: %m");
1579
1580 /* This needs to be after the inotify and uevent handling, to make sure
1581 * that the ping is send back after fully processing the pending uevents
1582 * (including the synthetic ones we may create due to inotify events).
1583 */
1584 r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
1585 if (r < 0)
1586 return log_error_errno(r, "cold not set IDLE event priority for ctrl event source: %m");
1587
1588 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1589 if (r < 0)
1590 return log_error_errno(r, "error creating inotify event source: %m");
1591
11b1dd8c 1592 r = sd_event_add_io(manager->event, &manager->uevent_event, fd_uevent, EPOLLIN, on_uevent, manager);
693d371d
TG
1593 if (r < 0)
1594 return log_error_errno(r, "error creating uevent event source: %m");
1595
1596 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1597 if (r < 0)
1598 return log_error_errno(r, "error creating worker event source: %m");
1599
1600 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1601 if (r < 0)
1602 return log_error_errno(r, "error creating post event source: %m");
e237d8cb 1603
11b1dd8c
TG
1604 *ret = manager;
1605 manager = NULL;
1606
86c3bece 1607 return 0;
c0c6806b
TG
1608}
1609
bba7a484 1610int main(int argc, char *argv[]) {
c0c6806b 1611 _cleanup_(manager_freep) Manager *manager = NULL;
c26d1879 1612 _cleanup_free_ char *cgroup = NULL;
b7f74dd4 1613 int r, fd_ctrl, fd_uevent;
bba7a484 1614
bba7a484
TG
1615 log_set_target(LOG_TARGET_AUTO);
1616 log_parse_environment();
1617 log_open();
1618
bba7a484
TG
1619 r = parse_argv(argc, argv);
1620 if (r <= 0)
1621 goto exit;
1622
614a823c
TG
1623 r = parse_proc_cmdline(parse_proc_cmdline_item);
1624 if (r < 0)
1625 log_warning_errno(r, "failed to parse kernel command line, ignoring: %m");
912541b0 1626
25e773ee 1627 if (arg_debug)
bba7a484 1628 log_set_max_level(LOG_DEBUG);
bba7a484 1629
912541b0 1630 if (getuid() != 0) {
6af5e6a4 1631 r = log_error_errno(EPERM, "root privileges required");
912541b0
KS
1632 goto exit;
1633 }
1634
712cebf1
TG
1635 if (arg_children_max == 0) {
1636 cpu_set_t cpu_set;
ebc164ef 1637
712cebf1 1638 arg_children_max = 8;
d457ff83 1639
712cebf1
TG
1640 if (sched_getaffinity(0, sizeof (cpu_set), &cpu_set) == 0) {
1641 arg_children_max += CPU_COUNT(&cpu_set) * 2;
1642 }
912541b0 1643
712cebf1 1644 log_debug("set children_max to %u", arg_children_max);
d457ff83 1645 }
912541b0 1646
712cebf1
TG
1647 /* set umask before creating any file/directory */
1648 r = chdir("/");
1649 if (r < 0) {
1650 r = log_error_errno(errno, "could not change dir to /: %m");
1651 goto exit;
1652 }
194bbe33 1653
712cebf1 1654 umask(022);
912541b0 1655
712cebf1
TG
1656 r = mac_selinux_init("/dev");
1657 if (r < 0) {
1658 log_error_errno(r, "could not initialize labelling: %m");
1659 goto exit;
912541b0
KS
1660 }
1661
712cebf1
TG
1662 r = mkdir("/run/udev", 0755);
1663 if (r < 0 && errno != EEXIST) {
1664 r = log_error_errno(errno, "could not create /run/udev: %m");
1665 goto exit;
1666 }
1667
03cfe0d5 1668 dev_setup(NULL, UID_INVALID, GID_INVALID);
912541b0 1669
c26d1879
TG
1670 if (getppid() == 1) {
1671 /* get our own cgroup, we regularly kill everything udev has left behind
1672 we only do this on systemd systems, and only if we are directly spawned
1673 by PID1. otherwise we are not guaranteed to have a dedicated cgroup */
1674 r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
1675 if (r < 0)
1676 log_warning_errno(r, "failed to get cgroup: %m");
1677 }
1678
b7f74dd4
TG
1679 r = listen_fds(&fd_ctrl, &fd_uevent);
1680 if (r < 0) {
1681 r = log_error_errno(r, "could not listen on fds: %m");
1682 goto exit;
1683 }
1684
bba7a484 1685 if (arg_daemonize) {
912541b0 1686 pid_t pid;
912541b0 1687
3cbb2057
TG
1688 log_info("starting version " VERSION);
1689
912541b0
KS
1690 pid = fork();
1691 switch (pid) {
1692 case 0:
1693 break;
1694 case -1:
6af5e6a4 1695 r = log_error_errno(errno, "fork of daemon failed: %m");
912541b0
KS
1696 goto exit;
1697 default:
f53d1fcd
TG
1698 mac_selinux_finish();
1699 log_close();
1700 _exit(EXIT_SUCCESS);
912541b0
KS
1701 }
1702
1703 setsid();
1704
574d5f2d 1705 write_string_file("/proc/self/oom_score_adj", "-1000");
7500cd5e 1706 }
912541b0 1707
11b1dd8c
TG
1708 r = manager_new(&manager, fd_ctrl, fd_uevent, cgroup);
1709 if (r < 0) {
1710 r = log_error_errno(r, "failed to allocate manager object: %m");
1711 goto exit;
1712 }
1713
1714 r = udev_rules_apply_static_dev_perms(manager->rules);
86c3bece 1715 if (r < 0)
11b1dd8c 1716 log_error_errno(r, "failed to apply permissions on static device nodes: %m");
86c3bece 1717
7500cd5e
TG
1718 (void) sd_notify(false,
1719 "READY=1\n"
1720 "STATUS=Processing...");
1721
693d371d
TG
1722 r = sd_event_loop(manager->event);
1723 if (r < 0) {
1724 log_error_errno(r, "event loop failed: %m");
1725 goto exit;
912541b0
KS
1726 }
1727
693d371d
TG
1728 sd_event_get_exit_code(manager->event, &r);
1729
53921bfa 1730exit:
b79aacbf
TG
1731 sd_notify(false,
1732 "STOPPING=1\n"
1733 "STATUS=Shutting down...");
1734
e237d8cb
TG
1735 if (manager)
1736 udev_ctrl_cleanup(manager->ctrl);
cc56fafe 1737 mac_selinux_finish();
baa30fbc 1738 log_close();
6af5e6a4 1739 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
7fafc032 1740}