basic: add a common syscall wrapper around reboot()

This mimics the raw_clone() call we have in place already and
establishes a new syscall wrapper raw_reboot() that wraps the kernel's
reboot() system call in a bit more low-level fashion that glibc's
reboot() wrapper. The main difference is that the extra "arg" argument
is supported.

Ultimately this just replaces the syscall wrapper implementation we
currently have at three places in our codebase by a single one.

With this change this means that all our syscall() invocations are
neatly separated out in static inline system call wrappers in our header
functions.
This commit is contained in:
Lennart Poettering 2018-02-21 17:42:59 +01:00
parent d06f3829cd
commit c52a937b46
5 changed files with 22 additions and 8 deletions

View File

@ -157,6 +157,7 @@ basic_sources = files('''
ratelimit.c
ratelimit.h
raw-clone.h
raw-reboot.h
refcnt.h
replace-var.c
replace-var.h

14
src/basic/raw-reboot.h Normal file
View File

@ -0,0 +1,14 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
#include <linux/reboot.h>
#include <sys/reboot.h>
#include <sys/syscall.h>
/* glibc defines the reboot() API call, which is a wrapper around the system call of the same name, but without the
* extra "arg" parameter. Since we need that parameter for some calls, let's add a "raw" wrapper that is defined the
* same way, except it takes the additional argument. */
static inline int raw_reboot(int cmd, const void *arg) {
return (int) syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg);
}

View File

@ -20,11 +20,11 @@
***/
#include <sys/reboot.h>
#include <linux/reboot.h>
#include "bus-error.h"
#include "bus-util.h"
#include "emergency-action.h"
#include "raw-reboot.h"
#include "special.h"
#include "string-table.h"
#include "terminal-util.h"
@ -88,7 +88,7 @@ int emergency_action(
if (!isempty(reboot_arg)) {
log_info("Rebooting with argument '%s'.", reboot_arg);
syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, reboot_arg);
(void) raw_reboot(LINUX_REBOOT_CMD_RESTART2, reboot_arg);
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
}

View File

@ -20,7 +20,6 @@
#include <errno.h>
#include <getopt.h>
#include <linux/reboot.h>
#include <signal.h>
#include <stdbool.h>
#include <stdlib.h>
@ -42,6 +41,7 @@
#include "missing.h"
#include "parse-util.h"
#include "process-util.h"
#include "raw-reboot.h"
#include "signal-util.h"
#include "string-util.h"
#include "switch-root.h"
@ -528,7 +528,7 @@ int main(int argc, char *argv[]) {
if (!isempty(param)) {
log_info("Rebooting with argument '%s'.", param);
syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, param);
(void) raw_reboot(LINUX_REBOOT_CMD_RESTART2, param);
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
}
}

View File

@ -22,7 +22,6 @@
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <linux/reboot.h>
#include <locale.h>
#include <stdbool.h>
#include <stddef.h>
@ -57,8 +56,8 @@
#include "format-util.h"
#include "fs-util.h"
#include "glob-util.h"
#include "hostname-util.h"
#include "hexdecoct.h"
#include "hostname-util.h"
#include "initreq.h"
#include "install.h"
#include "io-util.h"
@ -73,6 +72,7 @@
#include "path-lookup.h"
#include "path-util.h"
#include "process-util.h"
#include "raw-reboot.h"
#include "rlimit-util.h"
#include "set.h"
#include "sigbus.h"
@ -8514,8 +8514,7 @@ static int halt_now(enum action a) {
if (!arg_quiet)
log_info("Rebooting with argument '%s'.", param);
if (!arg_dry_run) {
(void) syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
LINUX_REBOOT_CMD_RESTART2, param);
(void) raw_reboot(LINUX_REBOOT_CMD_RESTART2, param);
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
}
}