summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-02-14 11:39:48 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-02-15 08:50:45 +0100
commit614b022c76e72a3d20ff48f2bc58ca7c3f86b84f (patch)
tree81660985be78f2523f61d0a4448c4a7fb400db8c
parentbasic/signal-util: drop unneeded extra byte from buffer (diff)
downloadsystemd-614b022c76e72a3d20ff48f2bc58ca7c3f86b84f.tar.xz
systemd-614b022c76e72a3d20ff48f2bc58ca7c3f86b84f.zip
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.
-rw-r--r--src/basic/path-util.c32
-rw-r--r--src/basic/path-util.h2
-rw-r--r--src/core/main.c5
-rw-r--r--src/cryptenroll/cryptenroll.c3
-rw-r--r--src/dissect/dissect.c3
-rw-r--r--src/firstboot/firstboot.c5
-rw-r--r--src/home/homectl.c5
-rw-r--r--src/journal/journalctl.c5
-rw-r--r--src/machine-id-setup/machine-id-setup-main.c3
-rw-r--r--src/nspawn/nspawn.c13
-rw-r--r--src/partition/repart.c5
-rw-r--r--src/run/run.c3
-rw-r--r--src/shared/parse-argument.c31
-rw-r--r--src/shared/parse-argument.h1
-rw-r--r--src/sysext/sysext.c3
-rw-r--r--src/systemctl/systemctl.c2
-rw-r--r--src/sysusers/sysusers.c5
-rw-r--r--src/tmpfiles/tmpfiles.c5
18 files changed, 71 insertions, 60 deletions
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