1 /* halt / reboot - halt or reboot system (depends on name)
3 halt - calling reboot() with RBT_HALT
4 reboot - calling reboot() with RBT_REBOOT
6 author: Edvard Tuinder v892231@si.hhs.NL
8 This program calls the library function reboot(2) which performs
9 the system-call do_reboot.
13 #define _POSIX_SOURCE 1
14 #include <sys/types.h>
25 void write_log
_ARGS(( void ));
26 void usage
_ARGS(( void ));
27 int main
_ARGS(( int argc
, char *argv
[] ));
30 char *reboot_code
= "delay; boot";
35 fprintf(stderr
, "Usage: %s [-hrRf] [-x reboot-code]\n", prog
);
44 int flag
= -1; /* default action unknown */
45 int fast
= 0; /* fast halt/reboot, don't bother being nice. */
48 char *monitor_code
= "";
51 if ((prog
= strrchr(argv
[0],'/')) == NULL
) prog
= argv
[0]; else prog
++;
53 if (strcmp(prog
, "halt") == 0) flag
= RBT_HALT
;
54 if (strcmp(prog
, "reboot") == 0) flag
= RBT_REBOOT
;
57 while (i
< argc
&& argv
[i
][0] == '-') {
58 char *opt
= argv
[i
++] + 1;
60 if (*opt
== '-' && opt
[1] == 0) break; /* -- */
62 while (*opt
!= 0) switch (*opt
++) {
63 case 'h': flag
= RBT_HALT
; break;
64 case 'r': flag
= RBT_REBOOT
; break;
65 case 'R': flag
= RBT_RESET
; break;
66 case 'f': fast
= 1; break;
70 if (i
== argc
) usage();
81 if (i
!= argc
) usage();
84 fprintf(stderr
, "Don't know what to do when named '%s'\n", prog
);
88 if (flag
== RBT_REBOOT
) {
89 flag
= RBT_MONITOR
; /* set monitor code for reboot */
90 monitor_code
= reboot_code
;
93 if (stat("/usr/bin", &dummy
) < 0) {
94 /* It seems that /usr isn't present, let's assume "-f." */
98 signal(SIGHUP
, SIG_IGN
);
99 signal(SIGTERM
, SIG_IGN
);
101 /* Skip this part for fast shut down. */
103 /* Run the shutdown scripts. */
104 switch ((pid
= fork())) {
106 fprintf(stderr
, "%s: can't fork(): %s\n", prog
, strerror(errno
));
109 execl("/bin/sh", "sh", "/etc/rc", "down", (char *) NULL
);
110 fprintf(stderr
, "%s: can't execute: /bin/sh: %s\n",
111 prog
, strerror(errno
));
114 while (waitpid(pid
, NULL
, 0) != pid
) {}
118 /* Tell init to stop spawning getty's. */
121 /* Give everybody a chance to die peacefully. */
122 printf("Sending SIGTERM to all processes ...\n");
130 reboot(flag
, monitor_code
, strlen(monitor_code
));
131 fprintf(stderr
, "%s: reboot(): %s\n", strerror(errno
));