Alfonso Sánchez-Beato
2017-May-22 10:24 UTC
[klibc] [PATCH] Add support for reboot syscall argument
Add support to the reboot command so an argument for the 4th parameter of the syscall can be passed around. --- usr/include/sys/reboot.h | 4 ++-- usr/klibc/reboot.c | 6 +++--- usr/utils/halt.c | 36 ++++++++++++++++++++++-------------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/usr/include/sys/reboot.h b/usr/include/sys/reboot.h index 3337d27..b46a1c5 100644 --- a/usr/include/sys/reboot.h +++ b/usr/include/sys/reboot.h @@ -16,8 +16,8 @@ #define RB_DISABLE_CAD LINUX_REBOOT_CMD_CAD_OFF #define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF -/* glibc-ish one-argument version */ -__extern int reboot(int); +/* two-arguments version of reboot */ +__extern int reboot(int, void *); /* Native four-argument system call */ __extern int __reboot(int, int, int, void *); diff --git a/usr/klibc/reboot.c b/usr/klibc/reboot.c index 5795dc3..5aab039 100644 --- a/usr/klibc/reboot.c +++ b/usr/klibc/reboot.c @@ -6,10 +6,10 @@ #include <sys/reboot.h> #include <sys/syscall.h> -/* This provides the one-argument glibc-ish version of reboot. +/* This provides two-argument reboot function (glibc flag plus reboot argument). The full four-argument system call is available as __reboot(). */ -int reboot(int flag) +int reboot(int flag, void *arg) { - return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, flag, NULL); + return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, flag, arg); } diff --git a/usr/utils/halt.c b/usr/utils/halt.c index eed0a46..c15b42a 100644 --- a/usr/utils/halt.c +++ b/usr/utils/halt.c @@ -6,7 +6,7 @@ static __noreturn usage(void) { - static char mesg[] = "Usage: {halt|reboot|poweroff} [-n]\n"; + static char mesg[] = "Usage: {halt|reboot|poweroff} [-n] [reboot-arg]\n"; write(2, mesg, sizeof(mesg) - 1); exit(1); } @@ -16,6 +16,7 @@ int main(int argc, char *argv[]) int cmd = 0; /* initalize to shut gcc up */ int do_sync = 1; char *ptr, *ptr2; + char *reboot_arg = NULL; /* Which action (program name)? */ ptr2 = ptr = argv[0]; @@ -32,23 +33,30 @@ int main(int argc, char *argv[]) usage(); /* Walk options */ - while (*++argv && **argv == '-') - switch (*++*argv) { - case 'f': - break; /* -f assumed */ - case 'n': - do_sync = 0; - break; - default: - usage(); + while (*++argv) + if (**argv == '-') { + switch (*++*argv) { + case 'f': + break; /* -f assumed */ + case 'n': + do_sync = 0; + break; + default: + usage(); + } + } else if (cmd == LINUX_REBOOT_CMD_RESTART) { + if (reboot_arg) + usage(); + reboot_arg = *argv; + cmd = LINUX_REBOOT_CMD_RESTART2; + } else { + usage(); /* args, not reboot == error */ } - if (*argv) - usage(); /* any args == error */ if (do_sync) sync(); - reboot(LINUX_REBOOT_CMD_CAD_OFF); /* Enable CTRL+ALT+DEL */ - if (!reboot(cmd)) { + reboot(LINUX_REBOOT_CMD_CAD_OFF, NULL); /* Enable CTRL+ALT+DEL */ + if (!reboot(cmd, reboot_arg)) { /* Success. Currently, CMD_HALT returns, so stop the world */ /* kill(-1, SIGSTOP); */ kill(getpid(), SIGSTOP); -- 2.9.3
Possibly Parallel Threads
- [klibc:master] Add support for reboot syscall argument
- [PATCH v2] kexec: simply pass LINUX_REBOOT_CMD_KEXEC to reboot
- Migrating from Dovecot 1 to Dovecot 2
- [PATCH] Add syscall wrappers required by libkeyutils
- [PATCH] Add syscall wrappers required by libkeyutils