summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/udev/udevd.c74
1 files changed, 32 insertions, 42 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 64ef25f38a..89681caf82 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -225,7 +225,7 @@ static void worker_spawn(struct event *event) {
int fd_monitor;
struct epoll_event ep_signal, ep_monitor;
sigset_t mask;
- int rc = EXIT_SUCCESS;
+ int r = 0;
/* take initial device from queue */
dev = event->dev;
@@ -242,15 +242,13 @@ static void worker_spawn(struct event *event) {
sigfillset(&mask);
fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
if (fd_signal < 0) {
- log_error_errno(errno, "error creating signalfd %m");
- rc = 2;
+ r = log_error_errno(errno, "error creating signalfd %m");
goto out;
}
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
- log_error_errno(errno, "error creating epoll fd: %m");
- rc = 3;
+ r = log_error_errno(errno, "error creating epoll fd: %m");
goto out;
}
@@ -265,8 +263,7 @@ static void worker_spawn(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) {
- log_error_errno(errno, "fail to add fds to epoll: %m");
- rc = 4;
+ r = log_error_errno(errno, "fail to add fds to epoll: %m");
goto out;
}
@@ -279,12 +276,12 @@ static void worker_spawn(struct event *event) {
for (;;) {
struct udev_event *udev_event;
struct worker_message msg;
- int fd_lock = -1, r;
+ int fd_lock = -1;
log_debug("seq %llu running", udev_device_get_seqnum(dev));
udev_event = udev_event_new(dev);
if (udev_event == NULL) {
- rc = 5;
+ r = -ENOMEM;
goto out;
}
@@ -316,6 +313,7 @@ static void worker_spawn(struct event *event) {
if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) {
log_debug_errno(errno, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
fd_lock = safe_close(fd_lock);
+ r = -EAGAIN;
goto skip;
}
}
@@ -373,7 +371,7 @@ skip:
if (fdcount < 0) {
if (errno == EINTR)
continue;
- log_error_errno(errno, "failed to poll: %m");
+ r = log_error_errno(errno, "failed to poll: %m");
goto out;
}
@@ -406,7 +404,7 @@ out:
udev_builtin_exit(udev);
udev_unref(udev);
log_close();
- exit(rc);
+ exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
}
case -1:
event->state = EVENT_QUEUED;
@@ -1138,11 +1136,13 @@ int main(int argc, char *argv[]) {
struct epoll_event ep_netlink = { .events = EPOLLIN };
struct epoll_event ep_worker = { .events = EPOLLIN };
struct udev_ctrl_connection *ctrl_conn = NULL;
- int rc = 1, r, one = 1;
+ int r = 0, one = 1;
udev = udev_new();
- if (udev == NULL)
+ if (!udev) {
+ r = log_error_errno(errno, "could not allocate udev context: %m");
goto exit;
+ }
log_set_target(LOG_TARGET_AUTO);
log_open();
@@ -1159,7 +1159,7 @@ int main(int argc, char *argv[]) {
log_set_max_level(LOG_DEBUG);
if (getuid() != 0) {
- log_error("root privileges required");
+ r = log_error_errno(EPERM, "root privileges required");
goto exit;
}
@@ -1172,7 +1172,7 @@ int main(int argc, char *argv[]) {
/* set umask before creating any file/directory */
r = chdir("/");
if (r < 0) {
- log_error_errno(errno, "could not change dir to /: %m");
+ r = log_error_errno(errno, "could not change dir to /: %m");
goto exit;
}
@@ -1182,7 +1182,7 @@ int main(int argc, char *argv[]) {
r = mkdir(UDEV_ROOT_RUN "/udev", 0755);
if (r < 0 && errno != EEXIST) {
- log_error_errno(errno, "could not create " UDEV_ROOT_RUN "/udev: %m");
+ r = log_error_errno(errno, "could not create " UDEV_ROOT_RUN "/udev: %m");
goto exit;
}
@@ -1207,30 +1207,26 @@ int main(int argc, char *argv[]) {
/* open control and netlink socket */
udev_ctrl = udev_ctrl_new(udev);
- if (udev_ctrl == NULL) {
- log_error("error initializing udev control socket");
- rc = 1;
+ if (!udev_ctrl) {
+ r = log_error_errno(EINVAL, "error initializing udev control socket");
goto exit;
}
fd_ctrl = udev_ctrl_get_fd(udev_ctrl);
monitor = udev_monitor_new_from_netlink(udev, "kernel");
- if (monitor == NULL) {
- log_error("error initializing netlink socket");
- rc = 3;
+ if (!monitor) {
+ r = log_error_errno(EINVAL, "error initializing netlink socket");
goto exit;
}
fd_netlink = udev_monitor_get_fd(monitor);
if (udev_monitor_enable_receiving(monitor) < 0) {
- log_error("error binding netlink socket");
- rc = 3;
+ r = log_error_errno(EINVAL, "error binding netlink socket");
goto exit;
}
if (udev_ctrl_enable_receiving(udev_ctrl) < 0) {
- log_error("error binding udev control socket");
- rc = 1;
+ r = log_error_errno(EINVAL, "error binding udev control socket");
goto exit;
}
@@ -1241,14 +1237,14 @@ int main(int argc, char *argv[]) {
udev_builtin_init(udev);
rules = udev_rules_new(udev, arg_resolve_names);
- if (rules == NULL) {
- log_error("error reading rules");
+ if (!rules) {
+ r = log_error_errno(ENOMEM, "error reading rules");
goto exit;
}
- rc = udev_rules_apply_static_dev_perms(rules);
- if (rc < 0)
- log_error_errno(rc, "failed to apply permissions on static device nodes - %m");
+ r = udev_rules_apply_static_dev_perms(rules);
+ if (r < 0)
+ log_error_errno(r, "failed to apply permissions on static device nodes: %m");
if (arg_daemonize) {
pid_t pid;
@@ -1258,11 +1254,9 @@ int main(int argc, char *argv[]) {
case 0:
break;
case -1:
- log_error_errno(errno, "fork of daemon failed: %m");
- rc = 4;
+ r = log_error_errno(errno, "fork of daemon failed: %m");
goto exit;
default:
- rc = EXIT_SUCCESS;
goto exit_daemonize;
}
@@ -1287,8 +1281,7 @@ int main(int argc, char *argv[]) {
fd_inotify = udev_watch_init(udev);
if (fd_inotify < 0) {
- log_error("error initializing inotify");
- rc = 4;
+ r = log_error_errno(ENOMEM, "error initializing inotify");
goto exit;
}
/* watch rules.d paths for changes */
@@ -1310,15 +1303,13 @@ int main(int argc, char *argv[]) {
sigprocmask(SIG_SETMASK, &mask, &sigmask_orig);
fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
if (fd_signal < 0) {
- log_error("error creating signalfd");
- rc = 5;
+ r = log_error_errno(errno, "error creating signalfd");
goto exit;
}
/* unnamed socket from workers to the main daemon */
if (socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, worker_watch) < 0) {
- log_error("error creating socketpair");
- rc = 6;
+ r = log_error_errno(errno, "error creating socketpair");
goto exit;
}
fd_worker = worker_watch[READ_END];
@@ -1549,7 +1540,6 @@ int main(int argc, char *argv[]) {
ctrl_conn = handle_ctrl_msg(udev_ctrl);
}
- rc = EXIT_SUCCESS;
exit:
udev_ctrl_cleanup(udev_ctrl);
unlink(UDEV_ROOT_RUN "/udev/queue");
@@ -1572,5 +1562,5 @@ exit_daemonize:
mac_selinux_finish();
udev_unref(udev);
log_close();
- return rc;
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}