diff options
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r-- | src/sysvinit.c | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/src/sysvinit.c b/src/sysvinit.c index be7aef8..337b922 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c | |||
@@ -240,2 +240,6 @@ enablecomp (struct prog *prog, void *data) | |||
240 | return 0; | 240 | return 0; |
241 | |||
242 | case pies_comp_ondemand: | ||
243 | return prog->v.p.status == status_enabled; | ||
244 | |||
241 | case pies_comp_powerfail: | 245 | case pies_comp_powerfail: |
@@ -244,3 +248,2 @@ enablecomp (struct prog *prog, void *data) | |||
244 | case pies_comp_ctrlaltdel: | 248 | case pies_comp_ctrlaltdel: |
245 | case pies_comp_ondemand: | ||
246 | case pies_comp_powerfailnow: | 249 | case pies_comp_powerfailnow: |
@@ -303,2 +306,23 @@ sysvinit_runlevel_setup (int mask, int *wait) | |||
303 | 306 | ||
307 | static int | ||
308 | demand_prog (struct prog *prog, void *data) | ||
309 | { | ||
310 | int *rl = data; | ||
311 | struct component *comp = prog->v.p.comp; | ||
312 | if (comp->mode == pies_comp_ondemand | ||
313 | && comp->runlevels | ||
314 | && strchr (comp->runlevels, *rl)) | ||
315 | { | ||
316 | prog->v.p.status = status_enabled; | ||
317 | debug (1, ("%s: %s", prog_tag (prog), "enabled")); | ||
318 | } | ||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | static void | ||
323 | sysvinit_demand (int rl) | ||
324 | { | ||
325 | progman_foreach (demand_prog, &rl); | ||
326 | } | ||
327 | |||
304 | static const char valid_runlevel_arg[] = "0123456789SsQqAaBbCcUu"; | 328 | static const char valid_runlevel_arg[] = "0123456789SsQqAaBbCcUu"; |
@@ -460,2 +484,13 @@ sysvinit_fifo_handler (int fd, void *data) | |||
460 | { | 484 | { |
485 | switch (buf.req.runlevel) | ||
486 | { | ||
487 | case 'A': | ||
488 | case 'B': | ||
489 | case 'C': | ||
490 | sysvinit_demand (buf.req.runlevel); | ||
491 | break; | ||
492 | |||
493 | default: | ||
494 | if (runlevel_index (buf.req.runlevel) != -1) | ||
495 | { | ||
461 | dfl_level = buf.req.runlevel; | 496 | dfl_level = buf.req.runlevel; |
@@ -464,2 +499,4 @@ sysvinit_fifo_handler (int fd, void *data) | |||
464 | } | 499 | } |
500 | } | ||
501 | } | ||
465 | break; | 502 | break; |
@@ -848,2 +885,11 @@ find_action_parser (const char *action) | |||
848 | 885 | ||
886 | static char * | ||
887 | strupr (char *s) | ||
888 | { | ||
889 | char *p; | ||
890 | for (p = s; *p; p++) | ||
891 | *p = toupper (*p); | ||
892 | return s; | ||
893 | } | ||
894 | |||
849 | int | 895 | int |
@@ -933,4 +979,3 @@ inittab_parse (const char *file) | |||
933 | { | 979 | { |
934 | logmsg (LOG_ERR, "%s:%u: %s", | 980 | logmsg (LOG_ERR, "%s:%u: %s", file, line_no, _("not enough fields")); |
935 | file, line_no, _("not enough fields")); | ||
936 | err = 1; | 981 | err = 1; |
@@ -952,2 +997,6 @@ inittab_parse (const char *file) | |||
952 | 997 | ||
998 | if (strcmp (action, "off") == 0) | ||
999 | /* Ignore the entry */ | ||
1000 | continue; | ||
1001 | |||
953 | ap = find_action_parser (action); | 1002 | ap = find_action_parser (action); |
@@ -955,4 +1004,3 @@ inittab_parse (const char *file) | |||
955 | { | 1004 | { |
956 | logmsg (LOG_ERR, "%s:%u: %s", | 1005 | logmsg (LOG_ERR, "%s:%u: %s", file, line_no, _("unknown action")); |
957 | file, line_no, _("unknown action")); | ||
958 | err = 1; | 1006 | err = 1; |
@@ -963,3 +1011,3 @@ inittab_parse (const char *file) | |||
963 | comp->mode = ap->mode; | 1011 | comp->mode = ap->mode; |
964 | comp->runlevels = grecs_strdup (runlevels); | 1012 | comp->runlevels = grecs_strdup (strupr (runlevels)); |
965 | 1013 | ||