Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/init/halt.c


Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/init/halt.c

    r1765 r2725  
    55 * Copyright 2006 by Rob Landley <rob@landley.net>
    66 *
    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.
    88 */
    99
     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
    1072#include "libbb.h"
    11 #include <sys/reboot.h>
     73#include "reboot.h"
    1274
    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
     79static 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
     102int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     103int halt_main(int argc UNUSED_PARAM, char **argv)
    15104{
    16105    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
    28109    };
    29     static const int signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
     110    static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
    30111
    31     char *delay;
    32     int which, flags, rc = 1;
     112    int delay = 0;
     113    int which, flags, rc;
    33114
    34115    /* 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;
    36118
    37119    /* 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();
    41136
    42137    /* 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...
    44142        if (ENABLE_FEATURE_INITRD) {
     143            /* talk to linuxrc */
     144            /* bbox init/linuxrc assumed */
    45145            pid_t *pidlist = find_pid_by_name("linuxrc");
    46146            if (pidlist[0] > 0)
     
    49149                free(pidlist);
    50150        }
    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 {
    54169        rc = reboot(magic[which]);
     170    }
    55171
    56172    if (rc)
    57         bb_error_msg("no");
     173        bb_perror_nomsg_and_die();
    58174    return rc;
    59175}
Note: See TracChangeset for help on using the changeset viewer.