Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/init/halt.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 816 - (hide annotations) (download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 2265 byte(s)
-updated to busybox-1.13.4
1 niro 532 /* 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 niro 816 #include "libbb.h"
11 niro 532 #include <sys/reboot.h>
12    
13 niro 816 #if ENABLE_FEATURE_WTMP
14     #include <sys/utsname.h>
15     #include <utmp.h>
16    
17     static void write_wtmp(void)
18 niro 532 {
19 niro 816 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 niro 532 #endif
38 niro 816
39     #ifndef RB_HALT_SYSTEM
40     #define RB_HALT_SYSTEM RB_HALT
41 niro 532 #endif
42 niro 816
43     #ifndef RB_POWER_OFF
44     #define RB_POWER_OFF RB_POWERDOWN
45     #endif
46    
47     int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
48     int halt_main(int argc UNUSED_PARAM, char **argv)
49     {
50     static const int magic[] = {
51     RB_HALT_SYSTEM,
52     RB_POWER_OFF,
53     RB_AUTOBOOT
54 niro 532 };
55 niro 816 static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
56 niro 532
57 niro 816 int delay = 0;
58     int which, flags, rc;
59 niro 532
60     /* Figure out which applet we're running */
61 niro 816 for (which = 0; "hpr"[which] != applet_name[0]; which++)
62     continue;
63 niro 532
64     /* Parse and handle arguments */
65 niro 816 opt_complementary = "d+"; /* -d N */
66     /* We support -w even if !ENABLE_FEATURE_WTMP, in order
67     * to not break scripts */
68     flags = getopt32(argv, "d:nfw", &delay);
69 niro 532
70 niro 816 sleep(delay);
71    
72     write_wtmp();
73    
74     if (flags & 8) /* -w */
75     return EXIT_SUCCESS;
76    
77     if (!(flags & 2)) /* no -n */
78     sync();
79    
80 niro 532 /* Perform action. */
81 niro 816 rc = 1;
82     if (!(flags & 4)) { /* no -f */
83     //TODO: I tend to think that signalling linuxrc is wrong
84     // pity original author didn't comment on it...
85 niro 532 if (ENABLE_FEATURE_INITRD) {
86     pid_t *pidlist = find_pid_by_name("linuxrc");
87     if (pidlist[0] > 0)
88     rc = kill(pidlist[0], signals[which]);
89     if (ENABLE_FEATURE_CLEAN_UP)
90     free(pidlist);
91     }
92     if (rc)
93     rc = kill(1, signals[which]);
94     } else
95     rc = reboot(magic[which]);
96    
97     if (rc)
98     bb_error_msg("no");
99     return rc;
100     }