summaryrefslogtreecommitdiff
path: root/src/udev/udevd.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-11-20 16:43:19 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-11-21 09:14:00 +0100
commit0c5a109a25c4dec759a012eeb8cd5146081f25f2 (patch)
treefb7ae3520a4df473f91592cd9e7f9ed879982037 /src/udev/udevd.c
parent138715dc1231c3c255afdc307a23ca87a04ef31a (diff)
downloadsystemd-0c5a109a25c4dec759a012eeb8cd5146081f25f2.tar.gz
udevd: define main through macro
This removes the call to log_close(), and refactors how fork() is done. Now the parent also goes through normal cleanup. This isn't necessary to use the macro, but it feels cleaner this way.
Diffstat (limited to 'src/udev/udevd.c')
-rw-r--r--src/udev/udevd.c59
1 files changed, 22 insertions, 37 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index c1c266e8c6..1f7b66c7da 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -46,6 +46,7 @@
#include "io-util.h"
#include "libudev-device-internal.h"
#include "list.h"
+#include "main-func.h"
#include "mkdir.h"
#include "netlink-util.h"
#include "parse-util.h"
@@ -1715,7 +1716,7 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg
return 0;
}
-static int run(int fd_ctrl, int fd_uevent, const char *cgroup) {
+static int main_loop(int fd_ctrl, int fd_uevent, const char *cgroup) {
_cleanup_(manager_freep) Manager *manager = NULL;
int r;
@@ -1750,7 +1751,7 @@ exit:
return r;
}
-int main(int argc, char *argv[]) {
+static int run(int argc, char *argv[]) {
_cleanup_free_ char *cgroup = NULL;
int fd_ctrl = -1, fd_uevent = -1;
int r;
@@ -1762,7 +1763,7 @@ int main(int argc, char *argv[]) {
r = parse_argv(argc, argv);
if (r <= 0)
- goto exit;
+ return r;
r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
if (r < 0)
@@ -1777,7 +1778,7 @@ int main(int argc, char *argv[]) {
r = must_be_root();
if (r < 0)
- goto exit;
+ return r;
if (arg_children_max == 0) {
cpu_set_t cpu_set;
@@ -1796,24 +1797,18 @@ int main(int argc, char *argv[]) {
/* set umask before creating any file/directory */
r = chdir("/");
- if (r < 0) {
- r = log_error_errno(errno, "Failed to change dir to '/': %m");
- goto exit;
- }
+ if (r < 0)
+ return log_error_errno(errno, "Failed to change dir to '/': %m");
umask(022);
r = mac_selinux_init();
- if (r < 0) {
- log_error_errno(r, "could not initialize labelling: %m");
- goto exit;
- }
+ if (r < 0)
+ return log_error_errno(r, "Could not initialize labelling: %m");
r = mkdir_errno_wrapper("/run/udev", 0755);
- if (r < 0 && r != -EEXIST) {
- log_error_errno(r, "Failed to create /run/udev: %m");
- goto exit;
- }
+ if (r < 0 && r != -EEXIST)
+ return log_error_errno(r, "Failed to create /run/udev: %m");
dev_setup(NULL, UID_INVALID, GID_INVALID);
@@ -1831,10 +1826,8 @@ int main(int argc, char *argv[]) {
}
r = listen_fds(&fd_ctrl, &fd_uevent);
- if (r < 0) {
- r = log_error_errno(r, "Failed to listen on fds: %m");
- goto exit;
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to listen on fds: %m");
if (arg_daemonize) {
pid_t pid;
@@ -1849,18 +1842,13 @@ int main(int argc, char *argv[]) {
}
pid = fork();
- switch (pid) {
- case 0:
- break;
- case -1:
- r = log_error_errno(errno, "Failed to fork daemon: %m");
- goto exit;
- default:
- mac_selinux_finish();
- log_close();
- _exit(EXIT_SUCCESS);
- }
+ if (pid < 0)
+ return log_error_errno(errno, "Failed to fork daemon: %m");
+ if (pid > 0)
+ /* parent */
+ return 0;
+ /* child */
setsid();
r = set_oom_score_adjust(-1000);
@@ -1868,10 +1856,7 @@ int main(int argc, char *argv[]) {
log_debug_errno(r, "Failed to adjust OOM score, ignoring: %m");
}
- r = run(fd_ctrl, fd_uevent, cgroup);
-
-exit:
- mac_selinux_finish();
- log_close();
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ return main_loop(fd_ctrl, fd_uevent, cgroup);
}
+
+DEFINE_MAIN_FUNCTION(run);