From 6b9306b29c0360030fc4ecd4d0f739502bc459d3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:21:08 +0900 Subject: [PATCH 01/15] veritysetup: use static destructors and define main through macro This also changes the return value when crypt_init_by_name() fails in 'detach'. --- src/veritysetup/veritysetup.c | 91 +++++++++++++---------------------- 1 file changed, 33 insertions(+), 58 deletions(-) diff --git a/src/veritysetup/veritysetup.c b/src/veritysetup/veritysetup.c index dbfd361d87..9c2fe9a1b4 100644 --- a/src/veritysetup/veritysetup.c +++ b/src/veritysetup/veritysetup.c @@ -8,6 +8,7 @@ #include "crypt-util.h" #include "hexdecoct.h" #include "log.h" +#include "main-func.h" #include "pretty-print.h" #include "string-util.h" #include "terminal-util.h" @@ -16,6 +17,10 @@ static char *arg_root_hash = NULL; static char *arg_data_what = NULL; static char *arg_hash_what = NULL; +STATIC_DESTRUCTOR_REGISTER(arg_root_hash, freep); +STATIC_DESTRUCTOR_REGISTER(arg_data_what, freep); +STATIC_DESTRUCTOR_REGISTER(arg_hash_what, freep); + static int help(void) { _cleanup_free_ char *link = NULL; int r; @@ -36,20 +41,15 @@ static int help(void) { return 0; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(crypt_freep) struct crypt_device *cd = NULL; int r; - if (argc <= 1) { - r = help(); - goto finish; - } + if (argc <= 1) + return help(); - if (argc < 3) { - log_error("This program requires at least two arguments."); - r = -EINVAL; - goto finish; - } + if (argc < 3) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires at least two arguments."); log_setup_service(); @@ -60,82 +60,57 @@ int main(int argc, char *argv[]) { crypt_status_info status; size_t l; - if (argc < 6) { - log_error("attach requires at least two arguments."); - r = -EINVAL; - goto finish; - } + if (argc < 6) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "attach requires at least two arguments."); r = unhexmem(argv[5], strlen(argv[5]), &m, &l); - if (r < 0) { - log_error("Failed to parse root hash."); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to parse root hash: %m"); r = crypt_init(&cd, argv[4]); - if (r < 0) { - log_error_errno(r, "Failed to open verity device %s: %m", argv[4]); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to open verity device %s: %m", argv[4]); crypt_set_log_callback(cd, cryptsetup_log_glue, NULL); status = crypt_status(cd, argv[2]); if (IN_SET(status, CRYPT_ACTIVE, CRYPT_BUSY)) { log_info("Volume %s already active.", argv[2]); - r = 0; - goto finish; + return 0; } r = crypt_load(cd, CRYPT_VERITY, NULL); - if (r < 0) { - log_error_errno(r, "Failed to load verity superblock: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to load verity superblock: %m"); r = crypt_set_data_device(cd, argv[3]); - if (r < 0) { - log_error_errno(r, "Failed to configure data device: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to configure data device: %m"); r = crypt_activate_by_volume_key(cd, argv[2], m, l, CRYPT_ACTIVATE_READONLY); - if (r < 0) { - log_error_errno(r, "Failed to set up verity device: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set up verity device: %m"); } else if (streq(argv[1], "detach")) { r = crypt_init_by_name(&cd, argv[2]); if (r == -ENODEV) { log_info("Volume %s already inactive.", argv[2]); - goto finish; - } else if (r < 0) { - log_error_errno(r, "crypt_init_by_name() failed: %m"); - goto finish; + return 0; } + if (r < 0) + return log_error_errno(r, "crypt_init_by_name() failed: %m"); crypt_set_log_callback(cd, cryptsetup_log_glue, NULL); r = crypt_deactivate(cd, argv[2]); - if (r < 0) { - log_error_errno(r, "Failed to deactivate: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to deactivate: %m"); - } else { - log_error("Unknown verb %s.", argv[1]); - r = -EINVAL; - goto finish; - } + } else + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown verb %s.", argv[1]); - r = 0; - -finish: - free(arg_root_hash); - free(arg_data_what); - free(arg_hash_what); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); From 2cb52121e57534c75e8ecfcb8dd931a3ae0b5c0d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:23:27 +0900 Subject: [PATCH 02/15] veritysetup-generator: make arg_dest const --- src/veritysetup/veritysetup-generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/veritysetup/veritysetup-generator.c b/src/veritysetup/veritysetup-generator.c index 33d803cd07..338cad4228 100644 --- a/src/veritysetup/veritysetup-generator.c +++ b/src/veritysetup/veritysetup-generator.c @@ -22,7 +22,7 @@ #define SYSTEMD_VERITYSETUP_SERVICE "systemd-veritysetup@root.service" -static char *arg_dest = NULL; +static const char *arg_dest = NULL; static bool arg_enabled = true; static char *arg_root_hash = NULL; static char *arg_data_what = NULL; From d850ad9a30ec92c3c4f2d9f1240eaa5672565443 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:27:09 +0900 Subject: [PATCH 03/15] veritysetup-generator: use static destructors and define main through macro --- src/veritysetup/veritysetup-generator.c | 40 +++++++++++-------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/veritysetup/veritysetup-generator.c b/src/veritysetup/veritysetup-generator.c index 338cad4228..0f5830a6e2 100644 --- a/src/veritysetup/veritysetup-generator.c +++ b/src/veritysetup/veritysetup-generator.c @@ -13,6 +13,7 @@ #include "generator.h" #include "hexdecoct.h" #include "id128-util.h" +#include "main-func.h" #include "mkdir.h" #include "parse-util.h" #include "proc-cmdline.h" @@ -28,6 +29,10 @@ static char *arg_root_hash = NULL; static char *arg_data_what = NULL; static char *arg_hash_what = NULL; +STATIC_DESTRUCTOR_REGISTER(arg_root_hash, freep); +STATIC_DESTRUCTOR_REGISTER(arg_data_what, freep); +STATIC_DESTRUCTOR_REGISTER(arg_hash_what, freep); + static int create_device(void) { _cleanup_free_ char *u = NULL, *v = NULL, *d = NULL, *e = NULL, *u_escaped = NULL, *v_escaped = NULL, *root_hash_escaped = NULL; _cleanup_fclose_ FILE *f = NULL; @@ -199,13 +204,11 @@ static int determine_devices(void) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } + if (argc > 1 && argc != 4) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); if (argc > 1) arg_dest = argv[1]; @@ -213,33 +216,24 @@ int main(int argc, char *argv[]) { log_setup_generator(); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); - if (r < 0) { - log_warning_errno(r, "Failed to parse kernel command line: %m"); - goto finish; - } + if (r < 0) + return log_warning_errno(r, "Failed to parse kernel command line: %m"); /* For now we only support the root device on verity. Later on we might want to add support for /etc/veritytab * or similar to define additional mappings */ - if (!arg_enabled) { - r = 0; - goto finish; - } + if (!arg_enabled) + return 0; r = determine_devices(); if (r < 0) - goto finish; + return r; r = create_device(); if (r < 0) - goto finish; + return r; - r = 0; - -finish: - free(arg_root_hash); - free(arg_data_what); - free(arg_hash_what); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); From 3664cbabdd96413b433deb1f480a9509c5f10ce8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:38:06 +0900 Subject: [PATCH 04/15] update-utmp: use _cleanup_ attribute to finalize process --- src/update-utmp/update-utmp.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c index 7647aa5c74..7d66ed3357 100644 --- a/src/update-utmp/update-utmp.c +++ b/src/update-utmp/update-utmp.c @@ -30,6 +30,17 @@ typedef struct Context { #endif } Context; +static void context_clear(Context *c) { + assert(c); + + c->bus = sd_bus_flush_close_unref(c->bus); +#if HAVE_AUDIT + if (c->audit_fd >= 0) + audit_close(c->audit_fd); + c->audit_fd = -1; +#endif +} + static usec_t get_startup_time(Context *c) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; usec_t t = 0; @@ -205,7 +216,7 @@ static int on_runlevel(Context *c) { } int main(int argc, char *argv[]) { - Context c = { + _cleanup_(context_clear) Context c = { #if HAVE_AUDIT .audit_fd = -1 #endif @@ -236,8 +247,7 @@ int main(int argc, char *argv[]) { r = bus_connect_system_systemd(&c.bus); if (r < 0) { log_error_errno(r, "Failed to get D-Bus connection: %m"); - r = -EIO; - goto finish; + return EXIT_FAILURE; } log_debug("systemd-update-utmp running as pid "PID_FMT, getpid_cached()); @@ -250,17 +260,10 @@ int main(int argc, char *argv[]) { r = on_runlevel(&c); else { log_error("Unknown command %s", argv[1]); - r = -EINVAL; + return EXIT_FAILURE; } log_debug("systemd-update-utmp stopped as pid "PID_FMT, getpid_cached()); -finish: -#if HAVE_AUDIT - if (c.audit_fd >= 0) - audit_close(c.audit_fd); -#endif - - sd_bus_flush_close_unref(c.bus); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From fd1bff7db5da18fe9ec52bef2b2fdcea742e8ab2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:40:22 +0900 Subject: [PATCH 05/15] update-done: quit earlier on failure --- src/update-done/update-done.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c index 953e0fad21..c76c2d1f51 100644 --- a/src/update-done/update-done.c +++ b/src/update-done/update-done.c @@ -47,12 +47,11 @@ int main(int argc, char *argv[]) { r = mac_selinux_init(); if (r < 0) { log_error_errno(r, "SELinux setup failed: %m"); - goto finish; + return EXIT_FAILURE; } r = apply_timestamp("/etc/.updated", &st.st_mtim); q = apply_timestamp("/var/.updated", &st.st_mtim); -finish: return r < 0 || q < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From 1f47bc33499ecd75af085b0f04e54e43253a48b0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:47:12 +0900 Subject: [PATCH 06/15] timedate: define main through macro --- src/timedate/timedated.c | 55 +++++++++++++++------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index d23feb94f1..a79185a59a 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -18,6 +18,7 @@ #include "fs-util.h" #include "hashmap.h" #include "list.h" +#include "main-func.h" #include "path-util.h" #include "selinux-util.h" #include "signal-util.h" @@ -69,7 +70,7 @@ static void unit_status_info_free(UnitStatusInfo *p) { free(p); } -static void context_free(Context *c) { +static void context_clear(Context *c) { UnitStatusInfo *p; assert(c); @@ -958,8 +959,8 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } -int main(int argc, char *argv[]) { - Context context = {}; +static int run(int argc, char *argv[]) { + _cleanup_(context_clear) Context context = {}; _cleanup_(sd_event_unrefp) sd_event *event = NULL; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; @@ -968,58 +969,44 @@ int main(int argc, char *argv[]) { umask(0022); - if (argc != 1) { - log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; - } + if (argc != 1) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments."); assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0); r = sd_event_default(&event); - if (r < 0) { - log_error_errno(r, "Failed to allocate event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate event loop: %m"); (void) sd_event_set_watchdog(event, true); r = sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to install SIGINT handler: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to install SIGINT handler: %m"); r = sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to install SIGTERM handler: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to install SIGTERM handler: %m"); r = connect_bus(&context, event, &bus); if (r < 0) - goto finish; + return r; (void) sd_bus_negotiate_timestamp(bus, true); r = context_read_data(&context); - if (r < 0) { - log_error_errno(r, "Failed to read time zone data: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to read time zone data: %m"); r = context_parse_ntp_services(&context); if (r < 0) - goto finish; + return r; r = bus_event_loop_with_idle(event, bus, "org.freedesktop.timedate1", DEFAULT_EXIT_USEC, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to run event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to run event loop: %m"); -finish: - context_free(&context); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); From 1d03c5c16f3e3a9fba92905339259eab414e5c02 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 04:55:17 +0900 Subject: [PATCH 07/15] time-wait: define main through macro --- src/time-wait-sync/time-wait-sync.c | 57 ++++++++++++----------------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/src/time-wait-sync/time-wait-sync.c b/src/time-wait-sync/time-wait-sync.c index e359e35e49..d02633c9a8 100644 --- a/src/time-wait-sync/time-wait-sync.c +++ b/src/time-wait-sync/time-wait-sync.c @@ -22,6 +22,7 @@ #include "fd-util.h" #include "fs-util.h" +#include "main-func.h" #include "missing.h" #include "signal-util.h" #include "time-util.h" @@ -185,61 +186,49 @@ static int clock_state_update( return r; } -int main(int argc, char * argv[]) { - int r; +static int run(int argc, char * argv[]) { _cleanup_(sd_event_unrefp) sd_event *event; - ClockState state = { + _cleanup_(clock_state_release) ClockState state = { .timerfd_fd = -1, .inotify_fd = -1, .run_systemd_wd = -1, .run_systemd_timesync_wd = -1, }; + int r; assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0); r = sd_event_default(&event); - if (r < 0) { - log_error_errno(r, "Failed to allocate event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate event loop: %m"); r = sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to create sigterm event source: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create sigterm event source: %m"); r = sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to create sigint event source: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create sigint event source: %m"); r = sd_event_set_watchdog(event, true); - if (r < 0) { - log_error_errno(r, "Failed to create watchdog event source: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create watchdog event source: %m"); r = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); - if (r < 0) { - log_error_errno(errno, "Failed to create inotify descriptor: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(errno, "Failed to create inotify descriptor: %m"); + state.inotify_fd = r; r = sd_event_add_io(event, &state.inotify_event_source, state.inotify_fd, EPOLLIN, inotify_handler, &state); - if (r < 0) { - log_error_errno(r, "Failed to create notify event source: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create notify event source: %m"); r = inotify_add_watch(state.inotify_fd, "/run/systemd/", IN_CREATE); - if (r < 0) { - log_error_errno(errno, "Failed to watch /run/systemd/: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(errno, "Failed to watch /run/systemd/: %m"); + state.run_systemd_wd = r; (void) update_notify_run_systemd_timesync(&state); @@ -257,7 +246,7 @@ int main(int argc, char * argv[]) { if (state.adjtime_state == TIME_ERROR) log_info("Exit without adjtimex synchronized."); - finish: - clock_state_release(&state); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); From dd2fd972b7a13cbadf1f0d426640dccbe3b7796f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 05:04:32 +0900 Subject: [PATCH 08/15] sysusers: use ordered_hashmap_steal_first_key_and_value() --- src/sysusers/sysusers.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index 6f15647cc3..c2326ee9b8 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1922,9 +1922,9 @@ static int read_config_files(char **args) { int main(int argc, char *argv[]) { _cleanup_close_ int lock = -1; Iterator iterator; - int r; + char *n, **v; Item *i; - char *n; + int r; r = parse_argv(argc, argv); if (r <= 0) @@ -2015,8 +2015,8 @@ finish: ordered_hashmap_free_with_destructor(groups, item_free); ordered_hashmap_free_with_destructor(users, item_free); - while ((n = ordered_hashmap_first_key(members))) { - strv_free(ordered_hashmap_steal_first(members)); + while ((v = ordered_hashmap_steal_first_key_and_value(members, (void **) &n))) { + strv_free(v); free(n); } ordered_hashmap_free(members); From a160567e20ab067cd7ff793bc649c8f8b677965c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 05:11:31 +0900 Subject: [PATCH 09/15] socket-proxy: define main through macro --- src/socket-proxy/socket-proxyd.c | 59 +++++++++++++------------------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/src/socket-proxy/socket-proxyd.c b/src/socket-proxy/socket-proxyd.c index 62b7051073..47a2156aa2 100644 --- a/src/socket-proxy/socket-proxyd.c +++ b/src/socket-proxy/socket-proxyd.c @@ -18,6 +18,7 @@ #include "alloc-util.h" #include "fd-util.h" #include "log.h" +#include "main-func.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -74,7 +75,7 @@ static void connection_free(Connection *c) { free(c); } -static void context_free(Context *context) { +static void context_clear(Context *context) { assert(context); set_free_with_destructor(context->listen, sd_event_source_unref); @@ -616,8 +617,8 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { - Context context = {}; +static int run(int argc, char *argv[]) { + _cleanup_(context_clear) Context context = {}; int r, n, fd; log_parse_environment(); @@ -625,53 +626,41 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = sd_event_default(&context.event); - if (r < 0) { - log_error_errno(r, "Failed to allocate event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate event loop: %m"); r = sd_resolve_default(&context.resolve); - if (r < 0) { - log_error_errno(r, "Failed to allocate resolver: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate resolver: %m"); r = sd_resolve_attach_event(context.resolve, context.event, 0); - if (r < 0) { - log_error_errno(r, "Failed to attach resolver: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to attach resolver: %m"); sd_event_set_watchdog(context.event, true); - n = sd_listen_fds(1); - if (n < 0) { - log_error("Failed to receive sockets from parent."); - r = n; - goto finish; - } else if (n == 0) { - log_error("Didn't get any sockets passed in."); - r = -EINVAL; - goto finish; - } + r = sd_listen_fds(1); + if (r < 0) + return log_error_errno(r, "Failed to receive sockets from parent."); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Didn't get any sockets passed in."); + + n = r; for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) { r = add_listen_socket(&context, fd); if (r < 0) - goto finish; + return r; } r = sd_event_loop(context.event); - if (r < 0) { - log_error_errno(r, "Failed to run event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to run event loop: %m"); -finish: - context_free(&context); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); From 5f5f0afc8be86784d41306e12e85022bed1a2b8b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 05:54:44 +0900 Subject: [PATCH 10/15] rfkill: store write queue and rfkill fd in struct Context --- src/rfkill/rfkill.c | 113 ++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 61 deletions(-) diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index 977d2adb36..4bc3936ead 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -31,6 +31,11 @@ typedef struct write_queue_item { int state; } write_queue_item; +typedef struct Context { + LIST_HEAD(write_queue_item, write_queue); + int rfkill_fd; +} Context; + static struct write_queue_item* write_queue_item_free(struct write_queue_item *item) { if (!item) return NULL; @@ -205,16 +210,14 @@ static int determine_state_file( return 0; } -static int load_state( - int rfkill_fd, - const struct rfkill_event *event) { - +static int load_state(Context *c, const struct rfkill_event *event) { _cleanup_free_ char *state_file = NULL, *value = NULL; struct rfkill_event we; ssize_t l; int b, r; - assert(rfkill_fd >= 0); + assert(c); + assert(c->rfkill_fd >= 0); assert(event); if (shall_restore_state() == 0) @@ -248,7 +251,7 @@ static int load_state( .soft = b, }; - l = write(rfkill_fd, &we, sizeof(we)); + l = write(c->rfkill_fd, &we, sizeof(we)); if (l < 0) return log_error_errno(errno, "Failed to restore rfkill state for %i: %m", event->idx); if (l != sizeof(we)) @@ -259,39 +262,34 @@ static int load_state( return 0; } -static void save_state_queue_remove( - struct write_queue_item **write_queue, - int idx, - char *state_file) { - +static void save_state_queue_remove(Context *c, int idx, const char *state_file) { struct write_queue_item *item, *tmp; - LIST_FOREACH_SAFE(queue, item, tmp, *write_queue) { + assert(c); + + LIST_FOREACH_SAFE(queue, item, tmp, c->write_queue) { if ((state_file && streq(item->file, state_file)) || idx == item->rfkill_idx) { log_debug("Canceled previous save state of '%s' to %s.", one_zero(item->state), item->file); - LIST_REMOVE(queue, *write_queue, item); + LIST_REMOVE(queue, c->write_queue, item); write_queue_item_free(item); } } } -static int save_state_queue( - struct write_queue_item **write_queue, - int rfkill_fd, - const struct rfkill_event *event) { - +static int save_state_queue(Context *c, const struct rfkill_event *event) { _cleanup_free_ char *state_file = NULL; struct write_queue_item *item; int r; - assert(rfkill_fd >= 0); + assert(c); + assert(c->rfkill_fd >= 0); assert(event); r = determine_state_file(event, &state_file); if (r < 0) return r; - save_state_queue_remove(write_queue, event->idx, state_file); + save_state_queue_remove(c, event->idx, state_file); item = new0(struct write_queue_item, 1); if (!item) @@ -301,57 +299,54 @@ static int save_state_queue( item->rfkill_idx = event->idx; item->state = event->soft; - LIST_APPEND(queue, *write_queue, item); + LIST_APPEND(queue, c->write_queue, item); return 0; } -static int save_state_cancel( - struct write_queue_item **write_queue, - int rfkill_fd, - const struct rfkill_event *event) { - +static int save_state_cancel(Context *c, const struct rfkill_event *event) { _cleanup_free_ char *state_file = NULL; int r; - assert(rfkill_fd >= 0); + assert(c); + assert(c->rfkill_fd >= 0); assert(event); r = determine_state_file(event, &state_file); - save_state_queue_remove(write_queue, event->idx, state_file); + save_state_queue_remove(c, event->idx, state_file); if (r < 0) return r; return 0; } -static int save_state_write(struct write_queue_item **write_queue) { - struct write_queue_item *item, *tmp; - int result = 0; - bool error_logged = false; +static int save_state_write_one(struct write_queue_item *item) { int r; - LIST_FOREACH_SAFE(queue, item, tmp, *write_queue) { - r = write_string_file(item->file, one_zero(item->state), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC); - if (r < 0) { - result = r; - if (!error_logged) { - log_error_errno(r, "Failed to write state file %s: %m", item->file); - error_logged = true; - } else - log_warning_errno(r, "Failed to write state file %s: %m", item->file); - } else - log_debug("Saved state '%s' to %s.", one_zero(item->state), item->file); + r = write_string_file(item->file, one_zero(item->state), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC); + if (r < 0) + return log_error_errno(r, "Failed to write state file %s: %m", item->file); - LIST_REMOVE(queue, *write_queue, item); - write_queue_item_free(item); + log_debug("Saved state '%s' to %s.", one_zero(item->state), item->file); + return 0; +} + +static void context_save_and_clear(Context *c) { + struct write_queue_item *i; + + assert(c); + + while ((i = c->write_queue)) { + LIST_REMOVE(queue, c->write_queue, i); + (void) save_state_write_one(i); + write_queue_item_free(i); } - return result; + + safe_close(c->rfkill_fd); } int main(int argc, char *argv[]) { - LIST_HEAD(write_queue_item, write_queue); - _cleanup_close_ int rfkill_fd = -1; + _cleanup_(context_save_and_clear) Context c = { .rfkill_fd = -1 }; bool ready = false; int r, n; @@ -360,8 +355,6 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - LIST_HEAD_INIT(write_queue); - log_setup_service(); umask(0022); @@ -384,8 +377,8 @@ int main(int argc, char *argv[]) { } if (n == 0) { - rfkill_fd = open("/dev/rfkill", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK); - if (rfkill_fd < 0) { + c.rfkill_fd = open("/dev/rfkill", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK); + if (c.rfkill_fd < 0) { if (errno == ENOENT) { log_debug_errno(errno, "Missing rfkill subsystem, or no device present, exiting."); r = 0; @@ -396,13 +389,13 @@ int main(int argc, char *argv[]) { goto finish; } } else { - rfkill_fd = SD_LISTEN_FDS_START; + c.rfkill_fd = SD_LISTEN_FDS_START; - r = fd_nonblock(rfkill_fd, 1); if (r < 0) { log_error_errno(r, "Failed to make /dev/rfkill socket non-blocking: %m"); goto finish; } + r = fd_nonblock(c.rfkill_fd, 1); } for (;;) { @@ -410,7 +403,7 @@ int main(int argc, char *argv[]) { const char *type; ssize_t l; - l = read(rfkill_fd, &event, sizeof(event)); + l = read(c.rfkill_fd, &event, sizeof(event)); if (l < 0) { if (errno == EAGAIN) { @@ -425,7 +418,7 @@ int main(int argc, char *argv[]) { /* Hang around for a bit, maybe there's more coming */ - r = fd_wait_for_event(rfkill_fd, POLLIN, EXIT_USEC); + r = fd_wait_for_event(c.rfkill_fd, POLLIN, EXIT_USEC); if (r == -EINTR) continue; if (r < 0) { @@ -458,17 +451,17 @@ int main(int argc, char *argv[]) { case RFKILL_OP_ADD: log_debug("A new rfkill device has been added with index %i and type %s.", event.idx, type); - (void) load_state(rfkill_fd, &event); + (void) load_state(&c, &event); break; case RFKILL_OP_DEL: log_debug("An rfkill device has been removed with index %i and type %s", event.idx, type); - (void) save_state_cancel(&write_queue, rfkill_fd, &event); + (void) save_state_cancel(&c, &event); break; case RFKILL_OP_CHANGE: log_debug("An rfkill device has changed state with index %i and type %s", event.idx, type); - (void) save_state_queue(&write_queue, rfkill_fd, &event); + (void) save_state_queue(&c, &event); break; default: @@ -480,7 +473,5 @@ int main(int argc, char *argv[]) { r = 0; finish: - (void) save_state_write(&write_queue); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From 7a83c3aee06173e834ef1366bb1ffe86d258ae3c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 05:55:10 +0900 Subject: [PATCH 11/15] rfkill: define main through macro --- src/rfkill/rfkill.c | 60 ++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index 4bc3936ead..1cc887df12 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -12,6 +12,7 @@ #include "fd-util.h" #include "fileio.h" #include "io-util.h" +#include "main-func.h" #include "mkdir.h" #include "parse-util.h" #include "proc-cmdline.h" @@ -345,57 +346,44 @@ static void context_save_and_clear(Context *c) { safe_close(c->rfkill_fd); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(context_save_and_clear) Context c = { .rfkill_fd = -1 }; bool ready = false; int r, n; - if (argc > 1) { - log_error("This program requires no arguments."); - return EXIT_FAILURE; - } + if (argc > 1) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires no arguments."); log_setup_service(); umask(0022); r = mkdir_p("/var/lib/systemd/rfkill", 0755); - if (r < 0) { - log_error_errno(r, "Failed to create rfkill directory: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create rfkill directory: %m"); n = sd_listen_fds(false); - if (n < 0) { - r = log_error_errno(n, "Failed to determine whether we got any file descriptors passed: %m"); - goto finish; - } - if (n > 1) { - log_error("Got too many file descriptors."); - r = -EINVAL; - goto finish; - } + if (n < 0) + return log_error_errno(n, "Failed to determine whether we got any file descriptors passed: %m"); + if (n > 1) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Got too many file descriptors."); if (n == 0) { c.rfkill_fd = open("/dev/rfkill", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK); if (c.rfkill_fd < 0) { if (errno == ENOENT) { log_debug_errno(errno, "Missing rfkill subsystem, or no device present, exiting."); - r = 0; - goto finish; + return 0; } - r = log_error_errno(errno, "Failed to open /dev/rfkill: %m"); - goto finish; + return log_error_errno(errno, "Failed to open /dev/rfkill: %m"); } } else { c.rfkill_fd = SD_LISTEN_FDS_START; - if (r < 0) { - log_error_errno(r, "Failed to make /dev/rfkill socket non-blocking: %m"); - goto finish; - } r = fd_nonblock(c.rfkill_fd, 1); + if (r < 0) + return log_error_errno(r, "Failed to make /dev/rfkill socket non-blocking: %m"); } for (;;) { @@ -421,10 +409,8 @@ int main(int argc, char *argv[]) { r = fd_wait_for_event(c.rfkill_fd, POLLIN, EXIT_USEC); if (r == -EINTR) continue; - if (r < 0) { - log_error_errno(r, "Failed to poll() on device: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to poll() on device: %m"); if (r > 0) continue; @@ -435,11 +421,8 @@ int main(int argc, char *argv[]) { log_error_errno(errno, "Failed to read from /dev/rfkill: %m"); } - if (l != RFKILL_EVENT_SIZE_V1) { - log_error("Read event structure of invalid size."); - r = -EIO; - goto finish; - } + if (l != RFKILL_EVENT_SIZE_V1) + return log_error_errno(SYNTHETIC_ERRNO(EIO), "Read event structure of invalid size."); type = rfkill_type_to_string(event.type); if (!type) { @@ -470,8 +453,7 @@ int main(int argc, char *argv[]) { } } - r = 0; - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); From f6aa61909e2eebe67e8820b0c33106ab0dfe765a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 06:00:02 +0900 Subject: [PATCH 12/15] resolvectl: use static destructor and define main through macro --- src/resolve/resolvectl.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index bd24a11a93..5f42c6d021 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -15,6 +15,7 @@ #include "escape.h" #include "gcrypt-util.h" #include "in-addr-util.h" +#include "main-func.h" #include "netlink-util.h" #include "pager.h" #include "parse-util.h" @@ -56,6 +57,11 @@ static const char *arg_set_dns_over_tls = NULL; static const char *arg_set_dnssec = NULL; static char **arg_set_nta = NULL; +STATIC_DESTRUCTOR_REGISTER(arg_ifname, freep); +STATIC_DESTRUCTOR_REGISTER(arg_set_dns, strv_freep); +STATIC_DESTRUCTOR_REGISTER(arg_set_domain, strv_freep); +STATIC_DESTRUCTOR_REGISTER(arg_set_nta, strv_freep); + typedef enum StatusMode { STATUS_ALL, STATUS_DNS, @@ -3064,8 +3070,8 @@ static int compat_main(int argc, char *argv[], sd_bus *bus) { return 0; } -int main(int argc, char **argv) { - sd_bus *bus = NULL; +static int run(int argc, char **argv) { + _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; setlocale(LC_ALL, ""); @@ -3079,29 +3085,16 @@ int main(int argc, char **argv) { else r = native_parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = sd_bus_open_system(&bus); - if (r < 0) { - log_error_errno(r, "sd_bus_open_system: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "sd_bus_open_system: %m"); if (STR_IN_SET(program_invocation_short_name, "systemd-resolve", "resolvconf")) - r = compat_main(argc, argv, bus); - else - r = native_main(argc, argv, bus); + return compat_main(argc, argv, bus); -finish: - /* make sure we terminate the bus connection first, and then close the - * pager, see issue #3543 for the details. */ - sd_bus_flush_close_unref(bus); - pager_close(); - - free(arg_ifname); - strv_free(arg_set_dns); - strv_free(arg_set_domain); - strv_free(arg_set_nta); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return native_main(argc, argv, bus); } + +DEFINE_MAIN_FUNCTION(run); From 6804d7a849612eb470397aa4f4aae46865bfdb92 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 06:12:45 +0900 Subject: [PATCH 13/15] locale: rename context_free() to context_clear() --- src/locale/keymap-util.c | 2 +- src/locale/keymap-util.h | 2 +- src/locale/localed.c | 2 +- src/locale/test-keymap-util.c | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locale/keymap-util.c b/src/locale/keymap-util.c index 18668a99ab..495261f4d7 100644 --- a/src/locale/keymap-util.c +++ b/src/locale/keymap-util.c @@ -68,7 +68,7 @@ static void context_free_locale(Context *c) { c->locale[p] = mfree(c->locale[p]); } -void context_free(Context *c) { +void context_clear(Context *c) { context_free_locale(c); context_free_x11(c); context_free_vconsole(c); diff --git a/src/locale/keymap-util.h b/src/locale/keymap-util.h index 902da689c8..278c74b2ba 100644 --- a/src/locale/keymap-util.h +++ b/src/locale/keymap-util.h @@ -32,7 +32,7 @@ int locale_read_data(Context *c, sd_bus_message *m); int vconsole_read_data(Context *c, sd_bus_message *m); int x11_read_data(Context *c, sd_bus_message *m); -void context_free(Context *c); +void context_clear(Context *c); int vconsole_convert_to_x11(Context *c); int vconsole_write_data(Context *c); int x11_convert_to_vconsole(Context *c); diff --git a/src/locale/localed.c b/src/locale/localed.c index bb5b132ce7..b9dffeae5a 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -711,7 +711,7 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { } int main(int argc, char *argv[]) { - _cleanup_(context_free) Context context = { + _cleanup_(context_clear) Context context = { .locale_mtime = USEC_INFINITY, .vc_mtime = USEC_INFINITY, .x11_mtime = USEC_INFINITY, diff --git a/src/locale/test-keymap-util.c b/src/locale/test-keymap-util.c index e20731b253..2f82891d60 100644 --- a/src/locale/test-keymap-util.c +++ b/src/locale/test-keymap-util.c @@ -65,7 +65,7 @@ static void test_find_legacy_keymap(void) { } static void test_vconsole_convert_to_x11(void) { - _cleanup_(context_free) Context c = {}; + _cleanup_(context_clear) Context c = {}; log_info("/*** %s ***/", __func__); @@ -119,7 +119,7 @@ static void test_vconsole_convert_to_x11(void) { } static void test_x11_convert_to_vconsole(void) { - _cleanup_(context_free) Context c = {}; + _cleanup_(context_clear) Context c = {}; int r; log_info("/*** %s ***/", __func__); From af7865c1b7298f531070ca02281408b52b4c5df2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 06:12:55 +0900 Subject: [PATCH 14/15] locale: store polkit_registry in Context --- src/locale/keymap-util.c | 3 +++ src/locale/keymap-util.h | 3 +++ src/locale/localed.c | 10 +++------- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/locale/keymap-util.c b/src/locale/keymap-util.c index 495261f4d7..0bf62df22e 100644 --- a/src/locale/keymap-util.c +++ b/src/locale/keymap-util.c @@ -5,6 +5,7 @@ #include #include +#include "bus-util.h" #include "def.h" #include "env-util.h" #include "fd-util.h" @@ -76,6 +77,8 @@ void context_clear(Context *c) { sd_bus_message_unref(c->locale_cache); sd_bus_message_unref(c->x11_cache); sd_bus_message_unref(c->vc_cache); + + bus_verify_polkit_async_registry_free(c->polkit_registry); }; void locale_simplify(char *locale[_VARIABLE_LC_MAX]) { diff --git a/src/locale/keymap-util.h b/src/locale/keymap-util.h index 278c74b2ba..6eced84240 100644 --- a/src/locale/keymap-util.h +++ b/src/locale/keymap-util.h @@ -3,6 +3,7 @@ #include "sd-bus.h" +#include "hashmap.h" #include "locale-util.h" #include "time-util.h" @@ -22,6 +23,8 @@ typedef struct Context { usec_t vc_mtime; char *vc_keymap; char *vc_keymap_toggle; + + Hashmap *polkit_registry; } Context; int find_converted_keymap(const char *x11_layout, const char *x11_variant, char **new_keymap); diff --git a/src/locale/localed.c b/src/locale/localed.c index b9dffeae5a..6174132a1d 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -26,8 +26,6 @@ #include "strv.h" #include "user-util.h" -static Hashmap *polkit_registry = NULL; - static int locale_update_system_manager(Context *c, sd_bus *bus) { _cleanup_free_ char **l_unset = NULL; _cleanup_strv_free_ char **l_set = NULL; @@ -362,7 +360,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er NULL, interactive, UID_INVALID, - &polkit_registry, + &c->polkit_registry, error); if (r < 0) return r; @@ -433,7 +431,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro NULL, interactive, UID_INVALID, - &polkit_registry, + &c->polkit_registry, error); if (r < 0) return r; @@ -626,7 +624,7 @@ static int method_set_x11_keyboard(sd_bus_message *m, void *userdata, sd_bus_err NULL, interactive, UID_INVALID, - &polkit_registry, + &c->polkit_registry, error); if (r < 0) return r; @@ -762,7 +760,5 @@ int main(int argc, char *argv[]) { log_error_errno(r, "Failed to run event loop: %m"); finish: - bus_verify_polkit_async_registry_free(polkit_registry); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From c6f09e6a2dea85c9e83073ce2ef9f58ed76e2975 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 23 Nov 2018 06:15:33 +0900 Subject: [PATCH 15/15] locale: define main through macro --- src/locale/localed.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/locale/localed.c b/src/locale/localed.c index 6174132a1d..79a6d3e4d0 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -19,6 +19,7 @@ #include "keymap-util.h" #include "locale-util.h" #include "macro.h" +#include "main-func.h" #include "path-util.h" #include "selinux-util.h" #include "signal-util.h" @@ -708,7 +709,7 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(context_clear) Context context = { .locale_mtime = USEC_INFINITY, .vc_mtime = USEC_INFINITY, @@ -723,42 +724,34 @@ int main(int argc, char *argv[]) { umask(0022); mac_selinux_init(); - if (argc != 1) { - log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; - } + if (argc != 1) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments."); assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0); r = sd_event_default(&event); - if (r < 0) { - log_error_errno(r, "Failed to allocate event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate event loop: %m"); (void) sd_event_set_watchdog(event, true); r = sd_event_add_signal(event, NULL, SIGINT, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to install SIGINT handler: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to install SIGINT handler: %m"); r = sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL); - if (r < 0) { - log_error_errno(r, "Failed to install SIGTERM handler: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to install SIGTERM handler: %m"); r = connect_bus(&context, event, &bus); if (r < 0) - goto finish; + return r; r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC, NULL, NULL); if (r < 0) - log_error_errno(r, "Failed to run event loop: %m"); + return log_error_errno(r, "Failed to run event loop: %m"); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run);