systemctl.c revision 2fa4092c2829dd14e50c430ae2f23551d23c6c1d
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek This file is part of systemd.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek Copyright 2010 Lennart Poettering
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek systemd is free software; you can redistribute it and/or modify it
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek under the terms of the GNU Lesser General Public License as published by
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek the Free Software Foundation; either version 2.1 of the License, or
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek (at your option) any later version.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek systemd is distributed in the hope that it will be useful, but
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek WITHOUT ANY WARRANTY; without even the implied warranty of
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek Lesser General Public License for more details.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek You should have received a copy of the GNU Lesser General Public License
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek along with systemd; If not, see <http://www.gnu.org/licenses/>.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek#include "spawn-ask-password-agent.h"
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic const char *arg_type = NULL;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic const char *arg_load_state = NULL;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic char **arg_property = NULL;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_all = false;
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmekstatic const char *arg_job_mode = "replace";
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic UnitFileScope arg_scope = UNIT_FILE_SYSTEM;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_block = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_legend = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_pager = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_wtmp = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_wall = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_no_reload = false;
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmekstatic bool arg_ignore_inhibitors = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_dry = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_quiet = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_full = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_ask_password = true;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_failed = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic bool arg_runtime = false;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic const char *arg_kill_who = NULL;
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmekstatic const char *arg_root = NULL;
static enum transport {
static bool private_bus = false;
static void pager_open_if_enabled(void) {
if (arg_no_pager)
pager_open(false);
static void ask_password_agent_open_if_enabled(void) {
if (!arg_ask_password)
#ifdef HAVE_LOGIND
static void polkit_agent_open_if_enabled(void) {
if (!arg_ask_password)
static const char *ansi_highlight(bool b) {
if (!on_tty())
static const char *ansi_highlight_red(bool b) {
if (!on_tty())
static const char *ansi_highlight_green(bool b) {
if (!on_tty())
return EXIT_NOPERMISSION;
return EXIT_NOTINSTALLED;
return EXIT_NOTIMPLEMENTED;
return EXIT_NOTCONFIGURED;
return EXIT_FAILURE;
if (arg_no_wall)
if (arg_wall) {
_cleanup_free_ char *p;
log_oom();
if (!table[a])
static bool avoid_bus(void) {
if (running_in_chroot() > 0)
if (sd_booted() <= 0)
static int compare_unit_info(const void *a, const void *b) {
const struct unit_info *u = a, *v = b;
const char *dot;
if (arg_failed)
const struct unit_info *u;
int job_count = 0;
desc_len = 0;
if (!output_show_unit(u))
if (u->job_id != 0) {
job_count++;
if (!arg_full) {
unsigned basic_len;
if (job_count)
if (extra_len > 0) {
if (!output_show_unit(u))
if (job_count)
n_shown++;
if (!arg_no_legend) {
if (n_shown) {
if (job_count)
if (arg_all)
unsigned n_units = 0;
assert(c);
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
return -EIO;
struct unit_info *u;
if (*c >= n_units) {
struct unit_info *w;
return log_oom();
*unit_infos = w;
u = *unit_infos + *c;
static int compare_unit_file_list(const void *a, const void *b) {
const UnitFileList *u = a, *v = b;
const char *dot;
const UnitFileList *u;
if (!output_show_unit_file(u))
if (!arg_full) {
unsigned basic_cols;
if (!arg_no_legend)
const char *id;
if (!output_show_unit_file(u))
n_shown++;
if (!arg_no_legend)
unsigned c = 0, n_units = 0;
if (avoid_bus()) {
Hashmap *h;
UnitFileList *u;
Iterator i;
return log_oom();
if (!units) {
return log_oom();
HASHMAP_FOREACH(u, h, i) {
free(u);
hashmap_free(h);
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
return -EIO;
UnitFileList *u;
const char *state;
if (c >= n_units) {
UnitFileList *w;
return log_oom();
units = w;
u = units + c;
return -EIO;
if(arg_full){
return log_oom();
static int list_dependencies_get_dependencies(DBusConnection *bus, const char *name, char ***deps) {
static const char dependencies[] =
r = -EINVAL;
goto finish;
bus,
"org.freedesktop.systemd1",
path,
&reply,
NULL,
goto finish;
r = -EIO;
goto finish;
const char *prop;
r = -EIO;
goto finish;
r = -EIO;
goto finish;
log_oom();
goto finish;
return strcasecmp(*a, *b);
static int list_dependencies_one(DBusConnection *bus, const char *name, int level, char **units, unsigned int branches) {
return log_oom();
if (strv_contains(u, *c)) {
if (!unit)
return log_oom();
u = unit;
puts(u);
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
return -EIO;
if (on_tty())
return -EIO;
return -EIO;
if (on_tty())
char **name;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
DBUS_TYPE_STRING, &n,
char **name;
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
*path;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
DBUS_TYPE_STRING, &n,
return -EIO;
bus,
"org.freedesktop.systemd1",
path,
&reply,
NULL,
return -EIO;
return -EIO;
typedef struct WaitData {
char *name;
char *result;
} WaitData;
static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *message, void *data) {
assert(d);
#ifndef LEGACY
if (*result)
if (private_bus)
"sender='org.freedesktop.systemd1',"
"interface='org.freedesktop.systemd1.Manager',"
"path='/org/freedesktop/systemd1'",
&error);
return -EIO;
WaitData d;
assert(s);
zero(d);
d.set = s;
return log_oom();
while (!set_isempty(s)) {
return -ECONNREFUSED;
if (!d.result)
goto free_name;
if (!arg_quiet) {
log_error("Job for %s failed. See 'systemctl status %s' and 'journalctl -xn' for details.", strna(d.name), strna(d.name));
r = -ETIME;
r = -ECANCELED;
r = -EIO;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
&error,
DBUS_TYPE_STRING, &n,
if (!quiet)
return -EIO;
bus,
"org.freedesktop.systemd1",
path,
&reply,
NULL,
if (!quiet)
if (!quiet)
static void check_triggering_units(
const char *unit_name) {
*state;
bool print_warning_label = true;
log_oom();
if (!unit_path) {
log_oom();
bus,
"org.freedesktop.systemd1",
&reply,
NULL,
bus,
"org.freedesktop.systemd1",
&reply,
NULL,
const char * const check_states[] = {
const char *service_trigger;
if (print_warning_label) {
print_warning_label = false;
static int start_unit_one(
const char *method,
const char *name,
const char *mode,
Set *s) {
_cleanup_free_ char *n;
const char *path;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
DBUS_TYPE_STRING, &n,
r = -EADDRNOTAVAIL;
return -EIO;
return log_oom();
r = set_put(s, p);
free(p);
const char *target;
const char *verb;
const char *mode;
enum action i;
return ACTION_INVALID;
int r, ret = 0;
char **name;
method =
if (!arg_no_block) {
if (ret < 0) {
return ret;
return log_oom();
if (one_name) {
if (ret < 0)
if (!arg_no_block) {
if (one_name)
return ret;
#ifdef HAVE_LOGIND
const char *method;
if (!bus)
return -EIO;
case ACTION_REBOOT:
case ACTION_POWEROFF:
case ACTION_SUSPEND:
case ACTION_HIBERNATE:
case ACTION_HYBRID_SLEEP:
return -EINVAL;
return bus_method_call_with_reply(
bus,
"/org/freedesktop/login1",
NULL,
NULL,
return -ENOSYS;
#ifdef HAVE_LOGIND
if (!bus)
if (arg_when > 0)
if (geteuid() == 0)
if (!on_tty())
bus,
"/org/freedesktop/login1",
&reply,
NULL,
return -EIO;
return -EIO;
return -EIO;
goto next;
if (!sv)
return log_oom();
a == ACTION_HALT ||
a == ACTION_POWEROFF ||
a == ACTION_REBOOT ||
goto next;
next:
_cleanup_free_ char *type = NULL, *tty = NULL, *seat = NULL, *user = NULL, *service = NULL, *class = NULL;
log_warning("User %s is logged in on %s.", strna(user), isempty(tty) ? (isempty(seat) ? strna(service) : seat) : tty);
log_error("Please retry operation after closing inhibitors and logging out other users.\nAlternatively, ignore inhibitors and users with 'systemctl %s -i'.",
return -EPERM;
enum action a;
return -EPERM;
(a == ACTION_HALT ||
a == ACTION_POWEROFF ||
a == ACTION_REBOOT))
halt_now(a);
(a == ACTION_HALT ||
a == ACTION_POWEROFF ||
a == ACTION_REBOOT ||
a == ACTION_KEXEC ||
a == ACTION_EXIT))
if (geteuid() != 0 &&
(a == ACTION_POWEROFF ||
a == ACTION_REBOOT ||
a == ACTION_SUSPEND ||
a == ACTION_HIBERNATE ||
a == ACTION_HYBRID_SLEEP)) {
if (r == EXIT_SUCCESS)
warn_wall(a);
const char * const check_states[] = {
char **name;
int state;
if (state < 0)
return state;
if (state > 0)
const char * const check_states[] = {
char **name;
int state;
if (state < 0)
return state;
if (state > 0)
char **name;
if (!arg_kill_who)
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
DBUS_TYPE_STRING, &n,
char **argument;
method =
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
DBUS_TYPE_STRING, &n,
const char *runtime;
return log_oom();
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
return log_oom();
return log_oom();
return log_oom();
return log_oom();
if (!reply) {
return -EIO;
char **argument;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
DBUS_TYPE_STRING, &n,
return -EIO;
puts(*a);
typedef struct ExecStatusInfo {
char *name;
char *path;
char **argv;
bool ignore;
int code;
int status;
assert(i);
free(i);
const char*path;
assert(i);
assert(i);
return -EIO;
return -EIO;
if (!i->path)
return -ENOMEM;
return -EIO;
if (!i->argv)
return -ENOMEM;
if (!i->argv[n])
return -ENOMEM;
return -EIO;
typedef struct UnitStatusInfo {
const char *id;
const char *load_state;
const char *active_state;
const char *sub_state;
const char *unit_file_state;
const char *description;
const char *following;
char **documentation;
const char *fragment_path;
const char *source_path;
const char *default_control_group;
const char *load_error;
const char *result;
bool need_daemon_reload;
const char *status_text;
bool condition_result;
unsigned n_accepted;
unsigned n_connections;
bool accept;
char **listen;
const char *sysfs_path;
const char *where;
const char *what;
ExecStatusInfo *p;
const char *path;
int flags =
char **t, **t2;
assert(i);
if (i->accept)
if (i->main_pid > 0)
else if (i->control_pid > 0)
if (i->following)
if (i->load_error)
else if (path)
if (ss)
if (s1)
else if (s2)
if (s1)
else if (s2)
if (i->sysfs_path)
if (i->where)
if (i->what)
if (i->accept)
bool good;
if (p->code == 0)
if (!good) {
i->main_pid = 0;
i->control_pid = 0;
if (i->main_pid > 0) {
if (i->running) {
if (comm)
} else if (i->exit_code > 0) {
if (i->control_pid > 0)
if (i->control_pid > 0) {
if (i->status_text)
if (i->default_control_group &&
(i->main_pid > 0 || i->control_pid > 0 || cg_is_empty_by_spec(i->default_control_group, false) == 0)) {
c = columns();
if (i->main_pid > 0)
if (i->control_pid > 0)
i->id,
getuid(),
if (i->need_daemon_reload)
ansi_highlight_red(true),
ansi_highlight_red(false),
assert(i);
if (!i->documentation) {
size_t k;
char *e = NULL;
k = strlen(*p);
log_oom();
if (pid < 0) {
if (pid == 0) {
assert(i);
case DBUS_TYPE_STRING: {
if (!isempty(s)) {
i->id = s;
i->load_state = s;
i->active_state = s;
i->sub_state = s;
i->description = s;
i->fragment_path = s;
i->source_path = s;
i->default_control_group = s;
i->status_text = s;
i->sysfs_path = s;
i->where = s;
i->what = s;
i->following = s;
i->unit_file_state = s;
i->result = s;
case DBUS_TYPE_BOOLEAN: {
dbus_bool_t b;
i->accept = b;
i->need_daemon_reload = b;
i->condition_result = b;
case DBUS_TYPE_UINT32: {
uint32_t u;
i->running = true;
i->n_accepted = u;
i->n_connections = u;
case DBUS_TYPE_INT32: {
int32_t j;
i->exit_code = (int) j;
i->exit_status = (int) j;
case DBUS_TYPE_UINT64: {
uint64_t u;
case DBUS_TYPE_ARRAY: {
return -ENOMEM;
return -ENOMEM;
case DBUS_TYPE_STRUCT: {
const char *n, *message;
case DBUS_TYPE_STRUCT: {
uint32_t u;
else if (arg_all)
if (arg_all || s[0])
case DBUS_TYPE_ARRAY:
if (dbus_message_iter_get_element_type(iter) == DBUS_TYPE_STRUCT && streq(name, "EnvironmentFiles")) {
const char *path;
const char *base;
base,
} else if (dbus_message_iter_get_element_type(iter) == DBUS_TYPE_STRUCT && streq(name, "ControlGroupAttributes")) {
attr,
value);
} else if (dbus_message_iter_get_element_type(iter) == DBUS_TYPE_STRUCT && startswith(name, "Exec")) {
char _cleanup_free_ *t;
printf("%s={ path=%s ; argv[]=%s ; ignore_errors=%s ; start_time=[%s] ; stop_time=[%s] ; pid=%u ; code=%s ; status=%i%s%s }\n",
name,
strna(t),
if (arg_all)
static int show_one(const char *verb, DBusConnection *bus, const char *path, bool show_properties, bool *new_line) {
ExecStatusInfo *p;
bus,
"org.freedesktop.systemd1",
path,
&reply,
NULL,
return -EIO;
if (*new_line)
*new_line = true;
const char *name;
return -EIO;
if (show_properties)
return -EIO;
if (!show_properties) {
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
return -EIO;
const struct unit_info *u;
if (!output_show_unit(u))
return log_oom();
int r, ret = 0;
char **name;
if (show_properties)
return log_oom();
p = unit_dbus_path_from_name(n);
return log_oom();
ret = r;
} else if (show_properties) {
return log_oom();
ret = r;
ret = r;
return ret;
const char *text;
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
return -EIO;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
DBUS_TYPE_STRING, &n,
return -EIO;
bus,
"org.freedesktop.systemd1",
path,
&reply,
NULL,
return -EIO;
return -EIO;
if (!arg_quiet)
char **name;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
DBUS_TYPE_STRING, &n,
const char *method;
method =
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
&error,
r = -EADDRNOTAVAIL;
char **name;
_cleanup_free_ char *n;
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
DBUS_TYPE_STRING, &n,
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
&reply,
NULL,
return -EIO;
return -EIO;
const char *text;
return -EIO;
const char *root;
return -EINVAL;
NULL);
if (!init)
if (!init)
return log_oom();
return bus_method_call_with_reply(
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
NULL,
NULL,
const char *method;
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
method);
return log_oom();
return log_oom();
if (!reply) {
return -EIO;
const char *name;
char **k, *l, *q = NULL;
p = NULL;
r = log_oom();
goto finish;
free(p);
if (found_native)
if (found_native)
p = NULL;
r = log_oom();
goto finish;
if (!found_sysv) {
free(p);
argv[c++] =
free(q);
free(p);
r = log_oom();
goto finish;
free(l);
if (pid < 0) {
free(p);
free(q);
r = -errno;
goto finish;
} else if (pid == 0) {
free(p);
free(q);
goto finish;
if (!arg_quiet)
if (!arg_quiet)
r = -EINVAL;
goto finish;
r = -EPROTO;
goto finish;
char **i, **l, **name;
return log_oom();
strv_free(l);
return log_oom();
*i = NULL;
*mangled_names = l;
unsigned n_changes = 0, i;
carries_install_info = r;
carries_install_info = r;
carries_install_info = r;
goto finish;
if (!arg_quiet) {
for (i = 0; i < n_changes; i++) {
const char *method;
dbus_bool_t a, b;
expect_carries_install_info = true;
send_force = false;
expect_carries_install_info = true;
expect_carries_install_info = true;
send_force = false;
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
method);
r = log_oom();
goto finish;
goto finish;
goto finish;
a = arg_runtime;
r = -ENOMEM;
goto finish;
if (send_force) {
b = arg_force;
r = -ENOMEM;
goto finish;
if (!reply) {
r = -EIO;
goto finish;
goto finish;
if (expect_carries_install_info) {
goto finish;
carries_install_info = b;
r = -EIO;
goto finish;
r = -EIO;
goto finish;
r = -EIO;
goto finish;
if (!arg_quiet) {
if (!arg_no_reload)
if (carries_install_info == 0)
bool enabled;
char **name;
enabled = r > 0;
return log_oom();
free(n);
if (state < 0)
return state;
enabled = true;
if (!arg_quiet)
return log_oom();
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&reply,
NULL,
DBUS_TYPE_STRING, &n,
free(n);
DBUS_TYPE_STRING, &s,
return -EIO;
enabled = true;
if (!arg_quiet)
puts(s);
static int systemctl_help(void) {
" -a --all Show all units/properties, including dead/empty ones\n"
static int halt_help(void) {
static int shutdown_help(void) {
static int telinit_help(void) {
" 2, 3, 4, 5 Start runlevelX.target unit\n"
static int runlevel_help(void) {
static int help_types(void) {
for(i = 0; i < _UNIT_TYPE_MAX; i++) {
t = unit_type_to_string(i);
puts(t);
for(i = 0; i < _UNIT_LOAD_STATE_MAX; i++) {
t = unit_load_state_to_string(i);
puts(t);
case ARG_VERSION:
help_types();
optarg);
return -EINVAL;
char **tmp;
if (!prop)
return -ENOMEM;
if (!tmp)
return -ENOMEM;
arg_all = true;
arg_all = true;
case ARG_FAIL:
case ARG_IRREVERSIBLE:
case ARG_IGNORE_DEPENDENCIES:
case ARG_USER:
case ARG_SYSTEM:
case ARG_GLOBAL:
case ARG_NO_BLOCK:
arg_no_block = true;
case ARG_NO_LEGEND:
arg_no_legend = true;
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_NO_WALL:
arg_no_wall = true;
case ARG_ROOT:
case ARG_FULL:
arg_full = true;
case ARG_FAILED:
arg_failed = true;
arg_quiet = true;
case ARG_FORCE:
arg_force ++;
arg_force ++;
case ARG_NO_RELOAD:
arg_no_reload = true;
case ARG_KILL_WHO:
return -EINVAL;
case ARG_NO_ASK_PASSWORD:
arg_ask_password = false;
case ARG_RUNTIME:
arg_runtime = true;
return -EINVAL;
if (arg_output < 0) {
return -EINVAL;
arg_ignore_inhibitors = true;
return -EINVAL;
return -EINVAL;
return -EINVAL;
int c, runlevel;
case ARG_HELP:
halt_help();
case ARG_HALT:
case ARG_REBOOT:
arg_dry = true;
arg_no_wtmp = true;
case ARG_NO_WALL:
arg_no_wall = true;
return -EINVAL;
return -EINVAL;
return -EINVAL;
assert(t);
*_u = 0;
uint64_t u;
if (safe_atou64(t, &u) < 0)
return -EINVAL;
char *e = NULL;
time_t s;
usec_t n;
errno = 0;
return -EINVAL;
return -EINVAL;
while (*_u <= n)
case ARG_HELP:
if (kexec_loaded())
arg_dry = true;
case ARG_NO_WALL:
arg_no_wall = true;
return -EINVAL;
return -EINVAL;
char from;
} table[] = {
case ARG_HELP:
telinit_help();
case ARG_NO_WALL:
arg_no_wall = true;
return -EINVAL;
return -EINVAL;
telinit_help();
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
optind ++;
case ARG_HELP:
return -EINVAL;
return -EINVAL;
return -EINVAL;
if (kexec_loaded())
if (sd_booted() > 0) {
return -EIO;
static int action_to_runlevel(void) {
static int talk_upstart(void) {
goto finish;
r = -EIO;
goto finish;
goto finish;
if (!(m = dbus_message_new_method_call(
r = -ENOMEM;
goto finish;
r = -ENOMEM;
goto finish;
r = -EADDRNOTAVAIL;
goto finish;
r = -EIO;
goto finish;
if (bus) {
static int talk_initctl(void) {
char rl;
if (!rl)
if (fd < 0) {
return -errno;
errno = 0;
const char* verb;
MORE,
LESS,
} argc_cmp;
const int argc;
} verbs[] = {
int left;
if (left <= 0)
return -EINVAL;
return -EINVAL;
case EQUAL:
return -EINVAL;
case MORE:
return -EINVAL;
case LESS:
return -EINVAL;
if (running_in_chroot() > 0) {
return -EIO;
return -EIO;
struct sd_shutdown_command c;
if (fd < 0)
return -errno;
zero(c);
c.usec = t;
return -errno;
if (bus) {
return -errno;
if (bus) {
goto done;
if (talk_upstart() > 0)
goto done;
if (talk_initctl() > 0)
goto done;
return -EIO;
done:
case ACTION_HALT:
case ACTION_POWEROFF:
case ACTION_REBOOT:
if (geteuid() != 0) {
if (arg_when <= 0 &&
!arg_dry &&
arg_force <= 0 &&
return -EPERM;
if (arg_when > 0) {
char _cleanup_free_ *m;
if (!arg_no_wtmp) {
if (sd_booted() > 0)
r = utmp_put_shutdown();
if (arg_dry)
return -ENOSYS;
static int runlevel_main(void) {
log_open();
goto finish;
goto finish;
r = runlevel_main();
goto finish;
retval = 0;
goto finish;
if (!avoid_bus()) {
bus_connect(arg_scope == UNIT_FILE_SYSTEM ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &bus, &private_bus, &error);
private_bus = false;
private_bus = false;
switch (arg_action) {
case ACTION_SYSTEMCTL:
case ACTION_HALT:
case ACTION_POWEROFF:
case ACTION_REBOOT:
case ACTION_KEXEC:
case ACTION_RUNLEVEL2:
case ACTION_RUNLEVEL3:
case ACTION_RUNLEVEL4:
case ACTION_RUNLEVEL5:
case ACTION_RESCUE:
case ACTION_EMERGENCY:
case ACTION_DEFAULT:
case ACTION_RELOAD:
case ACTION_REEXEC:
case ACTION_CANCEL_SHUTDOWN: {
char *m = NULL;
if (arg_wall) {
goto finish;
free(m);
case ACTION_INVALID:
case ACTION_RUNLEVEL:
if (bus) {
pager_close();
return retval;