aboutsummaryrefslogtreecommitdiff
path: root/src/sysvinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r--src/sysvinit.c94
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);
+}

Return to:

Send suggestions and report system problems to the System administrator.