aboutsummaryrefslogtreecommitdiff
path: root/init/halt.c
diff options
context:
space:
mode:
Diffstat (limited to 'init/halt.c')
-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 @@
#if ENABLE_FEATURE_WTMP
#include <sys/utsname.h>
#include <utmp.h>
+
+static void write_wtmp(void)
+{
+ struct utmp utmp;
+ struct utsname uts;
+ if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
+ close(creat(bb_path_wtmp_file, 0664));
+ }
+ memset(&utmp, 0, sizeof(utmp));
+ utmp.ut_tv.tv_sec = time(NULL);
+ safe_strncpy(utmp.ut_user, "shutdown", UT_NAMESIZE);
+ utmp.ut_type = RUN_LVL;
+ safe_strncpy(utmp.ut_id, "~~", sizeof(utmp.ut_id));
+ safe_strncpy(utmp.ut_line, "~~", UT_LINESIZE);
+ if (uname(&uts) == 0)
+ safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
+ updwtmp(bb_path_wtmp_file, &utmp);
+
+}
+#else
+#define write_wtmp() ((void)0)
+#endif
+
+#ifndef RB_HALT_SYSTEM
+#define RB_HALT_SYSTEM RB_HALT
+#endif
+
+#ifndef RB_POWER_OFF
+#define RB_POWER_OFF RB_POWERDOWN
#endif
int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int halt_main(int argc UNUSED_PARAM, char **argv)
{
static const int magic[] = {
-#ifdef RB_HALT_SYSTEM
RB_HALT_SYSTEM,
-#elif defined RB_HALT
- RB_HALT,
-#endif
-#ifdef RB_POWER_OFF
RB_POWER_OFF,
-#elif defined RB_POWERDOWN
- RB_POWERDOWN,
-#endif
- RB_AUTOBOOT
+ RB_AUTOBOOT
};
static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
int delay = 0;
int which, flags, rc;
-#if ENABLE_FEATURE_WTMP
- struct utmp utmp;
- struct utsname uts;
-#endif
/* Figure out which applet we're running */
- for (which = 0; "hpr"[which] != *applet_name; which++)
+ for (which = 0; "hpr"[which] != applet_name[0]; which++)
continue;
/* Parse and handle arguments */
opt_complementary = "d+"; /* -d N */
- flags = getopt32(argv, "d:nf" USE_FEATURE_WTMP("w"), &delay);
+ /* We support -w even if !ENABLE_FEATURE_WTMP, in order
+ * to not break scripts */
+ flags = getopt32(argv, "d:nfw", &delay);
sleep(delay);
-#if ENABLE_FEATURE_WTMP
- if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
- close(creat(bb_path_wtmp_file, 0664));
- }
- memset(&utmp, 0, sizeof(utmp));
- utmp.ut_tv.tv_sec = time(NULL);
- safe_strncpy(utmp.ut_user, "shutdown", UT_NAMESIZE);
- utmp.ut_type = RUN_LVL;
- safe_strncpy(utmp.ut_id, "~~", sizeof(utmp.ut_id));
- safe_strncpy(utmp.ut_line, "~~", UT_LINESIZE);
- if (uname(&uts) == 0)
- safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
- updwtmp(bb_path_wtmp_file, &utmp);
+ write_wtmp();
if (flags & 8) /* -w */
return EXIT_SUCCESS;
-#endif /* !ENABLE_FEATURE_WTMP */
if (!(flags & 2)) /* no -n */
sync();