Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/init/halt.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/init/halt.c
r1765 r2725 5 5 * Copyright 2006 by Rob Landley <rob@landley.net> 6 6 * 7 * Licensed under GPL version 2, see file LICENSE in this tarball for details.7 * Licensed under GPLv2, see file LICENSE in this source tree. 8 8 */ 9 9 10 //applet:IF_HALT(APPLET(halt, _BB_DIR_SBIN, _BB_SUID_DROP)) 11 //applet:IF_HALT(APPLET_ODDNAME(poweroff, halt, _BB_DIR_SBIN, _BB_SUID_DROP, poweroff)) 12 //applet:IF_HALT(APPLET_ODDNAME(reboot, halt, _BB_DIR_SBIN, _BB_SUID_DROP, reboot)) 13 14 //kbuild:lib-$(CONFIG_HALT) += halt.o 15 16 //config:config HALT 17 //config: bool "poweroff, halt, and reboot" 18 //config: default y 19 //config: help 20 //config: Stop all processes and either halt, reboot, or power off the system. 21 //config: 22 //config:config FEATURE_CALL_TELINIT 23 //config: bool "Call telinit on shutdown and reboot" 24 //config: default y 25 //config: depends on HALT && !INIT 26 //config: help 27 //config: Call an external program (normally telinit) to facilitate 28 //config: a switch to a proper runlevel. 29 //config: 30 //config: This option is only available if you selected halt and friends, 31 //config: but did not select init. 32 //config: 33 //config:config TELINIT_PATH 34 //config: string "Path to telinit executable" 35 //config: default "/sbin/telinit" 36 //config: depends on FEATURE_CALL_TELINIT 37 //config: help 38 //config: When busybox halt and friends have to call external telinit 39 //config: to facilitate proper shutdown, this path is to be used when 40 //config: locating telinit executable. 41 42 //usage:#define halt_trivial_usage 43 //usage: "[-d DELAY] [-n] [-f]" IF_FEATURE_WTMP(" [-w]") 44 //usage:#define halt_full_usage "\n\n" 45 //usage: "Halt the system\n" 46 //usage: "\nOptions:" 47 //usage: "\n -d SEC Delay interval" 48 //usage: "\n -n Do not sync" 49 //usage: "\n -f Force (don't go through init)" 50 //usage: IF_FEATURE_WTMP( 51 //usage: "\n -w Only write a wtmp record" 52 //usage: ) 53 //usage: 54 //usage:#define poweroff_trivial_usage 55 //usage: "[-d DELAY] [-n] [-f]" 56 //usage:#define poweroff_full_usage "\n\n" 57 //usage: "Halt and shut off power\n" 58 //usage: "\nOptions:" 59 //usage: "\n -d SEC Delay interval" 60 //usage: "\n -n Do not sync" 61 //usage: "\n -f Force (don't go through init)" 62 //usage: 63 //usage:#define reboot_trivial_usage 64 //usage: "[-d DELAY] [-n] [-f]" 65 //usage:#define reboot_full_usage "\n\n" 66 //usage: "Reboot the system\n" 67 //usage: "\nOptions:" 68 //usage: "\n -d SEC Delay interval" 69 //usage: "\n -n Do not sync" 70 //usage: "\n -f Force (don't go through init)" 71 10 72 #include "libbb.h" 11 #include <sys/reboot.h>73 #include "reboot.h" 12 74 13 int halt_main(int argc, char **argv); 14 int halt_main(int argc, char **argv) 75 #if ENABLE_FEATURE_WTMP 76 #include <sys/utsname.h> 77 #include <utmp.h> 78 79 static void write_wtmp(void) 80 { 81 struct utmp utmp; 82 struct utsname uts; 83 /* "man utmp" says wtmp file should *not* be created automagically */ 84 /*if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { 85 close(creat(bb_path_wtmp_file, 0664)); 86 }*/ 87 memset(&utmp, 0, sizeof(utmp)); 88 utmp.ut_tv.tv_sec = time(NULL); 89 strcpy(utmp.ut_user, "shutdown"); /* it is wide enough */ 90 utmp.ut_type = RUN_LVL; 91 utmp.ut_id[0] = '~'; utmp.ut_id[1] = '~'; /* = strcpy(utmp.ut_id, "~~"); */ 92 utmp.ut_line[0] = '~'; utmp.ut_line[1] = '~'; /* = strcpy(utmp.ut_line, "~~"); */ 93 uname(&uts); 94 safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host)); 95 updwtmp(bb_path_wtmp_file, &utmp); 96 } 97 #else 98 #define write_wtmp() ((void)0) 99 #endif 100 101 102 int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 103 int halt_main(int argc UNUSED_PARAM, char **argv) 15 104 { 16 105 static const int magic[] = { 17 #ifdef RB_HALT_SYSTEM 18 RB_HALT_SYSTEM, 19 #elif defined RB_HALT 20 RB_HALT, 21 #endif 22 #ifdef RB_POWER_OFF 23 RB_POWER_OFF, 24 #elif defined RB_POWERDOWN 25 RB_POWERDOWN, 26 #endif 27 RB_AUTOBOOT 106 RB_HALT_SYSTEM, 107 RB_POWER_OFF, 108 RB_AUTOBOOT 28 109 }; 29 static const int signals[] = { SIGUSR1, SIGUSR2, SIGTERM };110 static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM }; 30 111 31 char *delay;32 int which, flags, rc = 1;112 int delay = 0; 113 int which, flags, rc; 33 114 34 115 /* Figure out which applet we're running */ 35 for (which = 0; "hpr"[which] != *applet_name; which++); 116 for (which = 0; "hpr"[which] != applet_name[0]; which++) 117 continue; 36 118 37 119 /* Parse and handle arguments */ 38 flags = getopt32(argv, "d:nf", &delay); 39 if (flags & 1) sleep(xatou(delay)); 40 if (!(flags & 2)) sync(); 120 opt_complementary = "d+"; /* -d N */ 121 /* We support -w even if !ENABLE_FEATURE_WTMP, 122 * in order to not break scripts. 123 * -i (shut down network interfaces) is ignored. 124 */ 125 flags = getopt32(argv, "d:nfwi", &delay); 126 127 sleep(delay); 128 129 write_wtmp(); 130 131 if (flags & 8) /* -w */ 132 return EXIT_SUCCESS; 133 134 if (!(flags & 2)) /* no -n */ 135 sync(); 41 136 42 137 /* Perform action. */ 43 if (ENABLE_INIT && !(flags & 4)) { 138 rc = 1; 139 if (!(flags & 4)) { /* no -f */ 140 //TODO: I tend to think that signalling linuxrc is wrong 141 // pity original author didn't comment on it... 44 142 if (ENABLE_FEATURE_INITRD) { 143 /* talk to linuxrc */ 144 /* bbox init/linuxrc assumed */ 45 145 pid_t *pidlist = find_pid_by_name("linuxrc"); 46 146 if (pidlist[0] > 0) … … 49 149 free(pidlist); 50 150 } 51 if (rc) 52 rc = kill(1, signals[which]); 53 } else 151 if (rc) { 152 /* talk to init */ 153 if (!ENABLE_FEATURE_CALL_TELINIT) { 154 /* bbox init assumed */ 155 rc = kill(1, signals[which]); 156 } else { 157 /* SysV style init assumed */ 158 /* runlevels: 159 * 0 == shutdown 160 * 6 == reboot */ 161 rc = execlp(CONFIG_TELINIT_PATH, 162 CONFIG_TELINIT_PATH, 163 which == 2 ? "6" : "0", 164 (char *)NULL 165 ); 166 } 167 } 168 } else { 54 169 rc = reboot(magic[which]); 170 } 55 171 56 172 if (rc) 57 bb_ error_msg("no");173 bb_perror_nomsg_and_die(); 58 174 return rc; 59 175 }
Note:
See TracChangeset
for help on using the changeset viewer.