From 5e332028f20566d8b9aa0d01c60aff8b9f43bcb7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 19 Nov 2018 20:26:37 +0100 Subject: [PATCH 1/5] util-lib: move main() definition macros to its own header file This way, we can extend the macro a bit with stuff pulled in from other headers without this affecting everything which pulls in macro.h, which is one of our most basic headers. This is just refactoring, no change in behaviour, in prepartion for later changes. --- src/ac-power/ac-power.c | 1 + src/basic/macro.h | 19 --------------- src/basic/main-func.h | 23 +++++++++++++++++++ src/boot/bless-boot.c | 1 + src/boot/boot-check-no-failures.c | 1 + src/cgtop/cgtop.c | 1 + src/coredump/coredump.c | 1 + src/debug-generator/debug-generator.c | 1 + src/detect-virt/detect-virt.c | 1 + src/escape/escape.c | 1 + src/fsck/fsck.c | 1 + src/hostname/hostnamectl.c | 1 + src/hwdb/hwdb.c | 1 + src/id128/id128.c | 1 + src/import/export.c | 1 + src/import/import.c | 1 + src/import/importd.c | 1 + src/import/pull.c | 1 + src/journal/cat.c | 3 ++- src/login/inhibit.c | 1 + src/login/logind.c | 1 + src/login/user-runtime-dir.c | 1 + src/machine/machined.c | 1 + src/notify/notify.c | 1 + src/partition/makefs.c | 1 + src/path/path.c | 1 + src/portable/portabled.c | 1 + src/quotacheck/quotacheck.c | 1 + src/random-seed/random-seed.c | 1 + src/remount-fs/remount-fs.c | 1 + src/sleep/sleep.c | 1 + src/stdio-bridge/stdio-bridge.c | 3 ++- src/sysv-generator/sysv-generator.c | 1 + .../tty-ask-password-agent.c | 1 + src/volatile-root/volatile-root.c | 7 +++--- 35 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 src/basic/main-func.h diff --git a/src/ac-power/ac-power.c b/src/ac-power/ac-power.c index 2d8cbb985f..090b6b1783 100644 --- a/src/ac-power/ac-power.c +++ b/src/ac-power/ac-power.c @@ -2,6 +2,7 @@ #include +#include "main-func.h" #include "util.h" static bool arg_verbose = false; diff --git a/src/basic/macro.h b/src/basic/macro.h index c52d8e4e3f..00fb3212db 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -506,23 +506,4 @@ static inline int __coverity_check__(int condition) { DEFINE_PUBLIC_TRIVIAL_REF_FUNC(type, name); \ DEFINE_PUBLIC_TRIVIAL_UNREF_FUNC(type, name, free_func); -/* Negative return values from impl are mapped to EXIT_FAILURE, and - * everything else means success! */ -#define DEFINE_MAIN_FUNCTION(impl) \ - int main(int argc, char *argv[]) { \ - int r; \ - r = impl(argc, argv); \ - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ - } - -/* Zero is mapped to EXIT_SUCCESS, and both negative and positive values - * are mapped to EXIT_FAILURE. - * Note: this means "true" maps to EXIT_FAILURE. */ -#define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ - int main(int argc, char *argv[]) { \ - int r; \ - r = impl(argc, argv); \ - return r != 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ - } - #include "log.h" diff --git a/src/basic/main-func.h b/src/basic/main-func.h new file mode 100644 index 0000000000..9ebe0ab882 --- /dev/null +++ b/src/basic/main-func.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +#include + +/* Negative return values from impl are mapped to EXIT_FAILURE, and + * everything else means success! */ +#define DEFINE_MAIN_FUNCTION(impl) \ + int main(int argc, char *argv[]) { \ + int r; \ + r = impl(argc, argv); \ + return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ + } + +/* Zero is mapped to EXIT_SUCCESS, and both negative and positive values + * are mapped to EXIT_FAILURE. + * Note: this means "true" maps to EXIT_FAILURE. */ +#define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ + int main(int argc, char *argv[]) { \ + int r; \ + r = impl(argc, argv); \ + return r != 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ + } diff --git a/src/boot/bless-boot.c b/src/boot/bless-boot.c index 84ac9e39e4..2455f3703f 100644 --- a/src/boot/bless-boot.c +++ b/src/boot/bless-boot.c @@ -9,6 +9,7 @@ #include "fd-util.h" #include "fs-util.h" #include "log.h" +#include "main-func.h" #include "parse-util.h" #include "path-util.h" #include "util.h" diff --git a/src/boot/boot-check-no-failures.c b/src/boot/boot-check-no-failures.c index 1674517d48..3284a04793 100644 --- a/src/boot/boot-check-no-failures.c +++ b/src/boot/boot-check-no-failures.c @@ -10,6 +10,7 @@ #include "alloc-util.h" #include "bus-error.h" #include "log.h" +#include "main-func.h" #include "util.h" static int help(void) { diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index 2cc869dcbd..cad274a633 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -19,6 +19,7 @@ #include "fd-util.h" #include "fileio.h" #include "hashmap.h" +#include "main-func.h" #include "parse-util.h" #include "path-util.h" #include "process-util.h" diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index 764ee2a945..46536b7c84 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -34,6 +34,7 @@ #include "journal-importer.h" #include "log.h" #include "macro.h" +#include "main-func.h" #include "missing.h" #include "mkdir.h" #include "parse-util.h" diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index a9497fe587..98fe574f8d 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include "alloc-util.h" +#include "main-func.h" #include "mkdir.h" #include "parse-util.h" #include "proc-cmdline.h" diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c index d1a2ab95a0..f1259fdcd5 100644 --- a/src/detect-virt/detect-virt.c +++ b/src/detect-virt/detect-virt.c @@ -6,6 +6,7 @@ #include #include "alloc-util.h" +#include "main-func.h" #include "string-table.h" #include "terminal-util.h" #include "util.h" diff --git a/src/escape/escape.c b/src/escape/escape.c index ed42ad65ad..b03c9e661d 100644 --- a/src/escape/escape.c +++ b/src/escape/escape.c @@ -6,6 +6,7 @@ #include "alloc-util.h" #include "log.h" +#include "main-func.h" #include "string-util.h" #include "strv.h" #include "terminal-util.h" diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 54d6d26fb5..821ad15c5f 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -22,6 +22,7 @@ #include "device-util.h" #include "fd-util.h" #include "fs-util.h" +#include "main-func.h" #include "parse-util.h" #include "path-util.h" #include "proc-cmdline.h" diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index 8220741efa..0d40d17a55 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -14,6 +14,7 @@ #include "bus-error.h" #include "bus-util.h" #include "hostname-util.h" +#include "main-func.h" #include "spawn-polkit-agent.h" #include "terminal-util.h" #include "util.h" diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c index 87b84b70a9..89e3138542 100644 --- a/src/hwdb/hwdb.c +++ b/src/hwdb/hwdb.c @@ -6,6 +6,7 @@ #include "alloc-util.h" #include "hwdb-util.h" +#include "main-func.h" #include "selinux-util.h" #include "terminal-util.h" #include "util.h" diff --git a/src/id128/id128.c b/src/id128/id128.c index 6b7045b3e7..cbd7464d2c 100644 --- a/src/id128/id128.c +++ b/src/id128/id128.c @@ -5,6 +5,7 @@ #include "alloc-util.h" #include "id128-print.h" +#include "main-func.h" #include "terminal-util.h" #include "util.h" #include "verbs.h" diff --git a/src/import/export.c b/src/import/export.c index 317ac1bba7..e07aa5d6d5 100644 --- a/src/import/export.c +++ b/src/import/export.c @@ -13,6 +13,7 @@ #include "hostname-util.h" #include "import-util.h" #include "machine-image.h" +#include "main-func.h" #include "signal-util.h" #include "string-util.h" #include "verbs.h" diff --git a/src/import/import.c b/src/import/import.c index 69fe8a8a37..9dca2f3d41 100644 --- a/src/import/import.c +++ b/src/import/import.c @@ -13,6 +13,7 @@ #include "import-tar.h" #include "import-util.h" #include "machine-image.h" +#include "main-func.h" #include "signal-util.h" #include "string-util.h" #include "verbs.h" diff --git a/src/import/importd.c b/src/import/importd.c index b5265a7ed3..f17cdf10d4 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -13,6 +13,7 @@ #include "hostname-util.h" #include "import-util.h" #include "machine-pool.h" +#include "main-func.h" #include "missing.h" #include "mkdir.h" #include "parse-util.h" diff --git a/src/import/pull.c b/src/import/pull.c index 821c9772e4..810cab53ba 100644 --- a/src/import/pull.c +++ b/src/import/pull.c @@ -9,6 +9,7 @@ #include "hostname-util.h" #include "import-util.h" #include "machine-image.h" +#include "main-func.h" #include "parse-util.h" #include "pull-raw.h" #include "pull-tar.h" diff --git a/src/journal/cat.c b/src/journal/cat.c index 1576199deb..3198d3261b 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -11,11 +11,12 @@ #include "alloc-util.h" #include "fd-util.h" +#include "main-func.h" #include "parse-util.h" #include "string-util.h" #include "syslog-util.h" -#include "util.h" #include "terminal-util.h" +#include "util.h" static const char *arg_identifier = NULL; static int arg_priority = LOG_INFO; diff --git a/src/login/inhibit.c b/src/login/inhibit.c index ca24aea5a7..508c539044 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -14,6 +14,7 @@ #include "fd-util.h" #include "format-table.h" #include "format-util.h" +#include "main-func.h" #include "pager.h" #include "process-util.h" #include "signal-util.h" diff --git a/src/login/logind.c b/src/login/logind.c index e71ac0ee6d..5f2243a15d 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -19,6 +19,7 @@ #include "format-util.h" #include "fs-util.h" #include "logind.h" +#include "main-func.h" #include "parse-util.h" #include "process-util.h" #include "selinux-util.h" diff --git a/src/login/user-runtime-dir.c b/src/login/user-runtime-dir.c index b3a6e5c740..8a1110491a 100644 --- a/src/login/user-runtime-dir.c +++ b/src/login/user-runtime-dir.c @@ -8,6 +8,7 @@ #include "bus-error.h" #include "fs-util.h" #include "label.h" +#include "main-func.h" #include "mkdir.h" #include "mount-util.h" #include "path-util.h" diff --git a/src/machine/machined.c b/src/machine/machined.c index 24850af5bc..a2e7a30240 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -17,6 +17,7 @@ #include "label.h" #include "machine-image.h" #include "machined.h" +#include "main-func.h" #include "process-util.h" #include "signal-util.h" #include "special.h" diff --git a/src/notify/notify.c b/src/notify/notify.c index 149cd0d050..fdf4598941 100644 --- a/src/notify/notify.c +++ b/src/notify/notify.c @@ -12,6 +12,7 @@ #include "env-util.h" #include "format-util.h" #include "log.h" +#include "main-func.h" #include "parse-util.h" #include "string-util.h" #include "strv.h" diff --git a/src/partition/makefs.c b/src/partition/makefs.c index dcc69c6a20..b2702d20f7 100644 --- a/src/partition/makefs.c +++ b/src/partition/makefs.c @@ -11,6 +11,7 @@ #include "alloc-util.h" #include "dissect-image.h" +#include "main-func.h" #include "process-util.h" #include "signal-util.h" #include "string-util.h" diff --git a/src/path/path.c b/src/path/path.c index 1b7e0c547a..4a2e2ca3f6 100644 --- a/src/path/path.c +++ b/src/path/path.c @@ -10,6 +10,7 @@ #include "alloc-util.h" #include "log.h" #include "macro.h" +#include "main-func.h" #include "string-util.h" #include "terminal-util.h" #include "util.h" diff --git a/src/portable/portabled.c b/src/portable/portabled.c index a853257bc0..313211a792 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -6,6 +6,7 @@ #include "alloc-util.h" #include "bus-util.h" #include "def.h" +#include "main-func.h" #include "portabled-bus.h" #include "portabled-image-bus.h" #include "portabled.h" diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c index e3c50c366a..7b11f29507 100644 --- a/src/quotacheck/quotacheck.c +++ b/src/quotacheck/quotacheck.c @@ -6,6 +6,7 @@ #include #include +#include "main-func.h" #include "proc-cmdline.h" #include "process-util.h" #include "signal-util.h" diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c index f5a7eca93c..6162f8d6bf 100644 --- a/src/random-seed/random-seed.c +++ b/src/random-seed/random-seed.c @@ -12,6 +12,7 @@ #include "fd-util.h" #include "io-util.h" #include "log.h" +#include "main-func.h" #include "mkdir.h" #include "string-util.h" #include "util.h" diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c index 9a0c39e16f..ece7f2955d 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -10,6 +10,7 @@ #include "exit-status.h" #include "log.h" +#include "main-func.h" #include "mount-setup.h" #include "mount-util.h" #include "path-util.h" diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 6010611366..f1f4da8886 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -16,6 +16,7 @@ #include "fd-util.h" #include "fileio.h" #include "log.h" +#include "main-func.h" #include "parse-util.h" #include "sleep-config.h" #include "stdio-util.h" diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c index 9efd6c216f..9ceb3f8d13 100644 --- a/src/stdio-bridge/stdio-bridge.c +++ b/src/stdio-bridge/stdio-bridge.c @@ -11,10 +11,11 @@ #include "sd-daemon.h" #include "alloc-util.h" +#include "build.h" #include "bus-internal.h" #include "bus-util.h" -#include "build.h" #include "log.h" +#include "main-func.h" #include "util.h" #define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket" diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 255adeaa19..c92d7f841a 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -14,6 +14,7 @@ #include "hexdecoct.h" #include "install.h" #include "log.h" +#include "main-func.h" #include "mkdir.h" #include "path-lookup.h" #include "path-util.h" diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 1c965217d9..609839c5a1 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -30,6 +30,7 @@ #include "hashmap.h" #include "io-util.h" #include "macro.h" +#include "main-func.h" #include "mkdir.h" #include "path-util.h" #include "process-util.h" diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c index ab7dca37b1..b08d42834f 100644 --- a/src/volatile-root/volatile-root.c +++ b/src/volatile-root/volatile-root.c @@ -4,12 +4,13 @@ #include "alloc-util.h" #include "fs-util.h" +#include "main-func.h" #include "mkdir.h" #include "mount-util.h" -#include "stat-util.h" -#include "volatile-util.h" -#include "string-util.h" #include "path-util.h" +#include "stat-util.h" +#include "string-util.h" +#include "volatile-util.h" static int make_volatile(const char *path) { _cleanup_free_ char *old_usr = NULL; From 67e16c31e9c797e722b1a5ee427512eb8a974a4b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 19 Nov 2018 20:08:04 +0100 Subject: [PATCH 2/5] util: add set of macros for declaring _cleanup_-style destructors for static variables --- src/basic/meson.build | 1 + src/basic/static-destruct.h | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/basic/static-destruct.h diff --git a/src/basic/meson.build b/src/basic/meson.build index ac580c283c..d6c03911ea 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -183,6 +183,7 @@ basic_sources = files(''' special.h stat-util.c stat-util.h + static-destruct.h stdio-util.h strbuf.c strbuf.h diff --git a/src/basic/static-destruct.h b/src/basic/static-destruct.h new file mode 100644 index 0000000000..cad838083f --- /dev/null +++ b/src/basic/static-destruct.h @@ -0,0 +1,51 @@ +#pragma once + +#include "macro.h" + +/* A framework for registering static variables that shall be freed on shutdown of a process. It's a bit like gcc's + * destructor attribute, but allows us to precisely schedule when we want to free the variables. This is supposed to + * feel a bit like the gcc cleanup attribute, but for static variables. Note that this does not work for static + * variables declared in .so's, as the list is private to the same linking unit. But maybe that's a good thing. */ + +typedef struct StaticDestructor { + void *data; + void (*destroy)(void *p); +} StaticDestructor; + +#define STATIC_DESTRUCTOR_REGISTER(variable, func) \ + _STATIC_DESTRUCTOR_REGISTER(UNIQ, variable, func) + +#define _STATIC_DESTRUCTOR_REGISTER(uq, variable, func) \ + /* Type-safe destructor */ \ + static void UNIQ_T(static_destructor_wrapper, uq)(void *p) { \ + typeof(variable) *q = p; \ + func(q); \ + } \ + /* The actual destructor structure */ \ + __attribute__ ((__section__("SYSTEMD_STATIC_DESTRUCT"))) \ + __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))) \ + __attribute__ ((__used__)) \ + static const StaticDestructor UNIQ_T(static_destructor_entry, uq) = { \ + .data = &(variable), \ + .destroy = UNIQ_T(static_destructor_wrapper, uq), \ + } + +/* Beginning and end of our section listing the destructors. We define these as weak as we want this to work even if + * there's not a single destructor is defined in which case the section will be missing. */ +extern const struct StaticDestructor __attribute__((__weak__)) __start_SYSTEMD_STATIC_DESTRUCT[]; +extern const struct StaticDestructor __attribute__((__weak__)) __stop_SYSTEMD_STATIC_DESTRUCT[]; + +/* The function to destroy everything. (Note that this must be static inline, as it's key that it remains in the same + * linking unit as the variables we want to destroy. */ +static inline void static_destruct(void) { + const StaticDestructor *d; + + if (!__start_SYSTEMD_STATIC_DESTRUCT) + return; + + d = ALIGN_TO_PTR(__start_SYSTEMD_STATIC_DESTRUCT, __BIGGEST_ALIGNMENT__); + while (d < __stop_SYSTEMD_STATIC_DESTRUCT) { + d->destroy(d->data); + d = ALIGN_TO_PTR(d + 1, __BIGGEST_ALIGNMENT__); + } +} From 8a4fdaf2921db52e46b800b6540f8e99853b556f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 19 Nov 2018 20:47:46 +0100 Subject: [PATCH 3/5] main-func: automatically call static destructors from main-func.h macros --- src/basic/main-func.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/basic/main-func.h b/src/basic/main-func.h index 9ebe0ab882..caa5885e8b 100644 --- a/src/basic/main-func.h +++ b/src/basic/main-func.h @@ -3,12 +3,15 @@ #include +#include "static-destruct.h" + /* Negative return values from impl are mapped to EXIT_FAILURE, and * everything else means success! */ #define DEFINE_MAIN_FUNCTION(impl) \ int main(int argc, char *argv[]) { \ int r; \ r = impl(argc, argv); \ + static_destruct(); \ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ } @@ -19,5 +22,6 @@ int main(int argc, char *argv[]) { \ int r; \ r = impl(argc, argv); \ + static_destruct(); \ return r != 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ } From f60947d970990d266e6ccd475bb73e1bbdad9c09 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 19 Nov 2018 20:11:35 +0100 Subject: [PATCH 4/5] debug-generator: port over to DEFINE_MAIN_FUNCTION() --- src/debug-generator/debug-generator.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 98fe574f8d..8b6d26e19b 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -137,12 +137,12 @@ static int generate_wants_symlinks(void) { return r; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r, q; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); - return EXIT_FAILURE; + return -EINVAL; } if (argc > 1) @@ -178,5 +178,7 @@ finish: strv_free(arg_wants); strv_free(arg_mask); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); From 4197fde5c7354b21c53f6ed3e72d86c33b17113b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 19 Nov 2018 20:48:12 +0100 Subject: [PATCH 5/5] debug-generator: port over to using static destructors --- src/debug-generator/debug-generator.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 8b6d26e19b..73a8d35271 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -17,6 +17,10 @@ static char **arg_mask = NULL; static char **arg_wants = NULL; static bool arg_debug_shell = false; +STATIC_DESTRUCTOR_REGISTER(arg_default_unit, freep); +STATIC_DESTRUCTOR_REGISTER(arg_mask, strv_freep); +STATIC_DESTRUCTOR_REGISTER(arg_wants, strv_freep); + static int parse_proc_cmdline_item(const char *key, const char *value, void *data) { int r; @@ -161,24 +165,14 @@ static int run(int argc, char *argv[]) { if (arg_debug_shell) { r = strv_extend(&arg_wants, "debug-shell.service"); - if (r < 0) { - r = log_oom(); - goto finish; - } + if (r < 0) + return log_oom(); } r = generate_mask_symlinks(); - q = generate_wants_symlinks(); - if (q < 0) - r = q; -finish: - arg_default_unit = mfree(arg_default_unit); - strv_free(arg_wants); - strv_free(arg_mask); - - return r; + return r < 0 ? r : q; } DEFINE_MAIN_FUNCTION(run);