chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
networkctl: show interface names next to IP addresses if we dump adresses from all...
[elogind.git]
/
src
/
udev
/
udevd.c
diff --git
a/src/udev/udevd.c
b/src/udev/udevd.c
index 305ce86cdf5a021b2ab506ba6762c98a323c6d48..8bec03e77f0e0874e2396a3f02bb15d178dd2f1b 100644
(file)
--- a/
src/udev/udevd.c
+++ b/
src/udev/udevd.c
@@
-54,12
+54,6
@@
#include "dev-setup.h"
#include "fileio.h"
#include "dev-setup.h"
#include "fileio.h"
-void udev_main_log(struct udev *udev, int priority,
- const char *file, int line, const char *fn,
- const char *format, va_list args) {
- log_metav(priority, file, line, fn, format, args);
-}
-
static struct udev_rules *rules;
static struct udev_ctrl *udev_ctrl;
static struct udev_monitor *monitor;
static struct udev_rules *rules;
static struct udev_ctrl *udev_ctrl;
static struct udev_monitor *monitor;
@@
-81,6
+75,7
@@
static sigset_t sigmask_orig;
static UDEV_LIST(event_list);
static UDEV_LIST(worker_list);
static char *udev_cgroup;
static UDEV_LIST(event_list);
static UDEV_LIST(worker_list);
static char *udev_cgroup;
+static struct udev_list properties_list;
static bool udev_exit;
enum event_state {
static bool udev_exit;
enum event_state {
@@
-225,14
+220,14
@@
static void worker_new(struct event *event) {
sigfillset(&mask);
fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
if (fd_signal < 0) {
sigfillset(&mask);
fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
if (fd_signal < 0) {
- log_error
(
"error creating signalfd %m");
+ log_error
_errno(errno,
"error creating signalfd %m");
rc = 2;
goto out;
}
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
rc = 2;
goto out;
}
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
- log_error
(
"error creating epoll fd: %m");
+ log_error
_errno(errno,
"error creating epoll fd: %m");
rc = 3;
goto out;
}
rc = 3;
goto out;
}
@@
-248,7
+243,7
@@
static void worker_new(struct event *event) {
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) {
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) {
- log_error
(
"fail to add fds to epoll: %m");
+ log_error
_errno(errno,
"fail to add fds to epoll: %m");
rc = 4;
goto out;
}
rc = 4;
goto out;
}
@@
-298,7
+293,7
@@
static void worker_new(struct event *event) {
if (d) {
fd_lock = open(udev_device_get_devnode(d), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
if (d) {
fd_lock = open(udev_device_get_devnode(d), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
- log_debug
(
"Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
+ log_debug
_errno(errno,
"Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
err = -EWOULDBLOCK;
fd_lock = safe_close(fd_lock);
goto skip;
err = -EWOULDBLOCK;
fd_lock = safe_close(fd_lock);
goto skip;
@@
-310,12
+305,19
@@
static void worker_new(struct event *event) {
udev_event->rtnl = rtnl;
/* apply rules, create node, symlinks */
udev_event->rtnl = rtnl;
/* apply rules, create node, symlinks */
- udev_event_execute_rules(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, rules, &sigmask_orig);
+ udev_event_execute_rules(udev_event,
+ arg_event_timeout_usec, arg_event_timeout_warn_usec,
+ &properties_list,
+ rules,
+ &sigmask_orig);
- udev_event_execute_run(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, &sigmask_orig);
+ udev_event_execute_run(udev_event,
+ arg_event_timeout_usec, arg_event_timeout_warn_usec,
+ &sigmask_orig);
- /* in case rtnl was initialized */
- rtnl = sd_rtnl_ref(udev_event->rtnl);
+ if (udev_event->rtnl)
+ /* in case rtnl was initialized */
+ rtnl = sd_rtnl_ref(udev_event->rtnl);
/* apply/restore inotify watch */
if (udev_event->inotify_watch) {
/* apply/restore inotify watch */
if (udev_event->inotify_watch) {
@@
-357,7
+359,7
@@
skip:
if (fdcount < 0) {
if (errno == EINTR)
continue;
if (fdcount < 0) {
if (errno == EINTR)
continue;
- log_error
(
"failed to poll: %m");
+ log_error
_errno(errno,
"failed to poll: %m");
goto out;
}
goto out;
}
@@
-397,7
+399,7
@@
out:
udev_monitor_unref(worker_monitor);
event->state = EVENT_QUEUED;
free(worker);
udev_monitor_unref(worker_monitor);
event->state = EVENT_QUEUED;
free(worker);
- log_error
(
"fork of child failed: %m");
+ log_error
_errno(errno,
"fork of child failed: %m");
break;
default:
/* close monitor, but keep address around */
break;
default:
/* close monitor, but keep address around */
@@
-428,7
+430,7
@@
static void event_run(struct event *event) {
count = udev_monitor_send_device(monitor, worker->monitor, event->dev);
if (count < 0) {
count = udev_monitor_send_device(monitor, worker->monitor, event->dev);
if (count < 0) {
- log_error
(
"worker [%u] did not accept message %zi (%m), kill it", worker->pid, count);
+ log_error
_errno(errno,
"worker [%u] did not accept message %zi (%m), kill it", worker->pid, count);
kill(worker->pid, SIGKILL);
worker->state = WORKER_KILLED;
continue;
kill(worker->pid, SIGKILL);
worker->state = WORKER_KILLED;
continue;
@@
-644,7
+646,6
@@
static struct udev_ctrl_connection *handle_ctrl_msg(struct udev_ctrl *uctrl) {
if (i >= 0) {
log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i);
log_set_max_level(i);
if (i >= 0) {
log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i);
log_set_max_level(i);
- udev_set_log_priority(udev, i);
worker_kill(udev);
}
worker_kill(udev);
}
@@
-677,10
+678,10
@@
static struct udev_ctrl_connection *handle_ctrl_msg(struct udev_ctrl *uctrl) {
val = &val[1];
if (val[0] == '\0') {
log_debug("udevd message (ENV) received, unset '%s'", key);
val = &val[1];
if (val[0] == '\0') {
log_debug("udevd message (ENV) received, unset '%s'", key);
- udev_
add_property(udev
, key, NULL);
+ udev_
list_entry_add(&properties_list
, key, NULL);
} else {
log_debug("udevd message (ENV) received, set '%s=%s'", key, val);
} else {
log_debug("udevd message (ENV) received, set '%s=%s'", key, val);
- udev_
add_property(udev
, key, val);
+ udev_
list_entry_add(&properties_list
, key, val);
}
} else {
log_error("wrong key format '%s'", key);
}
} else {
log_error("wrong key format '%s'", key);
@@
-815,41
+816,34
@@
static int synthesize_change(struct udev_device *dev) {
}
static int handle_inotify(struct udev *udev) {
}
static int handle_inotify(struct udev *udev) {
- int nbytes, pos;
- char *buf;
- struct inotify_event *ev;
- int r;
+ uint8_t buffer[INOTIFY_EVENT_MAX] _alignas_(struct inotify_event);
+ struct inotify_event *e;
+ ssize_t l;
- r = ioctl(fd_inotify, FIONREAD, &nbytes);
- if (r < 0 || nbytes <= 0)
- return -errno;
+ l = read(fd_inotify, buffer, sizeof(buffer));
+ if (l < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ return 0;
- buf = malloc(nbytes);
- if (!buf) {
- log_error("error getting buffer for inotify");
- return -ENOMEM;
+ return log_error_errno(errno, "Failed to read inotify fd: %m");
}
}
- nbytes = read(fd_inotify, buf, nbytes);
-
- for (pos = 0; pos < nbytes; pos += sizeof(struct inotify_event) + ev->len) {
+ FOREACH_INOTIFY_EVENT(e, buffer, l) {
struct udev_device *dev;
struct udev_device *dev;
- ev = (struct inotify_event *)(buf + pos);
- dev = udev_watch_lookup(udev, ev->wd);
+ dev = udev_watch_lookup(udev, e->wd);
if (!dev)
continue;
if (!dev)
continue;
- log_debug("inotify event: %x for %s", e
v
->mask, udev_device_get_devnode(dev));
- if (e
v
->mask & IN_CLOSE_WRITE)
+ log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev));
+ if (e->mask & IN_CLOSE_WRITE)
synthesize_change(dev);
synthesize_change(dev);
- else if (e
v
->mask & IN_IGNORED)
+ else if (e->mask & IN_IGNORED)
udev_watch_end(udev, dev);
udev_device_unref(dev);
}
udev_watch_end(udev, dev);
udev_device_unref(dev);
}
- free(buf);
return 0;
}
return 0;
}
@@
-961,10
+955,10
@@
static void kernel_cmdline_options(struct udev *udev) {
int r;
r = proc_cmdline(&line);
int r;
r = proc_cmdline(&line);
- if (r < 0)
- log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
- if (r <= 0)
+ if (r < 0) {
+ log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
return;
return;
+ }
FOREACH_WORD_QUOTED(word, l, line, state) {
char *s, *opt, *value;
FOREACH_WORD_QUOTED(word, l, line, state) {
char *s, *opt, *value;
@@
-984,7
+978,6
@@
static void kernel_cmdline_options(struct udev *udev) {
prio = util_log_priority(value);
log_set_max_level(prio);
prio = util_log_priority(value);
log_set_max_level(prio);
- udev_set_log_priority(udev, prio);
} else if ((value = startswith(opt, "udev.children-max="))) {
r = safe_atoi(value, &arg_children_max);
if (r < 0)
} else if ((value = startswith(opt, "udev.children-max="))) {
r = safe_atoi(value, &arg_children_max);
if (r < 0)
@@
-1120,19
+1113,14
@@
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
log_parse_environment();
log_open();
- udev_set_log_fn(udev, udev_main_log);
- log_set_max_level(udev_get_log_priority(udev));
-
r = parse_argv(argc, argv);
if (r <= 0)
goto exit;
kernel_cmdline_options(udev);
r = parse_argv(argc, argv);
if (r <= 0)
goto exit;
kernel_cmdline_options(udev);
- if (arg_debug)
{
+ if (arg_debug)
log_set_max_level(LOG_DEBUG);
log_set_max_level(LOG_DEBUG);
- udev_set_log_priority(udev, LOG_DEBUG);
- }
if (getuid() != 0) {
log_error("root privileges required");
if (getuid() != 0) {
log_error("root privileges required");
@@
-1141,22
+1129,24
@@
int main(int argc, char *argv[]) {
r = mac_selinux_init("/dev");
if (r < 0) {
r = mac_selinux_init("/dev");
if (r < 0) {
- log_error
("could not initialize labelling: %s", strerror(-r)
);
+ log_error
_errno(r, "could not initialize labelling: %m"
);
goto exit;
}
/* set umask before creating any file/directory */
r = chdir("/");
if (r < 0) {
goto exit;
}
/* set umask before creating any file/directory */
r = chdir("/");
if (r < 0) {
- log_error
(
"could not change dir to /: %m");
+ log_error
_errno(errno,
"could not change dir to /: %m");
goto exit;
}
umask(022);
goto exit;
}
umask(022);
+ udev_list_init(udev, &properties_list, true);
+
r = mkdir("/run/udev", 0755);
if (r < 0 && errno != EEXIST) {
r = mkdir("/run/udev", 0755);
if (r < 0 && errno != EEXIST) {
- log_error
(
"could not create /run/udev: %m");
+ log_error
_errno(errno,
"could not create /run/udev: %m");
goto exit;
}
goto exit;
}
@@
-1215,6
+1205,8
@@
int main(int argc, char *argv[]) {
goto exit;
}
fd_netlink = udev_monitor_get_fd(monitor);
goto exit;
}
fd_netlink = udev_monitor_get_fd(monitor);
+
+ udev_monitor_set_receive_buffer_size(monitor, 128 * 1024 * 1024);
}
if (udev_monitor_enable_receiving(monitor) < 0) {
}
if (udev_monitor_enable_receiving(monitor) < 0) {
@@
-1229,9
+1221,7
@@
int main(int argc, char *argv[]) {
goto exit;
}
goto exit;
}
- udev_monitor_set_receive_buffer_size(monitor, 128 * 1024 * 1024);
-
- log_info("starting version " VERSION "\n");
+ log_info("starting version " VERSION);
udev_builtin_init(udev);
udev_builtin_init(udev);
@@
-1243,7
+1233,7
@@
int main(int argc, char *argv[]) {
rc = udev_rules_apply_static_dev_perms(rules);
if (rc < 0)
rc = udev_rules_apply_static_dev_perms(rules);
if (rc < 0)
- log_error
("failed to apply permissions on static device nodes - %s", strerror(-rc)
);
+ log_error
_errno(rc, "failed to apply permissions on static device nodes - %m"
);
if (arg_daemonize) {
pid_t pid;
if (arg_daemonize) {
pid_t pid;
@@
-1253,7
+1243,7
@@
int main(int argc, char *argv[]) {
case 0:
break;
case -1:
case 0:
break;
case -1:
- log_error
(
"fork of daemon failed: %m");
+ log_error
_errno(errno,
"fork of daemon failed: %m");
rc = 4;
goto exit;
default:
rc = 4;
goto exit;
default:
@@
-1316,7
+1306,7
@@
int main(int argc, char *argv[]) {
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
- log_error
(
"error creating epoll fd: %m");
+ log_error
_errno(errno,
"error creating epoll fd: %m");
goto exit;
}
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_ctrl, &ep_ctrl) < 0 ||
goto exit;
}
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_ctrl, &ep_ctrl) < 0 ||
@@
-1324,7
+1314,7
@@
int main(int argc, char *argv[]) {
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_netlink, &ep_netlink) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_worker, &ep_worker) < 0) {
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_netlink, &ep_netlink) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_worker, &ep_worker) < 0) {
- log_error
(
"fail to add fds to epoll: %m");
+ log_error
_errno(errno,
"fail to add fds to epoll: %m");
goto exit;
}
goto exit;
}
@@
-1542,6
+1532,7
@@
exit_daemonize:
udev_monitor_unref(monitor);
udev_ctrl_connection_unref(ctrl_conn);
udev_ctrl_unref(udev_ctrl);
udev_monitor_unref(monitor);
udev_ctrl_connection_unref(ctrl_conn);
udev_ctrl_unref(udev_ctrl);
+ udev_list_cleanup(&properties_list);
mac_selinux_finish();
udev_unref(udev);
log_close();
mac_selinux_finish();
udev_unref(udev);
log_close();