klibc-bot for Alfonso Sanchez-beato
2019-Jan-18 16:42 UTC
[klibc] [klibc:master] Add support for reboot syscall argument
Commit-ID: 6b621b8705ce5901dcf49607c8a3523c9e521901 Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=6b621b8705ce5901dcf49607c8a3523c9e521901 Author: Alfonso Sanchez-beato <alfonso.sanchez-beato at canonical.com> AuthorDate: Wed, 31 May 2017 08:34:04 +0200 Committer: Ben Hutchings <ben at decadent.org.uk> CommitDate: Wed, 2 Jan 2019 03:06:15 +0000 [klibc] 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. This can be useful in, say, devices that follow Android partitions conventions, so we can do things like rebootinig to the kernel in recovery partition with "reboot recovery". References: https://bugs.launchpad.net/ubuntu/+source/klibc/+bug/1692494 Link: https://www.zytor.com/pipermail/klibc/2017-May/003957.html Link: https://bugs.debian.org/863761 Signed-off-by: Ben Hutchings <ben at decadent.org.uk> --- usr/include/sys/reboot.h | 4 ++-- usr/klibc/reboot.c | 6 +++--- usr/utils/halt.c | 34 ++++++++++++++++++++-------------- 3 files changed, 25 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..368f095 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,28 @@ 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) { + 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);