summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-09-11 09:54:23 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-09-11 09:54:23 +0000
commit9725daa03a7806b1c9c5a3c511dfe2ff9f97dd26 (patch)
tree8086e36b8ba88db3d2bedfc2a13c1f57b0aa1f31 /init
parent8d89bed8401bfbca9c5ef18f201439b3502e733b (diff)
downloadbusybox-w32-9725daa03a7806b1c9c5a3c511dfe2ff9f97dd26.tar.gz
busybox-w32-9725daa03a7806b1c9c5a3c511dfe2ff9f97dd26.tar.bz2
busybox-w32-9725daa03a7806b1c9c5a3c511dfe2ff9f97dd26.zip
halt: reinstate -w even if !FEATURE_WTMP; beautify code in halt.c
Diffstat (limited to 'init')
-rw-r--r--init/halt.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/init/halt.c b/init/halt.c
index 42b9edc08..cbb325eb9 100644
--- a/init/halt.c
+++ b/init/halt.c
@@ -13,60 +13,66 @@
13#if ENABLE_FEATURE_WTMP 13#if ENABLE_FEATURE_WTMP
14#include <sys/utsname.h> 14#include <sys/utsname.h>
15#include <utmp.h> 15#include <utmp.h>
16
17static void write_wtmp(void)
18{
19 struct utmp utmp;
20 struct utsname uts;
21 if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
22 close(creat(bb_path_wtmp_file, 0664));
23 }
24 memset(&utmp, 0, sizeof(utmp));
25 utmp.ut_tv.tv_sec = time(NULL);
26 safe_strncpy(utmp.ut_user, "shutdown", UT_NAMESIZE);
27 utmp.ut_type = RUN_LVL;
28 safe_strncpy(utmp.ut_id, "~~", sizeof(utmp.ut_id));
29 safe_strncpy(utmp.ut_line, "~~", UT_LINESIZE);
30 if (uname(&uts) == 0)
31 safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
32 updwtmp(bb_path_wtmp_file, &utmp);
33
34}
35#else
36#define write_wtmp() ((void)0)
37#endif
38
39#ifndef RB_HALT_SYSTEM
40#define RB_HALT_SYSTEM RB_HALT
41#endif
42
43#ifndef RB_POWER_OFF
44#define RB_POWER_OFF RB_POWERDOWN
16#endif 45#endif
17 46
18int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 47int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
19int halt_main(int argc UNUSED_PARAM, char **argv) 48int halt_main(int argc UNUSED_PARAM, char **argv)
20{ 49{
21 static const int magic[] = { 50 static const int magic[] = {
22#ifdef RB_HALT_SYSTEM
23 RB_HALT_SYSTEM, 51 RB_HALT_SYSTEM,
24#elif defined RB_HALT
25 RB_HALT,
26#endif
27#ifdef RB_POWER_OFF
28 RB_POWER_OFF, 52 RB_POWER_OFF,
29#elif defined RB_POWERDOWN 53 RB_AUTOBOOT
30 RB_POWERDOWN,
31#endif
32 RB_AUTOBOOT
33 }; 54 };
34 static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM }; 55 static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
35 56
36 int delay = 0; 57 int delay = 0;
37 int which, flags, rc; 58 int which, flags, rc;
38#if ENABLE_FEATURE_WTMP
39 struct utmp utmp;
40 struct utsname uts;
41#endif
42 59
43 /* Figure out which applet we're running */ 60 /* Figure out which applet we're running */
44 for (which = 0; "hpr"[which] != *applet_name; which++) 61 for (which = 0; "hpr"[which] != applet_name[0]; which++)
45 continue; 62 continue;
46 63
47 /* Parse and handle arguments */ 64 /* Parse and handle arguments */
48 opt_complementary = "d+"; /* -d N */ 65 opt_complementary = "d+"; /* -d N */
49 flags = getopt32(argv, "d:nf" USE_FEATURE_WTMP("w"), &delay); 66 /* We support -w even if !ENABLE_FEATURE_WTMP, in order
67 * to not break scripts */
68 flags = getopt32(argv, "d:nfw", &delay);
50 69
51 sleep(delay); 70 sleep(delay);
52 71
53#if ENABLE_FEATURE_WTMP 72 write_wtmp();
54 if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
55 close(creat(bb_path_wtmp_file, 0664));
56 }
57 memset(&utmp, 0, sizeof(utmp));
58 utmp.ut_tv.tv_sec = time(NULL);
59 safe_strncpy(utmp.ut_user, "shutdown", UT_NAMESIZE);
60 utmp.ut_type = RUN_LVL;
61 safe_strncpy(utmp.ut_id, "~~", sizeof(utmp.ut_id));
62 safe_strncpy(utmp.ut_line, "~~", UT_LINESIZE);
63 if (uname(&uts) == 0)
64 safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
65 updwtmp(bb_path_wtmp_file, &utmp);
66 73
67 if (flags & 8) /* -w */ 74 if (flags & 8) /* -w */
68 return EXIT_SUCCESS; 75 return EXIT_SUCCESS;
69#endif /* !ENABLE_FEATURE_WTMP */
70 76
71 if (!(flags & 2)) /* no -n */ 77 if (!(flags & 2)) /* no -n */
72 sync(); 78 sync();