1 /* SPDX-License-Identifier: GPL-2.0-or-later */
14 #include "alloc-util.h"
15 #include "device-private.h"
16 #include "device-util.h"
19 #include "format-util.h"
20 #include "netif-naming-scheme.h"
21 #include "netlink-util.h"
22 #include "parse-util.h"
23 #include "path-util.h"
24 #include "process-util.h"
25 #include "rlimit-util.h"
26 #include "signal-util.h"
27 #include "stdio-util.h"
28 #include "string-util.h"
31 #include "udev-builtin.h"
32 #include "udev-event.h"
33 #include "udev-node.h"
34 #include "udev-util.h"
35 #include "udev-watch.h"
36 #include "user-util.h"
38 typedef struct Spawn
{
42 usec_t timeout_warn_usec
;
45 usec_t event_birth_usec
;
55 UdevEvent
*udev_event_new(sd_device
*dev
, usec_t exec_delay_usec
, sd_netlink
*rtnl
, int log_level
) {
60 event
= new(UdevEvent
, 1);
64 *event
= (UdevEvent
) {
65 .dev
= sd_device_ref(dev
),
66 .birth_usec
= now(CLOCK_MONOTONIC
),
67 .exec_delay_usec
= exec_delay_usec
,
68 .rtnl
= sd_netlink_ref(rtnl
),
72 .log_level_was_debug
= log_level
== LOG_DEBUG
,
73 .default_log_level
= log_level
,
79 UdevEvent
*udev_event_free(UdevEvent
*event
) {
83 sd_device_unref(event
->dev
);
84 sd_device_unref(event
->dev_db_clone
);
85 sd_netlink_unref(event
->rtnl
);
86 ordered_hashmap_free_free_key(event
->run_list
);
87 ordered_hashmap_free_free_free(event
->seclabel_list
);
88 free(event
->program_result
);
99 FORMAT_SUBST_KERNEL_NUMBER
,
101 FORMAT_SUBST_DEVPATH
,
111 _FORMAT_SUBST_TYPE_MAX
,
112 _FORMAT_SUBST_TYPE_INVALID
= -EINVAL
,
113 } FormatSubstitutionType
;
115 struct subst_map_entry
{
118 FormatSubstitutionType type
;
121 static const struct subst_map_entry map
[] = {
122 { .name
= "devnode", .fmt
= 'N', .type
= FORMAT_SUBST_DEVNODE
},
123 { .name
= "tempnode", .fmt
= 'N', .type
= FORMAT_SUBST_DEVNODE
}, /* deprecated */
124 { .name
= "attr", .fmt
= 's', .type
= FORMAT_SUBST_ATTR
},
125 { .name
= "sysfs", .fmt
= 's', .type
= FORMAT_SUBST_ATTR
}, /* deprecated */
126 { .name
= "env", .fmt
= 'E', .type
= FORMAT_SUBST_ENV
},
127 { .name
= "kernel", .fmt
= 'k', .type
= FORMAT_SUBST_KERNEL
},
128 { .name
= "number", .fmt
= 'n', .type
= FORMAT_SUBST_KERNEL_NUMBER
},
129 { .name
= "driver", .fmt
= 'd', .type
= FORMAT_SUBST_DRIVER
},
130 { .name
= "devpath", .fmt
= 'p', .type
= FORMAT_SUBST_DEVPATH
},
131 { .name
= "id", .fmt
= 'b', .type
= FORMAT_SUBST_ID
},
132 { .name
= "major", .fmt
= 'M', .type
= FORMAT_SUBST_MAJOR
},
133 { .name
= "minor", .fmt
= 'm', .type
= FORMAT_SUBST_MINOR
},
134 { .name
= "result", .fmt
= 'c', .type
= FORMAT_SUBST_RESULT
},
135 { .name
= "parent", .fmt
= 'P', .type
= FORMAT_SUBST_PARENT
},
136 { .name
= "name", .fmt
= 'D', .type
= FORMAT_SUBST_NAME
},
137 { .name
= "links", .fmt
= 'L', .type
= FORMAT_SUBST_LINKS
},
138 { .name
= "root", .fmt
= 'r', .type
= FORMAT_SUBST_ROOT
},
139 { .name
= "sys", .fmt
= 'S', .type
= FORMAT_SUBST_SYS
},
142 static const char *format_type_to_string(FormatSubstitutionType t
) {
143 for (size_t i
= 0; i
< ELEMENTSOF(map
); i
++)
144 if (map
[i
].type
== t
)
149 static char format_type_to_char(FormatSubstitutionType t
) {
150 for (size_t i
= 0; i
< ELEMENTSOF(map
); i
++)
151 if (map
[i
].type
== t
)
156 static int get_subst_type(const char **str
, bool strict
, FormatSubstitutionType
*ret_type
, char ret_attr
[static UDEV_PATH_SIZE
]) {
157 const char *p
= *str
, *q
= NULL
;
171 for (i
= 0; i
< ELEMENTSOF(map
); i
++)
172 if ((q
= startswith(p
, map
[i
].name
)))
174 } else if (*p
== '%') {
181 for (i
= 0; i
< ELEMENTSOF(map
); i
++)
182 if (*p
== map
[i
].fmt
) {
189 /* When 'strict' flag is set, then '$' and '%' must be escaped. */
190 return strict
? -EINVAL
: 0;
193 const char *start
, *end
;
197 end
= strchr(start
, '}');
202 if (len
== 0 || len
>= UDEV_PATH_SIZE
)
205 strnscpy(ret_attr
, UDEV_PATH_SIZE
, start
, len
);
211 *ret_type
= map
[i
].type
;
215 static int safe_atou_optional_plus(const char *s
, unsigned *ret
) {
222 /* Returns 1 if plus, 0 if no plus, negative on error */
224 p
= endswith(s
, "+");
226 s
= strndupa_safe(s
, p
- s
);
228 r
= safe_atou(s
, ret
);
235 static ssize_t
udev_event_subst_format(
237 FormatSubstitutionType type
,
241 bool *ret_truncated
) {
243 sd_device
*parent
, *dev
= ASSERT_PTR(ASSERT_PTR(event
)->dev
);
244 const char *val
= NULL
;
245 bool truncated
= false;
250 case FORMAT_SUBST_DEVPATH
:
251 r
= sd_device_get_devpath(dev
, &val
);
254 strpcpy_full(&s
, l
, val
, &truncated
);
256 case FORMAT_SUBST_KERNEL
:
257 r
= sd_device_get_sysname(dev
, &val
);
260 strpcpy_full(&s
, l
, val
, &truncated
);
262 case FORMAT_SUBST_KERNEL_NUMBER
:
263 r
= sd_device_get_sysnum(dev
, &val
);
268 strpcpy_full(&s
, l
, val
, &truncated
);
270 case FORMAT_SUBST_ID
:
271 if (!event
->dev_parent
)
273 r
= sd_device_get_sysname(event
->dev_parent
, &val
);
276 strpcpy_full(&s
, l
, val
, &truncated
);
278 case FORMAT_SUBST_DRIVER
:
279 if (!event
->dev_parent
)
281 r
= sd_device_get_driver(event
->dev_parent
, &val
);
286 strpcpy_full(&s
, l
, val
, &truncated
);
288 case FORMAT_SUBST_MAJOR
:
289 case FORMAT_SUBST_MINOR
: {
292 r
= sd_device_get_devnum(dev
, &devnum
);
293 if (r
< 0 && r
!= -ENOENT
)
295 strpcpyf_full(&s
, l
, &truncated
, "%u", r
< 0 ? 0 : type
== FORMAT_SUBST_MAJOR
? major(devnum
) : minor(devnum
));
298 case FORMAT_SUBST_RESULT
: {
299 unsigned index
= 0; /* 0 means whole string */
302 if (!event
->program_result
)
305 if (!isempty(attr
)) {
306 r
= safe_atou_optional_plus(attr
, &index
);
314 strpcpy_full(&s
, l
, event
->program_result
, &truncated
);
316 const char *start
, *p
;
319 p
= skip_leading_chars(event
->program_result
, NULL
);
321 for (i
= 1; i
< index
; i
++) {
322 while (*p
&& !strchr(WHITESPACE
, *p
))
324 p
= skip_leading_chars(p
, NULL
);
329 log_device_debug(dev
, "requested part of result string not found");
334 /* %c{2+} copies the whole string from the second part on */
336 strpcpy_full(&s
, l
, start
, &truncated
);
338 while (*p
&& !strchr(WHITESPACE
, *p
))
340 strnpcpy_full(&s
, l
, start
, p
- start
, &truncated
);
345 case FORMAT_SUBST_ATTR
: {
346 char vbuf
[UDEV_NAME_SIZE
];
353 /* try to read the value specified by "[dmi/id]product_name" */
354 if (udev_resolve_subsys_kernel(attr
, vbuf
, sizeof(vbuf
), true) == 0)
357 /* try to read the attribute the device */
359 (void) sd_device_get_sysattr_value(dev
, attr
, &val
);
361 /* try to read the attribute of the parent device, other matches have selected */
362 if (!val
&& event
->dev_parent
&& event
->dev_parent
!= dev
)
363 (void) sd_device_get_sysattr_value(event
->dev_parent
, attr
, &val
);
368 /* strip trailing whitespace, and replace unwanted characters */
370 strscpy_full(vbuf
, sizeof(vbuf
), val
, &truncated
);
371 delete_trailing_chars(vbuf
, NULL
);
372 count
= udev_replace_chars(vbuf
, UDEV_ALLOWED_CHARS_INPUT
);
374 log_device_debug(dev
, "%i character(s) replaced", count
);
375 strpcpy_full(&s
, l
, vbuf
, &t
);
376 truncated
= truncated
|| t
;
379 case FORMAT_SUBST_PARENT
:
380 r
= sd_device_get_parent(dev
, &parent
);
385 r
= sd_device_get_devname(parent
, &val
);
390 strpcpy_full(&s
, l
, val
+ STRLEN("/dev/"), &truncated
);
392 case FORMAT_SUBST_DEVNODE
:
393 r
= sd_device_get_devname(dev
, &val
);
398 strpcpy_full(&s
, l
, val
, &truncated
);
400 case FORMAT_SUBST_NAME
:
402 strpcpy_full(&s
, l
, event
->name
, &truncated
);
403 else if (sd_device_get_devname(dev
, &val
) >= 0)
404 strpcpy_full(&s
, l
, val
+ STRLEN("/dev/"), &truncated
);
406 r
= sd_device_get_sysname(dev
, &val
);
409 strpcpy_full(&s
, l
, val
, &truncated
);
412 case FORMAT_SUBST_LINKS
:
413 FOREACH_DEVICE_DEVLINK(dev
, val
) {
415 strpcpy_full(&s
, l
, val
+ STRLEN("/dev/"), &truncated
);
417 strpcpyl_full(&s
, l
, &truncated
, " ", val
+ STRLEN("/dev/"), NULL
);
424 case FORMAT_SUBST_ROOT
:
425 strpcpy_full(&s
, l
, "/dev", &truncated
);
427 case FORMAT_SUBST_SYS
:
428 strpcpy_full(&s
, l
, "/sys", &truncated
);
430 case FORMAT_SUBST_ENV
:
433 r
= sd_device_get_property_value(dev
, attr
, &val
);
438 strpcpy_full(&s
, l
, val
, &truncated
);
441 assert_not_reached();
445 *ret_truncated
= truncated
;
451 *ret_truncated
= truncated
;
457 size_t udev_event_apply_format(
462 bool replace_whitespace
,
463 bool *ret_truncated
) {
465 bool truncated
= false;
466 const char *s
= ASSERT_PTR(src
);
475 FormatSubstitutionType type
;
476 char attr
[UDEV_PATH_SIZE
];
480 r
= get_subst_type(&s
, false, &type
, attr
);
482 log_device_warning_errno(event
->dev
, r
, "Invalid format string, ignoring: %s", src
);
486 /* need space for this char and the terminating NUL */
495 subst_len
= udev_event_subst_format(event
, type
, attr
, dest
, size
, &t
);
497 log_device_warning_errno(event
->dev
, subst_len
,
498 "Failed to substitute variable '$%s' or apply format '%%%c', ignoring: %m",
499 format_type_to_string(type
), format_type_to_char(type
));
503 truncated
= truncated
|| t
;
505 /* FORMAT_SUBST_RESULT handles spaces itself */
506 if (replace_whitespace
&& type
!= FORMAT_SUBST_RESULT
)
507 /* udev_replace_whitespace can replace in-place,
508 * and does nothing if subst_len == 0 */
509 subst_len
= udev_replace_whitespace(dest
, dest
, subst_len
);
518 *ret_truncated
= truncated
;
524 int udev_check_format(const char *value
, size_t *offset
, const char **hint
) {
525 FormatSubstitutionType type
;
526 const char *s
= value
;
527 char attr
[UDEV_PATH_SIZE
];
531 r
= get_subst_type(&s
, true, &type
, attr
);
536 *hint
= "invalid substitution type";
543 if (IN_SET(type
, FORMAT_SUBST_ATTR
, FORMAT_SUBST_ENV
) && isempty(attr
)) {
547 *hint
= "attribute value missing";
551 if (type
== FORMAT_SUBST_RESULT
&& !isempty(attr
)) {
554 r
= safe_atou_optional_plus(attr
, &i
);
559 *hint
= "attribute value not a valid number";
568 static int on_spawn_io(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
569 Spawn
*spawn
= ASSERT_PTR(userdata
);
575 assert(fd
== spawn
->fd_stdout
|| fd
== spawn
->fd_stderr
);
576 assert(!spawn
->result
|| spawn
->result_len
< spawn
->result_size
);
578 if (fd
== spawn
->fd_stdout
&& spawn
->result
) {
579 p
= spawn
->result
+ spawn
->result_len
;
580 size
= spawn
->result_size
- spawn
->result_len
;
586 l
= read(fd
, p
, size
- (p
== buf
));
591 log_device_error_errno(spawn
->device
, errno
,
592 "Failed to read stdout of '%s': %m", spawn
->cmd
);
597 if ((size_t) l
== size
) {
598 log_device_warning(spawn
->device
, "Truncating stdout of '%s' up to %zu byte.",
599 spawn
->cmd
, spawn
->result_size
);
601 spawn
->truncated
= true;
605 if (fd
== spawn
->fd_stdout
&& spawn
->result
)
606 spawn
->result_len
+= l
;
608 /* Log output only if we watch stderr. */
609 if (l
> 0 && spawn
->fd_stderr
>= 0) {
610 _cleanup_strv_free_
char **v
= NULL
;
612 r
= strv_split_newlines_full(&v
, p
, EXTRACT_RETAIN_ESCAPE
);
614 log_device_debug(spawn
->device
,
615 "Failed to split output from '%s'(%s), ignoring: %m",
616 spawn
->cmd
, fd
== spawn
->fd_stdout
? "out" : "err");
619 log_device_debug(spawn
->device
, "'%s'(%s) '%s'", spawn
->cmd
,
620 fd
== spawn
->fd_stdout
? "out" : "err", *q
);
623 if (l
== 0 || spawn
->truncated
)
627 /* Re-enable the event source if we did not encounter EOF */
629 r
= sd_event_source_set_enabled(s
, SD_EVENT_ONESHOT
);
631 log_device_error_errno(spawn
->device
, r
,
632 "Failed to reactivate IO source of '%s'", spawn
->cmd
);
636 static int on_spawn_timeout(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
637 Spawn
*spawn
= ASSERT_PTR(userdata
);
639 DEVICE_TRACE_POINT(spawn_timeout
, spawn
->device
, spawn
->cmd
);
641 kill_and_sigcont(spawn
->pid
, spawn
->timeout_signal
);
643 log_device_error(spawn
->device
, "Spawned process '%s' ["PID_FMT
"] timed out after %s, killing",
644 spawn
->cmd
, spawn
->pid
,
645 FORMAT_TIMESPAN(spawn
->timeout_usec
, USEC_PER_SEC
));
650 static int on_spawn_timeout_warning(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
651 Spawn
*spawn
= ASSERT_PTR(userdata
);
653 log_device_warning(spawn
->device
, "Spawned process '%s' ["PID_FMT
"] is taking longer than %s to complete",
654 spawn
->cmd
, spawn
->pid
,
655 FORMAT_TIMESPAN(spawn
->timeout_warn_usec
, USEC_PER_SEC
));
660 static int on_spawn_sigchld(sd_event_source
*s
, const siginfo_t
*si
, void *userdata
) {
661 Spawn
*spawn
= ASSERT_PTR(userdata
);
664 switch (si
->si_code
) {
666 if (si
->si_status
== 0)
667 log_device_debug(spawn
->device
, "Process '%s' succeeded.", spawn
->cmd
);
669 log_device_full(spawn
->device
, spawn
->accept_failure
? LOG_DEBUG
: LOG_WARNING
,
670 "Process '%s' failed with exit code %i.", spawn
->cmd
, si
->si_status
);
675 log_device_error(spawn
->device
, "Process '%s' terminated by signal %s.", spawn
->cmd
, signal_to_string(si
->si_status
));
678 log_device_error(spawn
->device
, "Process '%s' failed due to unknown reason.", spawn
->cmd
);
681 DEVICE_TRACE_POINT(spawn_exit
, spawn
->device
, spawn
->cmd
);
683 sd_event_exit(sd_event_source_get_event(s
), ret
);
687 static int spawn_wait(Spawn
*spawn
) {
688 _cleanup_(sd_event_unrefp
) sd_event
*e
= NULL
;
689 _cleanup_(sd_event_source_disable_unrefp
) sd_event_source
*sigchld_source
= NULL
;
690 _cleanup_(sd_event_source_disable_unrefp
) sd_event_source
*stdout_source
= NULL
;
691 _cleanup_(sd_event_source_disable_unrefp
) sd_event_source
*stderr_source
= NULL
;
696 r
= sd_event_new(&e
);
698 return log_device_debug_errno(spawn
->device
, r
, "Failed to allocate sd-event object: %m");
700 if (spawn
->timeout_usec
> 0) {
701 usec_t usec
, age_usec
;
703 usec
= now(CLOCK_MONOTONIC
);
704 age_usec
= usec
- spawn
->event_birth_usec
;
705 if (age_usec
< spawn
->timeout_usec
) {
706 if (spawn
->timeout_warn_usec
> 0 &&
707 spawn
->timeout_warn_usec
< spawn
->timeout_usec
&&
708 spawn
->timeout_warn_usec
> age_usec
) {
709 spawn
->timeout_warn_usec
-= age_usec
;
711 r
= sd_event_add_time(e
, NULL
, CLOCK_MONOTONIC
,
712 usec
+ spawn
->timeout_warn_usec
, USEC_PER_SEC
,
713 on_spawn_timeout_warning
, spawn
);
715 return log_device_debug_errno(spawn
->device
, r
, "Failed to create timeout warning event source: %m");
718 spawn
->timeout_usec
-= age_usec
;
720 r
= sd_event_add_time(e
, NULL
, CLOCK_MONOTONIC
,
721 usec
+ spawn
->timeout_usec
, USEC_PER_SEC
, on_spawn_timeout
, spawn
);
723 return log_device_debug_errno(spawn
->device
, r
, "Failed to create timeout event source: %m");
727 if (spawn
->fd_stdout
>= 0) {
728 r
= sd_event_add_io(e
, &stdout_source
, spawn
->fd_stdout
, EPOLLIN
, on_spawn_io
, spawn
);
730 return log_device_debug_errno(spawn
->device
, r
, "Failed to create stdio event source: %m");
731 r
= sd_event_source_set_enabled(stdout_source
, SD_EVENT_ONESHOT
);
733 return log_device_debug_errno(spawn
->device
, r
, "Failed to enable stdio event source: %m");
736 if (spawn
->fd_stderr
>= 0) {
737 r
= sd_event_add_io(e
, &stderr_source
, spawn
->fd_stderr
, EPOLLIN
, on_spawn_io
, spawn
);
739 return log_device_debug_errno(spawn
->device
, r
, "Failed to create stderr event source: %m");
740 r
= sd_event_source_set_enabled(stderr_source
, SD_EVENT_ONESHOT
);
742 return log_device_debug_errno(spawn
->device
, r
, "Failed to enable stderr event source: %m");
745 r
= sd_event_add_child(e
, &sigchld_source
, spawn
->pid
, WEXITED
, on_spawn_sigchld
, spawn
);
747 return log_device_debug_errno(spawn
->device
, r
, "Failed to create sigchild event source: %m");
748 /* SIGCHLD should be processed after IO is complete */
749 r
= sd_event_source_set_priority(sigchld_source
, SD_EVENT_PRIORITY_NORMAL
+ 1);
751 return log_device_debug_errno(spawn
->device
, r
, "Failed to set priority to sigchild event source: %m");
753 return sd_event_loop(e
);
756 int udev_event_spawn(
764 bool *ret_truncated
) {
766 _cleanup_close_pair_
int outpipe
[2] = PIPE_EBADF
, errpipe
[2] = PIPE_EBADF
;
767 _cleanup_strv_free_
char **argv
= NULL
;
775 assert(result
|| ressize
== 0);
777 /* pipes from child to parent */
778 if (result
|| log_get_max_level() >= LOG_INFO
)
779 if (pipe2(outpipe
, O_NONBLOCK
|O_CLOEXEC
) != 0)
780 return log_device_error_errno(event
->dev
, errno
,
781 "Failed to create pipe for command '%s': %m", cmd
);
783 if (log_get_max_level() >= LOG_INFO
)
784 if (pipe2(errpipe
, O_NONBLOCK
|O_CLOEXEC
) != 0)
785 return log_device_error_errno(event
->dev
, errno
,
786 "Failed to create pipe for command '%s': %m", cmd
);
788 r
= strv_split_full(&argv
, cmd
, NULL
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
| EXTRACT_RETAIN_ESCAPE
);
790 return log_device_error_errno(event
->dev
, r
, "Failed to split command: %m");
792 if (isempty(argv
[0]))
793 return log_device_error_errno(event
->dev
, SYNTHETIC_ERRNO(EINVAL
),
794 "Invalid command '%s'", cmd
);
796 /* allow programs in /usr/lib/udev/ to be called without the path */
797 if (!path_is_absolute(argv
[0])) {
800 program
= path_join(UDEVLIBEXECDIR
, argv
[0]);
804 free_and_replace(argv
[0], program
);
807 r
= device_get_properties_strv(event
->dev
, &envp
);
809 return log_device_error_errno(event
->dev
, r
, "Failed to get device properties");
811 log_device_debug(event
->dev
, "Starting '%s'", cmd
);
813 r
= safe_fork("(spawn)", FORK_RESET_SIGNALS
|FORK_DEATHSIG
|FORK_LOG
, &pid
);
815 return log_device_error_errno(event
->dev
, r
,
816 "Failed to fork() to execute command '%s': %m", cmd
);
818 if (rearrange_stdio(-1, TAKE_FD(outpipe
[WRITE_END
]), TAKE_FD(errpipe
[WRITE_END
])) < 0)
821 (void) close_all_fds(NULL
, 0);
822 (void) rlimit_nofile_safe();
824 DEVICE_TRACE_POINT(spawn_exec
, event
->dev
, cmd
);
826 execve(argv
[0], argv
, envp
);
830 /* parent closed child's ends of pipes */
831 outpipe
[WRITE_END
] = safe_close(outpipe
[WRITE_END
]);
832 errpipe
[WRITE_END
] = safe_close(errpipe
[WRITE_END
]);
835 .device
= event
->dev
,
838 .accept_failure
= accept_failure
,
839 .timeout_warn_usec
= udev_warn_timeout(timeout_usec
),
840 .timeout_usec
= timeout_usec
,
841 .timeout_signal
= timeout_signal
,
842 .event_birth_usec
= event
->birth_usec
,
843 .fd_stdout
= outpipe
[READ_END
],
844 .fd_stderr
= errpipe
[READ_END
],
846 .result_size
= ressize
,
848 r
= spawn_wait(&spawn
);
850 return log_device_error_errno(event
->dev
, r
,
851 "Failed to wait for spawned command '%s': %m", cmd
);
854 result
[spawn
.result_len
] = '\0';
857 *ret_truncated
= spawn
.truncated
;
859 return r
; /* 0 for success, and positive if the program failed */
862 static int rename_netif(UdevEvent
*event
) {
870 return 0; /* No new name is requested. */
872 dev
= ASSERT_PTR(event
->dev
);
874 /* Read sysname from cloned sd-device object, otherwise use-after-free is triggered, as the
875 * main object will be renamed and dev->sysname will be freed in device_rename(). */
876 r
= sd_device_get_sysname(event
->dev_db_clone
, &oldname
);
878 return log_device_error_errno(dev
, r
, "Failed to get sysname: %m");
880 if (streq(event
->name
, oldname
))
881 return 0; /* The interface name is already requested name. */
883 if (!device_for_action(dev
, SD_DEVICE_ADD
))
884 return 0; /* Rename the interface only when it is added. */
886 r
= sd_device_get_ifindex(dev
, &ifindex
);
888 return 0; /* Device is not a network interface. */
890 return log_device_error_errno(dev
, r
, "Failed to get ifindex: %m");
892 if (naming_scheme_has(NAMING_REPLACE_STRICTLY
) &&
893 !ifname_valid(event
->name
)) {
894 log_device_warning(dev
, "Invalid network interface name, ignoring: %s", event
->name
);
898 /* Set ID_RENAMING boolean property here. It will be dropped when the corresponding move uevent is processed. */
899 r
= device_add_property(dev
, "ID_RENAMING", "1");
901 return log_device_warning_errno(dev
, r
, "Failed to add 'ID_RENAMING' property: %m");
903 r
= device_rename(dev
, event
->name
);
905 return log_device_warning_errno(dev
, r
, "Failed to update properties with new name '%s': %m", event
->name
);
907 /* Also set ID_RENAMING boolean property to cloned sd_device object and save it to database
908 * before calling rtnl_set_link_name(). Otherwise, clients (e.g., systemd-networkd) may receive
909 * RTM_NEWLINK netlink message before the database is updated. */
910 r
= device_add_property(event
->dev_db_clone
, "ID_RENAMING", "1");
912 return log_device_warning_errno(event
->dev_db_clone
, r
, "Failed to add 'ID_RENAMING' property: %m");
914 r
= device_update_db(event
->dev_db_clone
);
916 return log_device_debug_errno(event
->dev_db_clone
, r
, "Failed to update database under /run/udev/data/: %m");
918 r
= rtnl_set_link_name(&event
->rtnl
, ifindex
, event
->name
);
920 log_device_info(dev
, "Network interface '%s' is already up, cannot rename to '%s'.",
921 oldname
, event
->name
);
925 return log_device_error_errno(dev
, r
, "Failed to rename network interface %i from '%s' to '%s': %m",
926 ifindex
, oldname
, event
->name
);
928 log_device_debug(dev
, "Network interface %i is renamed from '%s' to '%s'", ifindex
, oldname
, event
->name
);
933 static int update_devnode(UdevEvent
*event
) {
934 sd_device
*dev
= ASSERT_PTR(ASSERT_PTR(event
)->dev
);
937 r
= sd_device_get_devnum(dev
, NULL
);
941 return log_device_error_errno(dev
, r
, "Failed to get devnum: %m");
943 if (!uid_is_valid(event
->uid
)) {
944 r
= device_get_devnode_uid(dev
, &event
->uid
);
945 if (r
< 0 && r
!= -ENOENT
)
946 return log_device_error_errno(dev
, r
, "Failed to get devnode UID: %m");
949 if (!gid_is_valid(event
->gid
)) {
950 r
= device_get_devnode_gid(dev
, &event
->gid
);
951 if (r
< 0 && r
!= -ENOENT
)
952 return log_device_error_errno(dev
, r
, "Failed to get devnode GID: %m");
955 if (event
->mode
== MODE_INVALID
) {
956 r
= device_get_devnode_mode(dev
, &event
->mode
);
957 if (r
< 0 && r
!= -ENOENT
)
958 return log_device_error_errno(dev
, r
, "Failed to get devnode mode: %m");
961 bool apply_mac
= device_for_action(dev
, SD_DEVICE_ADD
);
963 r
= udev_node_apply_permissions(dev
, apply_mac
, event
->mode
, event
->uid
, event
->gid
, event
->seclabel_list
);
965 return log_device_error_errno(dev
, r
, "Failed to apply devnode permissions: %m");
967 return udev_node_update(dev
, event
->dev_db_clone
);
970 static int event_execute_rules_on_remove(
975 Hashmap
*properties_list
,
978 sd_device
*dev
= ASSERT_PTR(ASSERT_PTR(event
)->dev
);
981 r
= device_read_db_internal(dev
, true);
983 log_device_debug_errno(dev
, r
, "Failed to read database under /run/udev/data/: %m");
985 r
= device_tag_index(dev
, NULL
, false);
987 log_device_debug_errno(dev
, r
, "Failed to remove corresponding tag files under /run/udev/tag/, ignoring: %m");
989 r
= device_delete_db(dev
);
991 log_device_debug_errno(dev
, r
, "Failed to delete database under /run/udev/data/, ignoring: %m");
993 r
= udev_watch_end(inotify_fd
, dev
);
995 log_device_warning_errno(dev
, r
, "Failed to remove inotify watch, ignoring: %m");
997 r
= udev_rules_apply_to_event(rules
, event
, timeout_usec
, timeout_signal
, properties_list
);
999 if (sd_device_get_devnum(dev
, NULL
) >= 0)
1000 (void) udev_node_remove(dev
);
1005 static int copy_all_tags(sd_device
*d
, sd_device
*s
) {
1014 FOREACH_DEVICE_TAG(s
, tag
) {
1015 r
= device_add_tag(d
, tag
, false);
1023 int udev_event_execute_rules(
1025 int inotify_fd
, /* This may be negative */
1026 usec_t timeout_usec
,
1028 Hashmap
*properties_list
,
1031 sd_device_action_t action
;
1035 dev
= ASSERT_PTR(ASSERT_PTR(event
)->dev
);
1038 r
= sd_device_get_action(dev
, &action
);
1040 return log_device_error_errno(dev
, r
, "Failed to get ACTION: %m");
1042 if (action
== SD_DEVICE_REMOVE
)
1043 return event_execute_rules_on_remove(event
, inotify_fd
, timeout_usec
, timeout_signal
, properties_list
, rules
);
1045 /* Disable watch during event processing. */
1046 r
= udev_watch_end(inotify_fd
, dev
);
1048 log_device_warning_errno(dev
, r
, "Failed to remove inotify watch, ignoring: %m");
1050 r
= device_clone_with_db(dev
, &event
->dev_db_clone
);
1052 return log_device_debug_errno(dev
, r
, "Failed to clone sd_device object: %m");
1054 r
= copy_all_tags(dev
, event
->dev_db_clone
);
1056 log_device_warning_errno(dev
, r
, "Failed to copy all tags from old database entry, ignoring: %m");
1058 /* Drop previously added property for safety to make IMPORT{db}="ID_RENAMING" not work. This is
1059 * mostly for 'move' uevent, but let's do unconditionally. Why? If a network interface is renamed in
1060 * initrd, then udevd may lose the 'move' uevent during switching root. Usually, we do not set the
1061 * persistent flag for network interfaces, but user may set it. Just for safety. */
1062 r
= device_add_property(event
->dev_db_clone
, "ID_RENAMING", NULL
);
1064 return log_device_debug_errno(dev
, r
, "Failed to remove 'ID_RENAMING' property: %m");
1066 DEVICE_TRACE_POINT(rules_start
, dev
);
1068 r
= udev_rules_apply_to_event(rules
, event
, timeout_usec
, timeout_signal
, properties_list
);
1070 return log_device_debug_errno(dev
, r
, "Failed to apply udev rules: %m");
1072 DEVICE_TRACE_POINT(rules_finished
, dev
);
1074 r
= rename_netif(event
);
1078 r
= update_devnode(event
);
1082 /* preserve old, or get new initialization timestamp */
1083 r
= device_ensure_usec_initialized(dev
, event
->dev_db_clone
);
1085 return log_device_debug_errno(dev
, r
, "Failed to set initialization timestamp: %m");
1087 /* (re)write database file */
1088 r
= device_tag_index(dev
, event
->dev_db_clone
, true);
1090 return log_device_debug_errno(dev
, r
, "Failed to update tags under /run/udev/tag/: %m");
1092 r
= device_update_db(dev
);
1094 return log_device_debug_errno(dev
, r
, "Failed to update database under /run/udev/data/: %m");
1096 device_set_is_initialized(dev
);
1101 void udev_event_execute_run(UdevEvent
*event
, usec_t timeout_usec
, int timeout_signal
) {
1102 const char *command
;
1106 ORDERED_HASHMAP_FOREACH_KEY(val
, command
, event
->run_list
) {
1107 UdevBuiltinCommand builtin_cmd
= PTR_TO_UDEV_BUILTIN_CMD(val
);
1109 if (builtin_cmd
!= _UDEV_BUILTIN_INVALID
) {
1110 log_device_debug(event
->dev
, "Running built-in command \"%s\"", command
);
1111 r
= udev_builtin_run(event
->dev
, &event
->rtnl
, builtin_cmd
, command
, false);
1113 log_device_debug_errno(event
->dev
, r
, "Failed to run built-in command \"%s\", ignoring: %m", command
);
1115 if (event
->exec_delay_usec
> 0) {
1116 log_device_debug(event
->dev
, "Delaying execution of \"%s\" for %s.",
1117 command
, FORMAT_TIMESPAN(event
->exec_delay_usec
, USEC_PER_SEC
));
1118 (void) usleep(event
->exec_delay_usec
);
1121 log_device_debug(event
->dev
, "Running command \"%s\"", command
);
1123 r
= udev_event_spawn(event
, timeout_usec
, timeout_signal
, false, command
, NULL
, 0, NULL
);
1125 log_device_warning_errno(event
->dev
, r
, "Failed to execute '%s', ignoring: %m", command
);
1126 else if (r
> 0) /* returned value is positive when program fails */
1127 log_device_debug(event
->dev
, "Command \"%s\" returned %d (error), ignoring.", command
, r
);