X Tutup
Skip to content

Commit 599c7c5

Browse files
committed
tree-wide: add a helper to parse boolean optarg
This nicely covers the case when optarg is optional. The same parser can be used when the option string passed to getopt_long() requires a parameter and when it doesn't. The error messages are made consistent. Also fixes a log error c&p in --crash-reboot message.
1 parent 79dbbb2 commit 599c7c5

File tree

10 files changed

+72
-106
lines changed

10 files changed

+72
-106
lines changed

src/analyze/analyze.c

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "main-func.h"
3838
#include "nulstr-util.h"
3939
#include "pager.h"
40+
#include "parse-argument.h"
4041
#include "parse-util.h"
4142
#include "path-util.h"
4243
#include "pretty-print.h"
@@ -2346,29 +2347,15 @@ static int parse_argv(int argc, char *argv[]) {
23462347
break;
23472348

23482349
case ARG_MAN:
2349-
if (optarg) {
2350-
r = parse_boolean(optarg);
2351-
if (r < 0)
2352-
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
2353-
"Failed to parse --man= argument.");
2354-
2355-
arg_man = r;
2356-
} else
2357-
arg_man = true;
2358-
2350+
r = parse_boolean_argument("--man", optarg, &arg_man);
2351+
if (r < 0)
2352+
return r;
23592353
break;
23602354

23612355
case ARG_GENERATORS:
2362-
if (optarg) {
2363-
r = parse_boolean(optarg);
2364-
if (r < 0)
2365-
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
2366-
"Failed to parse --generators= argument.");
2367-
2368-
arg_generators = r;
2369-
} else
2370-
arg_generators = true;
2371-
2356+
r = parse_boolean_argument("--generators", optarg, &arg_generators);
2357+
if (r < 0)
2358+
return r;
23722359
break;
23732360

23742361
case ARG_ITERATIONS:

src/busctl/busctl.c

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,27 +2473,22 @@ static int parse_argv(int argc, char *argv[]) {
24732473
break;
24742474

24752475
case ARG_EXPECT_REPLY:
2476-
r = parse_boolean(optarg);
2476+
r = parse_boolean_argument("--expect-reply=", optarg, &arg_expect_reply);
24772477
if (r < 0)
2478-
return log_error_errno(r, "Failed to parse --expect-reply= parameter '%s': %m", optarg);
2479-
2480-
arg_expect_reply = r;
2478+
return r;
24812479
break;
24822480

24832481
case ARG_AUTO_START:
2484-
r = parse_boolean(optarg);
2482+
r = parse_boolean_argument("--auto-start=", optarg, &arg_auto_start);
24852483
if (r < 0)
2486-
return log_error_errno(r, "Failed to parse --auto-start= parameter '%s': %m", optarg);
2487-
2488-
arg_auto_start = r;
2484+
return r;
24892485
break;
24902486

24912487
case ARG_ALLOW_INTERACTIVE_AUTHORIZATION:
2492-
r = parse_boolean(optarg);
2488+
r = parse_boolean_argument("--allow-interactive-authorization=", optarg,
2489+
&arg_allow_interactive_authorization);
24932490
if (r < 0)
2494-
return log_error_errno(r, "Failed to parse --allow-interactive-authorization= parameter '%s': %m", optarg);
2495-
2496-
arg_allow_interactive_authorization = r;
2491+
return r;
24972492
break;
24982493

24992494
case ARG_TIMEOUT:
@@ -2504,19 +2499,15 @@ static int parse_argv(int argc, char *argv[]) {
25042499
break;
25052500

25062501
case ARG_AUGMENT_CREDS:
2507-
r = parse_boolean(optarg);
2502+
r = parse_boolean_argument("--augment-creds=", optarg, &arg_augment_creds);
25082503
if (r < 0)
2509-
return log_error_errno(r, "Failed to parse --augment-creds= parameter '%s': %m", optarg);
2510-
2511-
arg_augment_creds = r;
2504+
return r;
25122505
break;
25132506

25142507
case ARG_WATCH_BIND:
2515-
r = parse_boolean(optarg);
2508+
r = parse_boolean_argument("--watch-bind=", optarg, &arg_watch_bind);
25162509
if (r < 0)
2517-
return log_error_errno(r, "Failed to parse --watch-bind= parameter '%s': %m", optarg);
2518-
2519-
arg_watch_bind = r;
2510+
return r;
25202511
break;
25212512

25222513
case 'j':

src/cgtop/cgtop.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "hashmap.h"
2020
#include "main-func.h"
2121
#include "missing_sched.h"
22+
#include "parse-argument.h"
2223
#include "parse-util.h"
2324
#include "path-util.h"
2425
#include "pretty-print.h"
@@ -867,12 +868,11 @@ static int parse_argv(int argc, char *argv[]) {
867868
break;
868869

869870
case ARG_RECURSIVE:
870-
r = parse_boolean(optarg);
871+
r = parse_boolean_argument("--recursive=", optarg, &arg_recursive);
871872
if (r < 0)
872-
return log_error_errno(r, "Failed to parse --recursive= argument '%s': %m", optarg);
873+
return r;
873874

874-
arg_recursive = r;
875-
arg_recursive_unset = r == 0;
875+
arg_recursive_unset = !r;
876876
break;
877877

878878
case 'M':

src/core/main.c

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -938,15 +938,9 @@ static int parse_argv(int argc, char *argv[]) {
938938
break;
939939

940940
case ARG_DUMP_CORE:
941-
if (!optarg)
942-
arg_dump_core = true;
943-
else {
944-
r = parse_boolean(optarg);
945-
if (r < 0)
946-
return log_error_errno(r, "Failed to parse dump core boolean: \"%s\": %m",
947-
optarg);
948-
arg_dump_core = r;
949-
}
941+
r = parse_boolean_argument("--dump-core", optarg, &arg_dump_core);
942+
if (r < 0)
943+
return r;
950944
break;
951945

952946
case ARG_CRASH_CHVT:
@@ -957,27 +951,15 @@ static int parse_argv(int argc, char *argv[]) {
957951
break;
958952

959953
case ARG_CRASH_SHELL:
960-
if (!optarg)
961-
arg_crash_shell = true;
962-
else {
963-
r = parse_boolean(optarg);
964-
if (r < 0)
965-
return log_error_errno(r, "Failed to parse crash shell boolean: \"%s\": %m",
966-
optarg);
967-
arg_crash_shell = r;
968-
}
954+
r = parse_boolean_argument("--crash-shell", optarg, &arg_crash_shell);
955+
if (r < 0)
956+
return r;
969957
break;
970958

971959
case ARG_CRASH_REBOOT:
972-
if (!optarg)
973-
arg_crash_reboot = true;
974-
else {
975-
r = parse_boolean(optarg);
976-
if (r < 0)
977-
return log_error_errno(r, "Failed to parse crash shell boolean: \"%s\": %m",
978-
optarg);
979-
arg_crash_reboot = r;
980-
}
960+
r = parse_boolean_argument("--crash-reboot", optarg, &arg_crash_reboot);
961+
if (r < 0)
962+
return r;
981963
break;
982964

983965
case ARG_CONFIRM_SPAWN:
@@ -990,11 +972,9 @@ static int parse_argv(int argc, char *argv[]) {
990972
break;
991973

992974
case ARG_SERVICE_WATCHDOGS:
993-
r = parse_boolean(optarg);
975+
r = parse_boolean_argument("--service-watchdogs=", optarg, &arg_service_watchdogs);
994976
if (r < 0)
995-
return log_error_errno(r, "Failed to parse service watchdogs boolean: \"%s\": %m",
996-
optarg);
997-
arg_service_watchdogs = r;
977+
return r;
998978
break;
999979

1000980
case ARG_SHOW_STATUS:

src/journal/cat.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "alloc-util.h"
1313
#include "fd-util.h"
1414
#include "main-func.h"
15+
#include "parse-argument.h"
1516
#include "parse-util.h"
1617
#include "pretty-print.h"
1718
#include "string-util.h"
@@ -67,7 +68,7 @@ static int parse_argv(int argc, char *argv[]) {
6768
{}
6869
};
6970

70-
int c;
71+
int c, r;
7172

7273
assert(argc >= 0);
7374
assert(argv);
@@ -104,16 +105,11 @@ static int parse_argv(int argc, char *argv[]) {
104105
"Failed to parse stderr priority value.");
105106
break;
106107

107-
case ARG_LEVEL_PREFIX: {
108-
int k;
109-
110-
k = parse_boolean(optarg);
111-
if (k < 0)
112-
return log_error_errno(k, "Failed to parse level prefix value.");
113-
114-
arg_level_prefix = k;
108+
case ARG_LEVEL_PREFIX:
109+
r = parse_boolean_argument("--level-prefix=", optarg, &arg_level_prefix);
110+
if (r < 0)
111+
return r;
115112
break;
116-
}
117113

118114
case '?':
119115
return -EINVAL;

src/mount/mount-tool.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "mount-util.h"
2424
#include "mountpoint-util.h"
2525
#include "pager.h"
26+
#include "parse-argument.h"
2627
#include "parse-util.h"
2728
#include "path-util.h"
2829
#include "pretty-print.h"
@@ -265,11 +266,9 @@ static int parse_argv(int argc, char *argv[]) {
265266
}
266267

267268
case ARG_FSCK:
268-
r = parse_boolean(optarg);
269+
r = parse_boolean_argument("--fsck=", optarg, &arg_fsck);
269270
if (r < 0)
270-
return log_error_errno(r, "Failed to parse --fsck= argument: %s", optarg);
271-
272-
arg_fsck = r;
271+
return r;
273272
break;
274273

275274
case ARG_DESCRIPTION:

src/partition/repart.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
#include "mkdir.h"
4545
#include "mkfs-util.h"
4646
#include "mount-util.h"
47-
#include "parse-util.h"
4847
#include "parse-argument.h"
48+
#include "parse-util.h"
4949
#include "path-util.h"
5050
#include "pretty-print.h"
5151
#include "proc-cmdline.h"
@@ -3575,11 +3575,9 @@ static int parse_argv(int argc, char *argv[]) {
35753575
break;
35763576

35773577
case ARG_DRY_RUN:
3578-
r = parse_boolean(optarg);
3578+
r = parse_boolean_argument("--dry-run=", optarg, &arg_dry_run);
35793579
if (r < 0)
3580-
return log_error_errno(r, "Failed to parse --dry-run= parameter: %s", optarg);
3581-
3582-
dry_run = r;
3580+
return r;
35833581
break;
35843582

35853583
case ARG_EMPTY:
@@ -3604,11 +3602,9 @@ static int parse_argv(int argc, char *argv[]) {
36043602
break;
36053603

36063604
case ARG_DISCARD:
3607-
r = parse_boolean(optarg);
3605+
r = parse_boolean_argument("--discard=", optarg, &arg_discard);
36083606
if (r < 0)
3609-
return log_error_errno(r, "Failed to parse --discard= parameter: %s", optarg);
3610-
3611-
arg_discard = r;
3607+
return r;
36123608
break;
36133609

36143610
case ARG_FACTORY_RESET:

src/resolve/resolvectl.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "missing_network.h"
2424
#include "netlink-util.h"
2525
#include "pager.h"
26+
#include "parse-argument.h"
2627
#include "parse-util.h"
2728
#include "pretty-print.h"
2829
#include "resolvconf-compat.h"
@@ -2766,11 +2767,9 @@ static int compat_parse_argv(int argc, char *argv[]) {
27662767
break;
27672768

27682769
case ARG_LEGEND:
2769-
r = parse_boolean(optarg);
2770+
r = parse_boolean_argument("--legend=", optarg, &arg_legend);
27702771
if (r < 0)
2771-
return log_error_errno(r, "Failed to parse --legend= argument");
2772-
2773-
arg_legend = r;
2772+
return r;
27742773
break;
27752774

27762775
case 'p':
@@ -3062,11 +3061,9 @@ static int native_parse_argv(int argc, char *argv[]) {
30623061
break;
30633062

30643063
case ARG_LEGEND:
3065-
r = parse_boolean(optarg);
3064+
r = parse_boolean_argument("--legend=", optarg, &arg_legend);
30663065
if (r < 0)
3067-
return log_error_errno(r, "Failed to parse --legend= argument");
3068-
3069-
arg_legend = r;
3066+
return r;
30703067
break;
30713068

30723069
case 'p':

src/shared/parse-argument.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@
1010

1111
/* All functions in this file emit warnigs. */
1212

13+
int parse_boolean_argument(const char *optname, const char *s, bool *ret) {
14+
int r;
15+
16+
/* Returns the result through *ret and the return value. */
17+
18+
if (s) {
19+
r = parse_boolean(s);
20+
if (r < 0)
21+
return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
22+
23+
*ret = r;
24+
return r;
25+
} else {
26+
/* s may be NULL. This is controlled by getopt_long() parameters. */
27+
*ret = true;
28+
return true;
29+
}
30+
}
31+
1332
int parse_json_argument(const char *s, JsonFormatFlags *ret) {
1433
assert(s);
1534
assert(ret);

src/shared/parse-argument.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "json.h"
55

6+
int parse_boolean_argument(const char *optname, const char *s, bool *ret);
67
int parse_json_argument(const char *s, JsonFormatFlags *ret);
78
int parse_path_argument(const char *path, bool suppress_root, char **arg);
89
int parse_signal_argument(const char *s, int *ret);

0 commit comments

Comments
 (0)
X Tutup