/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#include <getopt.h>
#include <stdio.h>
#include "bus-util.h"
log_warning_errno(orig_stdout_fd, "Failed to duplicate fd 1: %m");
else
assert_se(freopen("/dev/null", "w", stdout));
-
- opterr = 0; /* do not print errors */
}
/* We need to reset some global state manually here since libfuzzer feeds a single process with
* multiple inputs, so we might carry over state from previous invocations that can trigger
* certain asserts. */
- optind = 0; /* this tells the getopt machinery to reinitialize */
arg_transport = BUS_TRANSPORT_LOCAL;
- r = systemctl_dispatch_parse_argv(strv_length(argv), argv, /* remaining_args= */ NULL);
+ r = systemctl_dispatch_parse_argv(strv_length(argv), argv,
+ /* log_level_shift= */ LOG_DEBUG - LOG_ERR,
+ /* remaining_args= */ NULL);
if (r < 0)
log_error_errno(r, "Failed to parse args: %m");
else
return 0;
}
-int halt_parse_argv(int argc, char *argv[]) {
+int halt_parse_argv(int argc, char *argv[], int log_level_shift) {
int r;
assert(argc >= 0);
assert(argv);
- OptionParser opts = { argc, argv, .namespace = "halt" };
+ OptionParser opts = {
+ argc, argv,
+ .namespace = "halt",
+ .log_level_shift = log_level_shift,
+ };
FOREACH_OPTION_OR_RETURN(c, &opts)
switch (c) {
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
-int halt_parse_argv(int argc, char *argv[]);
-
+int halt_parse_argv(int argc, char *argv[], int log_level_shift);
int halt_main(void);
return 0;
}
-int shutdown_parse_argv(int argc, char *argv[]) {
+int shutdown_parse_argv(int argc, char *argv[], int log_level_shift) {
int r;
assert(argc >= 0);
assert(argv);
- OptionParser opts = { argc, argv, .namespace = "shutdown" };
+ OptionParser opts = {
+ argc, argv,
+ .namespace = "shutdown",
+ .log_level_shift = log_level_shift,
+ };
FOREACH_OPTION_OR_RETURN(c, &opts)
switch (c) {
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
-int shutdown_parse_argv(int argc, char *argv[]);
+int shutdown_parse_argv(int argc, char *argv[], int log_level_shift);
setlocale(LC_ALL, "");
log_setup();
- r = systemctl_dispatch_parse_argv(argc, argv, &args);
+ r = systemctl_dispatch_parse_argv(argc, argv, /* log_level_shift= */ 0, &args);
if (r <= 0)
goto finish;
return 1;
}
-static int systemctl_parse_argv(int argc, char *argv[], char ***remaining_args) {
+static int systemctl_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args) {
int r;
assert(argc >= 0);
/* We default to allowing interactive authorization only in systemctl (not in the legacy commands) */
arg_ask_password = true;
- OptionParser opts = { argc, argv, .namespace = "systemctl" };
+ OptionParser opts = {
+ argc, argv,
+ .namespace = "systemctl",
+ .log_level_shift = log_level_shift,
+ };
FOREACH_OPTION_OR_RETURN(c, &opts)
switch (c) {
return 1;
}
-int systemctl_dispatch_parse_argv(int argc, char *argv[], char ***remaining_args) {
+int systemctl_dispatch_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args) {
assert(argc >= 0);
assert(argv);
if (invoked_as(argv, "halt")) {
arg_action = ACTION_HALT;
- return halt_parse_argv(argc, argv);
+ return halt_parse_argv(argc, argv, log_level_shift);
} else if (invoked_as(argv, "poweroff")) {
arg_action = ACTION_POWEROFF;
- return halt_parse_argv(argc, argv);
+ return halt_parse_argv(argc, argv, log_level_shift);
} else if (invoked_as(argv, "reboot")) {
arg_action = ACTION_REBOOT;
- return halt_parse_argv(argc, argv);
+ return halt_parse_argv(argc, argv, log_level_shift);
} else if (invoked_as(argv, "shutdown")) {
arg_action = ACTION_POWEROFF;
- return shutdown_parse_argv(argc, argv);
+ return shutdown_parse_argv(argc, argv, log_level_shift);
+
} else {
arg_action = ACTION_SYSTEMCTL;
- return systemctl_parse_argv(argc, argv, remaining_args);
+ return systemctl_parse_argv(argc, argv, log_level_shift, remaining_args);
}
}
return _arg_job_mode ?: "replace";
}
-int systemctl_dispatch_parse_argv(int argc, char *argv[], char ***remaining_args);
+int systemctl_dispatch_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args);
int systemctl_main(char **args);