diff options
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r-- | src/sysvinit.c | 94 |
1 files changed, 86 insertions, 8 deletions
diff --git a/src/sysvinit.c b/src/sysvinit.c index d8b7cc5..be7aef8 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c @@ -403,5 +403,7 @@ sysvinit_setenv (char const *data, int size) char *init_fifo = INIT_FIFO; + static void create_fifo (void); +static void powerfailcmd (int power_stat); static int @@ -457,5 +459,4 @@ sysvinit_fifo_handler (int fd, void *data) if (buf.req.runlevel != runlevel) { - progman_stop (); dfl_level = buf.req.runlevel; inittrans (); @@ -468,4 +469,16 @@ sysvinit_fifo_handler (int fd, void *data) break; + case INIT_CMD_POWERFAIL: + powerfailcmd (POWER_STAT_FAIL); + break; + + case INIT_CMD_POWERFAILNOW: + powerfailcmd (POWER_STAT_LOW); + break; + + case INIT_CMD_POWEROK: + powerfailcmd (POWER_STAT_OK); + break; + /* FIXME: react on other commands */ } @@ -574,4 +587,7 @@ sysvinit_sigtrans (int sig, int *pact) *pact = ACTION_CONT; break; + case SIGPWR: + *pact = ACTION_POWER; + break; default: return 0; @@ -655,5 +671,5 @@ inittrans () static int wait = 0; - if (progman_running_p ()) + if (progman_waiting_p ()) /* Noting to do if there are processes left in the previous runlevel */ return 0; @@ -727,14 +743,16 @@ is_comp_wait (struct component *comp) switch (comp->mode) { - case pies_comp_boot: - case pies_comp_powerfail: - case pies_comp_ctrlaltdel: + case pies_comp_sysinit: + case pies_comp_bootwait: + case pies_comp_wait: + case pies_comp_powerwait: case pies_comp_powerfailnow: - case pies_comp_kbrequest: - return 0; + case pies_comp_powerokwait: + case pies_comp_ctrlaltdel: + return 1; default: break; } - return 1; + return 0; } @@ -972,2 +990,62 @@ inittab_parse (const char *file) return err; } + +char *power_stat_file = POWER_STAT_FILE; + +void +sysvinit_power (void) +{ + int power_stat = POWER_STAT_FAIL; + int fd; + + fd = open (power_stat_file, O_RDONLY); + if (fd >= 0) + { + char c; + switch (read (fd, &c, 1)) + { + case 1: + power_stat = c; + break; + + case 0: + logmsg (LOG_NOTICE, _("unexpected EOF on %s"), power_stat_file); + break; + + case -1: + logmsg (LOG_ERR, _("error reading from %s: %s"), + power_stat_file, strerror (errno)); + } + close (fd); + if (unlink (power_stat_file)) + logmsg (LOG_ERR, _("can't unlink %s: %s"), power_stat_file, + strerror (errno)); + } + else + debug (1, (_("can't open %s: %s"), power_stat_file, strerror (errno))); + + powerfailcmd (power_stat); +} + +static void +powerfailcmd (int power_stat) +{ + int mask; + + switch (power_stat) + { + case POWER_STAT_OK: /* The power is OK */ + mask = PIES_COMP_MASK (pies_comp_powerokwait); + break; + + case POWER_STAT_LOW: /* Low battery: shut down now */ + mask = PIES_COMP_MASK (pies_comp_powerfailnow); + break; + + default: /* Power failure */ + mask = PIES_COMP_MASK (pies_comp_powerfail) + | PIES_COMP_MASK (pies_comp_powerwait); + } + + sysvinit_runlevel_setup (mask, NULL); +} |