1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

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.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2021-02-14 11:39:48 +01:00
parent 923e2122d0
commit 614b022c76
18 changed files with 71 additions and 60 deletions

View File

@ -752,38 +752,6 @@ int fsck_exists(const char *fstype) {
return executable_is_good(checker); 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* dirname_malloc(const char *path) {
char *d, *dir, *dir2; char *d, *dir, *dir2;

View File

@ -144,8 +144,6 @@ int fsck_exists(const char *fstype);
_ret; \ _ret; \
}) })
int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg);
char* dirname_malloc(const char *path); char* dirname_malloc(const char *path);
const char *last_path_component(const char *path); const char *last_path_component(const char *path);
int path_extract_filename(const char *p, char **ret); int path_extract_filename(const char *p, char **ret);

View File

@ -58,6 +58,7 @@
#include "mount-setup.h" #include "mount-setup.h"
#include "os-util.h" #include "os-util.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.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; return 0;
if (path_is_absolute(value)) 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 else
log_warning("Specified core pattern '%s' is not an absolute path, ignoring.", value); 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)) if (proc_cmdline_value_missing(key, value))
return 0; 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")) { } else if (proc_cmdline_key_streq(key, "systemd.clock_usec")) {

View File

@ -16,6 +16,7 @@
#include "libfido2-util.h" #include "libfido2-util.h"
#include "main-func.h" #include "main-func.h"
#include "memory-util.h" #include "memory-util.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pkcs11-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), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Too many arguments, refusing."); "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) if (r < 0)
return r; return r;

View File

@ -22,6 +22,7 @@
#include "mkdir.h" #include "mkdir.h"
#include "mount-util.h" #include "mount-util.h"
#include "namespace-util.h" #include "namespace-util.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
@ -245,7 +246,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
case ARG_VERITY_DATA: 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) if (r < 0)
return r; return r;
break; break;

View File

@ -24,6 +24,7 @@
#include "mkdir.h" #include "mkdir.h"
#include "mount-util.h" #include "mount-util.h"
#include "os-util.h" #include "os-util.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
@ -1046,13 +1047,13 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
case ARG_ROOT: case ARG_ROOT:
r = parse_path_argument_and_warn(optarg, true, &arg_root); r = parse_path_argument(optarg, true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
case ARG_IMAGE: case ARG_IMAGE:
r = parse_path_argument_and_warn(optarg, false, &arg_image); r = parse_path_argument(optarg, false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;

View File

@ -23,6 +23,7 @@
#include "main-func.h" #include "main-func.h"
#include "memory-util.h" #include "memory-util.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pkcs11-util.h" #include "pkcs11-util.h"
@ -2260,7 +2261,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
r = parse_path_argument_and_warn(optarg, false, &hd); r = parse_path_argument(optarg, false, &hd);
if (r < 0) if (r < 0)
return r; return r;
@ -2481,7 +2482,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
r = parse_path_argument_and_warn(optarg, false, &v); r = parse_path_argument(optarg, false, &v);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -55,6 +55,7 @@
#include "mountpoint-util.h" #include "mountpoint-util.h"
#include "nulstr-util.h" #include "nulstr-util.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pcre2-dlopen.h" #include "pcre2-dlopen.h"
@ -719,13 +720,13 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: 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) if (r < 0)
return r; return r;
break; break;
case ARG_IMAGE: 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) if (r < 0)
return r; return r;
break; break;

View File

@ -10,6 +10,7 @@
#include "log.h" #include "log.h"
#include "machine-id-setup.h" #include "machine-id-setup.h"
#include "main-func.h" #include "main-func.h"
#include "parse-argument.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
#include "util.h" #include "util.h"
@ -76,7 +77,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
case ARG_ROOT: case ARG_ROOT:
r = parse_path_argument_and_warn(optarg, true, &arg_root); r = parse_path_argument(optarg, true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;

View File

@ -78,6 +78,7 @@
#include "nulstr-util.h" #include "nulstr-util.h"
#include "os-util.h" #include "os-util.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
@ -791,7 +792,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
case 'D': case 'D':
r = parse_path_argument_and_warn(optarg, false, &arg_directory); r = parse_path_argument(optarg, false, &arg_directory);
if (r < 0) if (r < 0)
return r; return r;
@ -799,7 +800,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_TEMPLATE: case ARG_TEMPLATE:
r = parse_path_argument_and_warn(optarg, false, &arg_template); r = parse_path_argument(optarg, false, &arg_template);
if (r < 0) if (r < 0)
return r; return r;
@ -807,7 +808,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case 'i': case 'i':
r = parse_path_argument_and_warn(optarg, false, &arg_image); r = parse_path_argument(optarg, false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
@ -815,7 +816,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_OCI_BUNDLE: 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) if (r < 0)
return r; return r;
@ -934,7 +935,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_NETWORK_NAMESPACE_PATH: 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) if (r < 0)
return r; return r;
@ -1386,7 +1387,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
case ARG_VERITY_DATA: 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) if (r < 0)
return r; return r;
break; break;

View File

@ -45,6 +45,7 @@
#include "mkfs-util.h" #include "mkfs-util.h"
#include "mount-util.h" #include "mount-util.h"
#include "parse-util.h" #include "parse-util.h"
#include "parse-argument.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
#include "proc-cmdline.h" #include "proc-cmdline.h"
@ -3623,7 +3624,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: case ARG_ROOT:
r = parse_path_argument_and_warn(optarg, false, &arg_root); r = parse_path_argument(optarg, false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@ -3653,7 +3654,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_DEFINITIONS: case ARG_DEFINITIONS:
r = parse_path_argument_and_warn(optarg, false, &arg_definitions); r = parse_path_argument(optarg, false, &arg_definitions);
if (r < 0) if (r < 0)
return r; return r;
break; break;

View File

@ -21,6 +21,7 @@
#include "fd-util.h" #include "fd-util.h"
#include "format-util.h" #include "format-util.h"
#include "main-func.h" #include "main-func.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
@ -470,7 +471,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_WORKING_DIRECTORY: 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) if (r < 0)
return r; return r;

View File

@ -2,11 +2,42 @@
#include "format-table.h" #include "format-table.h"
#include "parse-argument.h" #include "parse-argument.h"
#include "path-util.h"
#include "signal-util.h" #include "signal-util.h"
#include "stdio-util.h" #include "stdio-util.h"
#include "string-table.h" #include "string-table.h"
#include "string-util.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 parse_signal_argument(const char *s, int *ret) {
int r; int r;

View File

@ -1,4 +1,5 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once #pragma once
int parse_path_argument(const char *path, bool suppress_root, char **arg);
int parse_signal_argument(const char *s, int *ret); int parse_signal_argument(const char *s, int *ret);

View File

@ -22,6 +22,7 @@
#include "mountpoint-util.h" #include "mountpoint-util.h"
#include "os-util.h" #include "os-util.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "pretty-print.h" #include "pretty-print.h"
#include "process-util.h" #include "process-util.h"
@ -943,7 +944,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: case ARG_ROOT:
r = parse_path_argument_and_warn(optarg, false, &arg_root); r = parse_path_argument(optarg, false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;

View File

@ -638,7 +638,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: case ARG_ROOT:
r = parse_path_argument_and_warn(optarg, false, &arg_root); r = parse_path_argument(optarg, false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;

View File

@ -17,6 +17,7 @@
#include "mount-util.h" #include "mount-util.h"
#include "nscd-flush.h" #include "nscd-flush.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "path-util.h" #include "path-util.h"
#include "pretty-print.h" #include "pretty-print.h"
#include "selinux-util.h" #include "selinux-util.h"
@ -1813,7 +1814,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: 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) if (r < 0)
return r; return r;
break; break;
@ -1823,7 +1824,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"This systemd-sysusers version is compiled without support for --image=."); "This systemd-sysusers version is compiled without support for --image=.");
#else #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) if (r < 0)
return r; return r;
break; break;

View File

@ -46,6 +46,7 @@
#include "mountpoint-util.h" #include "mountpoint-util.h"
#include "offline-passwd.h" #include "offline-passwd.h"
#include "pager.h" #include "pager.h"
#include "parse-argument.h"
#include "parse-util.h" #include "parse-util.h"
#include "path-lookup.h" #include "path-lookup.h"
#include "path-util.h" #include "path-util.h"
@ -3114,7 +3115,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_ROOT: 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) if (r < 0)
return r; return r;
break; break;
@ -3124,7 +3125,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"This systemd-tmpfiles version is compiled without support for --image=."); "This systemd-tmpfiles version is compiled without support for --image=.");
#else #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) if (r < 0)
return r; return r;
#endif #endif