add-reboot-argument-support
authormaximilian attems <maks@debian.org>
Thu, 19 Jul 2018 00:13:54 +0000 (01:13 +0100)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 19 Jul 2018 00:13:54 +0000 (01:13 +0100)
Bug-Debian ;https://bugs.debian.org/863761
Forwarded: http://www.zytor.com/pipermail/klibc/2017-May/003957.html
Last-Update: 2017-05-22

Gbp-Pq: Name add-reboot-argument-support.patch

usr/include/sys/reboot.h
usr/klibc/reboot.c
usr/utils/halt.c

index 3337d2731c7166e2b9b0b5f0ed794ff0cb273feb..b46a1c555f99abae147f8e218baf2e8c0c061a75 100644 (file)
@@ -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 *);
index 5795dc3c5f0444fcd6339ca719d245d3782bbf8c..5aab039044a033636454f33f204d6baa5f7238f5 100644 (file)
@@ -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);
 }
index eed0a46049134848fcfcc82106b2ee81d6ca8b0c..368f095221713a3e711992d001c172efa1f86d4d 100644 (file)
@@ -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);