From 614b022c76e72a3d20ff48f2bc58ca7c3f86b84f Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Sun, 14 Feb 2021 11:39:48 +0100 Subject: Move and rename parse_path_argument() function This fits better in shared/, and the new parse-argument.c file is a good home for it. --- src/basic/path-util.c | 32 ---------------------------- src/basic/path-util.h | 2 -- src/core/main.c | 5 +++-- src/cryptenroll/cryptenroll.c | 3 ++- src/dissect/dissect.c | 3 ++- src/firstboot/firstboot.c | 5 +++-- src/home/homectl.c | 5 +++-- src/journal/journalctl.c | 5 +++-- src/machine-id-setup/machine-id-setup-main.c | 3 ++- src/nspawn/nspawn.c | 13 +++++------ src/partition/repart.c | 5 +++-- src/run/run.c | 3 ++- src/shared/parse-argument.c | 31 +++++++++++++++++++++++++++ src/shared/parse-argument.h | 1 + src/sysext/sysext.c | 3 ++- src/systemctl/systemctl.c | 2 +- src/sysusers/sysusers.c | 5 +++-- src/tmpfiles/tmpfiles.c | 5 +++-- 18 files changed, 71 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/basic/path-util.c b/src/basic/path-util.c index f7498d0125..f3398418c4 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -752,38 +752,6 @@ int fsck_exists(const char *fstype) { return executable_is_good(checker); } -int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg) { - char *p; - int r; - - /* - * This function is intended to be used in command line - * parsers, to handle paths that are passed in. It makes the - * path absolute, and reduces it to NULL if omitted or - * root (the latter optionally). - * - * NOTE THAT THIS WILL FREE THE PREVIOUS ARGUMENT POINTER ON - * SUCCESS! Hence, do not pass in uninitialized pointers. - */ - - if (isempty(path)) { - *arg = mfree(*arg); - return 0; - } - - r = path_make_absolute_cwd(path, &p); - if (r < 0) - return log_error_errno(r, "Failed to parse path \"%s\" and make it absolute: %m", path); - - path_simplify(p, false); - if (suppress_root && empty_or_root(p)) - p = mfree(p); - - free_and_replace(*arg, p); - - return 0; -} - char* dirname_malloc(const char *path) { char *d, *dir, *dir2; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index e7a26c9a84..ba12b03dbe 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -144,8 +144,6 @@ int fsck_exists(const char *fstype); _ret; \ }) -int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg); - char* dirname_malloc(const char *path); const char *last_path_component(const char *path); int path_extract_filename(const char *p, char **ret); diff --git a/src/core/main.c b/src/core/main.c index 85bf558e90..8c7bcc2d3d 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -58,6 +58,7 @@ #include "mount-setup.h" #include "os-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -358,7 +359,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat return 0; if (path_is_absolute(value)) - (void) parse_path_argument_and_warn(value, false, &arg_early_core_pattern); + (void) parse_path_argument(value, false, &arg_early_core_pattern); else log_warning("Specified core pattern '%s' is not an absolute path, ignoring.", value); @@ -498,7 +499,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat if (proc_cmdline_value_missing(key, value)) return 0; - (void) parse_path_argument_and_warn(value, false, &arg_watchdog_device); + (void) parse_path_argument(value, false, &arg_watchdog_device); } else if (proc_cmdline_key_streq(key, "systemd.clock_usec")) { diff --git a/src/cryptenroll/cryptenroll.c b/src/cryptenroll/cryptenroll.c index fa4dfb6ef2..a137a41c9d 100644 --- a/src/cryptenroll/cryptenroll.c +++ b/src/cryptenroll/cryptenroll.c @@ -16,6 +16,7 @@ #include "libfido2-util.h" #include "main-func.h" #include "memory-util.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pkcs11-util.h" @@ -323,7 +324,7 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Too many arguments, refusing."); - r = parse_path_argument_and_warn(argv[optind], false, &arg_node); + r = parse_path_argument(argv[optind], false, &arg_node); if (r < 0) return r; diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 0b83d79cc9..e5ca85ffc5 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -22,6 +22,7 @@ #include "mkdir.h" #include "mount-util.h" #include "namespace-util.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -245,7 +246,7 @@ static int parse_argv(int argc, char *argv[]) { } case ARG_VERITY_DATA: - r = parse_path_argument_and_warn(optarg, false, &arg_verity_settings.data_path); + r = parse_path_argument(optarg, false, &arg_verity_settings.data_path); if (r < 0) return r; break; diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 522d0ff1f0..40f0de28c2 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -24,6 +24,7 @@ #include "mkdir.h" #include "mount-util.h" #include "os-util.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -1046,13 +1047,13 @@ static int parse_argv(int argc, char *argv[]) { return version(); case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, true, &arg_root); + r = parse_path_argument(optarg, true, &arg_root); if (r < 0) return r; break; case ARG_IMAGE: - r = parse_path_argument_and_warn(optarg, false, &arg_image); + r = parse_path_argument(optarg, false, &arg_image); if (r < 0) return r; break; diff --git a/src/home/homectl.c b/src/home/homectl.c index bf35fa03f0..c667419a51 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -23,6 +23,7 @@ #include "main-func.h" #include "memory-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pkcs11-util.h" @@ -2260,7 +2261,7 @@ static int parse_argv(int argc, char *argv[]) { break; } - r = parse_path_argument_and_warn(optarg, false, &hd); + r = parse_path_argument(optarg, false, &hd); if (r < 0) return r; @@ -2481,7 +2482,7 @@ static int parse_argv(int argc, char *argv[]) { break; } - r = parse_path_argument_and_warn(optarg, false, &v); + r = parse_path_argument(optarg, false, &v); if (r < 0) return r; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 20b7584643..a1b7bee2a3 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -55,6 +55,7 @@ #include "mountpoint-util.h" #include "nulstr-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pcre2-dlopen.h" @@ -719,13 +720,13 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ true, &arg_root); + r = parse_path_argument(optarg, /* suppress_root= */ true, &arg_root); if (r < 0) return r; break; case ARG_IMAGE: - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ false, &arg_image); + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_image); if (r < 0) return r; break; diff --git a/src/machine-id-setup/machine-id-setup-main.c b/src/machine-id-setup/machine-id-setup-main.c index 6074b1b42e..69fb71cdc2 100644 --- a/src/machine-id-setup/machine-id-setup-main.c +++ b/src/machine-id-setup/machine-id-setup-main.c @@ -10,6 +10,7 @@ #include "log.h" #include "machine-id-setup.h" #include "main-func.h" +#include "parse-argument.h" #include "path-util.h" #include "pretty-print.h" #include "util.h" @@ -76,7 +77,7 @@ static int parse_argv(int argc, char *argv[]) { return version(); case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, true, &arg_root); + r = parse_path_argument(optarg, true, &arg_root); if (r < 0) return r; break; diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index e1c55d0542..19734f1c45 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -78,6 +78,7 @@ #include "nulstr-util.h" #include "os-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -791,7 +792,7 @@ static int parse_argv(int argc, char *argv[]) { return version(); case 'D': - r = parse_path_argument_and_warn(optarg, false, &arg_directory); + r = parse_path_argument(optarg, false, &arg_directory); if (r < 0) return r; @@ -799,7 +800,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_TEMPLATE: - r = parse_path_argument_and_warn(optarg, false, &arg_template); + r = parse_path_argument(optarg, false, &arg_template); if (r < 0) return r; @@ -807,7 +808,7 @@ static int parse_argv(int argc, char *argv[]) { break; case 'i': - r = parse_path_argument_and_warn(optarg, false, &arg_image); + r = parse_path_argument(optarg, false, &arg_image); if (r < 0) return r; @@ -815,7 +816,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_OCI_BUNDLE: - r = parse_path_argument_and_warn(optarg, false, &arg_oci_bundle); + r = parse_path_argument(optarg, false, &arg_oci_bundle); if (r < 0) return r; @@ -934,7 +935,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_NETWORK_NAMESPACE_PATH: - r = parse_path_argument_and_warn(optarg, false, &arg_network_namespace_path); + r = parse_path_argument(optarg, false, &arg_network_namespace_path); if (r < 0) return r; @@ -1386,7 +1387,7 @@ static int parse_argv(int argc, char *argv[]) { } case ARG_VERITY_DATA: - r = parse_path_argument_and_warn(optarg, false, &arg_verity_settings.data_path); + r = parse_path_argument(optarg, false, &arg_verity_settings.data_path); if (r < 0) return r; break; diff --git a/src/partition/repart.c b/src/partition/repart.c index 2236c6927f..9828085018 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -45,6 +45,7 @@ #include "mkfs-util.h" #include "mount-util.h" #include "parse-util.h" +#include "parse-argument.h" #include "path-util.h" #include "pretty-print.h" #include "proc-cmdline.h" @@ -3623,7 +3624,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, false, &arg_root); + r = parse_path_argument(optarg, false, &arg_root); if (r < 0) return r; break; @@ -3653,7 +3654,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_DEFINITIONS: - r = parse_path_argument_and_warn(optarg, false, &arg_definitions); + r = parse_path_argument(optarg, false, &arg_definitions); if (r < 0) return r; break; diff --git a/src/run/run.c b/src/run/run.c index 29b182718b..11166d2e78 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -21,6 +21,7 @@ #include "fd-util.h" #include "format-util.h" #include "main-func.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "pretty-print.h" @@ -470,7 +471,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_WORKING_DIRECTORY: - r = parse_path_argument_and_warn(optarg, true, &arg_working_directory); + r = parse_path_argument(optarg, true, &arg_working_directory); if (r < 0) return r; diff --git a/src/shared/parse-argument.c b/src/shared/parse-argument.c index ca10d51793..774cb1bc82 100644 --- a/src/shared/parse-argument.c +++ b/src/shared/parse-argument.c @@ -2,11 +2,42 @@ #include "format-table.h" #include "parse-argument.h" +#include "path-util.h" #include "signal-util.h" #include "stdio-util.h" #include "string-table.h" #include "string-util.h" +/* All functions in this file emit warnigs. */ + +int parse_path_argument(const char *path, bool suppress_root, char **arg) { + char *p; + int r; + + /* + * This function is intended to be used in command line parsers, to handle paths that are passed + * in. It makes the path absolute, and reduces it to NULL if omitted or root (the latter optionally). + * + * NOTE THAT THIS WILL FREE THE PREVIOUS ARGUMENT POINTER ON SUCCESS! + * Hence, do not pass in uninitialized pointers. + */ + + if (isempty(path)) { + *arg = mfree(*arg); + return 0; + } + + r = path_make_absolute_cwd(path, &p); + if (r < 0) + return log_error_errno(r, "Failed to parse path \"%s\" and make it absolute: %m", path); + + path_simplify(p, false); + if (suppress_root && empty_or_root(p)) + p = mfree(p); + + return free_and_replace(*arg, p); +} + int parse_signal_argument(const char *s, int *ret) { int r; diff --git a/src/shared/parse-argument.h b/src/shared/parse-argument.h index 7a5419174d..4ec334fe5e 100644 --- a/src/shared/parse-argument.h +++ b/src/shared/parse-argument.h @@ -1,4 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +int parse_path_argument(const char *path, bool suppress_root, char **arg); int parse_signal_argument(const char *s, int *ret); diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index 1ce9939afb..ff8d58902a 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -22,6 +22,7 @@ #include "mountpoint-util.h" #include "os-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "pretty-print.h" #include "process-util.h" @@ -943,7 +944,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, false, &arg_root); + r = parse_path_argument(optarg, false, &arg_root); if (r < 0) return r; break; diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 0371ff355e..3ecd20cc74 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -638,7 +638,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, false, &arg_root); + r = parse_path_argument(optarg, false, &arg_root); if (r < 0) return r; break; diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index 969896c0b5..4e231be856 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -17,6 +17,7 @@ #include "mount-util.h" #include "nscd-flush.h" #include "pager.h" +#include "parse-argument.h" #include "path-util.h" #include "pretty-print.h" #include "selinux-util.h" @@ -1813,7 +1814,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ false, &arg_root); + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_root); if (r < 0) return r; break; @@ -1823,7 +1824,7 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "This systemd-sysusers version is compiled without support for --image=."); #else - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ false, &arg_image); + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_image); if (r < 0) return r; break; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 97de00e3dc..846e456551 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -46,6 +46,7 @@ #include "mountpoint-util.h" #include "offline-passwd.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-lookup.h" #include "path-util.h" @@ -3114,7 +3115,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT: - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ false, &arg_root); + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_root); if (r < 0) return r; break; @@ -3124,7 +3125,7 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "This systemd-tmpfiles version is compiled without support for --image=."); #else - r = parse_path_argument_and_warn(optarg, /* suppress_root= */ false, &arg_image); + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_image); if (r < 0) return r; #endif -- cgit v1.2.3