Added CONFIG_CLEAR and CONFIG_RESET to config.maemo
[busybox4maemo] / init / halt.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Poweroff reboot and halt, oh my.
4  *
5  * Copyright 2006 by Rob Landley <rob@landley.net>
6  *
7  * Licensed under GPL version 2, see file LICENSE in this tarball for details.
8  */
9
10 #include "libbb.h"
11 #include <sys/reboot.h>
12
13 #if ENABLE_FEATURE_WTMP
14 #include <sys/utsname.h>
15 #include <utmp.h>
16 #endif
17
18 int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
19 int halt_main(int argc ATTRIBUTE_UNUSED, char **argv)
20 {
21         static const int magic[] = {
22 #ifdef RB_HALT_SYSTEM
23 RB_HALT_SYSTEM,
24 #elif defined RB_HALT
25 RB_HALT,
26 #endif
27 #ifdef RB_POWER_OFF
28 RB_POWER_OFF,
29 #elif defined RB_POWERDOWN
30 RB_POWERDOWN,
31 #endif
32 RB_AUTOBOOT
33         };
34         static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
35
36         int delay = 0;
37         int which, flags, rc = 1;
38 #if ENABLE_FEATURE_WTMP
39         struct utmp utmp;
40         struct timeval tv;
41         struct utsname uts;
42 #endif
43
44         /* Figure out which applet we're running */
45         for (which = 0; "hpr"[which] != *applet_name; which++)
46                 continue;
47
48         /* Parse and handle arguments */
49         opt_complementary = "d+"; /* -d N */
50         flags = getopt32(argv, "d:nfw", &delay);
51
52         sleep(delay);
53
54 #if ENABLE_FEATURE_WTMP
55         if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
56                 close(creat(bb_path_wtmp_file, 0664));
57         }
58         memset(&utmp, 0, sizeof(utmp));
59         gettimeofday(&tv, NULL);
60         utmp.ut_tv.tv_sec = tv.tv_sec;
61         utmp.ut_tv.tv_usec = tv.tv_usec;
62         safe_strncpy(utmp.ut_user, "shutdown", UT_NAMESIZE);
63         utmp.ut_type = RUN_LVL;
64         safe_strncpy(utmp.ut_id, "~~", sizeof(utmp.ut_id));
65         safe_strncpy(utmp.ut_line, "~~", UT_LINESIZE);
66         if (uname(&uts) == 0)
67                 safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
68         updwtmp(bb_path_wtmp_file, &utmp);
69 #endif /* !ENABLE_FEATURE_WTMP */
70
71         if (flags & 8) /* -w */
72                 return 0;
73         if (!(flags & 2)) /* no -n */
74                 sync();
75
76         /* Perform action. */
77         if (ENABLE_INIT && !(flags & 4)) {
78                 if (ENABLE_FEATURE_INITRD) {
79                         pid_t *pidlist = find_pid_by_name("linuxrc");
80                         if (pidlist[0] > 0)
81                                 rc = kill(pidlist[0], signals[which]);
82                         if (ENABLE_FEATURE_CLEAN_UP)
83                                 free(pidlist);
84                 }
85                 if (rc)
86                         rc = kill(1, signals[which]);
87         } else
88                 rc = reboot(magic[which]);
89
90         if (rc)
91                 bb_error_msg("no");
92         return rc;
93 }