aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-01-31 16:40:27 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-01-31 16:40:27 +0200
commitd9d267052215f223897af18310e4adee310308e7 (patch)
tree6b6f9eb636975f5721e00d2d71007185fa5b2fbf
parent6f9f2fd7a6952b544dccbf0bdc7f9c312f602afe (diff)
downloadpies-d9d267052215f223897af18310e4adee310308e7.tar.gz
pies-d9d267052215f223897af18310e4adee310308e7.tar.bz2
Support sysvinit ondemand components.
* src/ctl.c (fun_start): Handle status_finished same as status_sleeping (for restarting ondemand components). * src/progman.c: Respawn ondemand components. * src/sysvinit.c (enablecomp): Handle pies_comp_ondemand. (sysvinit_demand): New function. (sysvinit_fifo_handler): Handle ondemand runlevels. (inittab_parse): Support "off" fields. Convert runlevels to upper case.
-rw-r--r--src/ctl.c16
-rw-r--r--src/progman.c9
-rw-r--r--src/sysvinit.c90
3 files changed, 83 insertions, 32 deletions
diff --git a/src/ctl.c b/src/ctl.c
index 0e5ea97..489fc7f 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -1873,27 +1873,29 @@ fun_stop (struct json_value *result, struct prog *prog)
1873 return 0; 1873 return 0;
1874} 1874}
1875 1875
1876static int 1876static int
1877fun_start (struct json_value *result, struct prog *prog) 1877fun_start (struct json_value *result, struct prog *prog)
1878{ 1878{
1879 if (prog->v.p.status == status_disabled) 1879 switch (prog->v.p.status)
1880 { 1880 {
1881 case status_disabled:
1881 prog->v.p.comp->flags &= ~CF_DISABLED; 1882 prog->v.p.comp->flags &= ~CF_DISABLED;
1882 prog->v.p.status = status_enabled; 1883 prog->v.p.status = status_enabled;
1883 json_object_set_string (result, "status", "OK"); 1884 json_object_set_string (result, "status", "OK");
1884 } 1885 break;
1885 else if (prog->v.p.status == status_sleeping) 1886
1886 { 1887 case status_sleeping:
1888 case status_finished:
1887 prog->v.p.status = status_enabled; 1889 prog->v.p.status = status_enabled;
1888 prog->v.p.failcount = 0; 1890 prog->v.p.failcount = 0;
1889 prog->v.p.timestamp = 0; 1891 prog->v.p.timestamp = 0;
1890 json_object_set_string (result, "status", "OK"); 1892 json_object_set_string (result, "status", "OK");
1891 } 1893 break;
1892 else 1894
1893 { 1895 default:
1894 json_object_set_string (result, "status", "ER"); 1896 json_object_set_string (result, "status", "ER");
1895 json_object_set_string (result, "error_message", "already running"); 1897 json_object_set_string (result, "error_message", "already running");
1896 return 1; 1898 return 1;
1897 } 1899 }
1898 return 0; 1900 return 0;
1899} 1901}
diff --git a/src/progman.c b/src/progman.c
index 4ca3824..020dccd 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -300,15 +300,15 @@ progman_waiting_p ()
300 struct prog *prog; 300 struct prog *prog;
301 301
302 for (prog = proghead; prog; prog = prog->next) 302 for (prog = proghead; prog; prog = prog->next)
303 { 303 {
304 if (IS_COMPONENT (prog) && prog->v.p.wait && prog->pid > 0) 304 if (IS_COMPONENT (prog) && prog->v.p.wait && prog->pid > 0)
305 { 305 {
306 debug(1, ("%s: waiting for %s (%lu)", 306 debug (3, ("%s: waiting for %s (%lu)",
307 __FUNCTION__, prog_tag (prog), 307 __FUNCTION__, prog_tag (prog),
308 (unsigned long) prog->pid)); 308 (unsigned long) prog->pid));
309 return 1; 309 return 1;
310 } 310 }
311 } 311 }
312 return 0; 312 return 0;
313} 313}
314 314
@@ -2302,13 +2302,14 @@ progman_cleanup (int expect_term)
2302 if (listener->v.p.comp->flags & CF_WAIT) 2302 if (listener->v.p.comp->flags & CF_WAIT)
2303 enable_socket (listener->v.p.socket); 2303 enable_socket (listener->v.p.socket);
2304 } 2304 }
2305 } 2305 }
2306 else 2306 else
2307 { 2307 {
2308 if (prog->v.p.comp->mode >= pies_mark_sysvinit) 2308 if (prog->v.p.comp->mode >= pies_mark_sysvinit
2309 && prog->v.p.comp->mode != pies_comp_ondemand)
2309 { 2310 {
2310 sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog_tag (prog), 2311 sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog_tag (prog),
2311 pid, ""); 2312 pid, "");
2312 prog->v.p.status = status_finished; 2313 prog->v.p.status = status_finished;
2313 prog->v.p.wait = 0; 2314 prog->v.p.wait = 0;
2314 } 2315 }
diff --git a/src/sysvinit.c b/src/sysvinit.c
index be7aef8..337b922 100644
--- a/src/sysvinit.c
+++ b/src/sysvinit.c
@@ -235,17 +235,20 @@ enablecomp (struct prog *prog, void *data)
235 switch (comp->mode) 235 switch (comp->mode)
236 { 236 {
237 case pies_comp_sysinit: 237 case pies_comp_sysinit:
238 case pies_comp_boot: 238 case pies_comp_boot:
239 case pies_comp_bootwait: 239 case pies_comp_bootwait:
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:
242 case pies_comp_powerwait: 246 case pies_comp_powerwait:
243 case pies_comp_powerokwait: 247 case pies_comp_powerokwait:
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:
247 case pies_comp_kbrequest: 250 case pies_comp_kbrequest:
248 return s && (s->mask & PIES_COMP_MASK (comp->mode)); 251 return s && (s->mask & PIES_COMP_MASK (comp->mode));
249 default: 252 default:
250 break; 253 break;
251 } 254 }
@@ -297,13 +300,34 @@ sysvinit_runlevel_setup (int mask, int *wait)
297 s.wait = *wait; 300 s.wait = *wait;
298 } 301 }
299 progman_foreach (runlevel_setup_prog, &s); 302 progman_foreach (runlevel_setup_prog, &s);
300 if (wait) 303 if (wait)
301 *wait = s.wait; 304 *wait = s.wait;
302} 305}
303 306
307static int
308demand_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
322static void
323sysvinit_demand (int rl)
324{
325 progman_foreach (demand_prog, &rl);
326}
327
304static const char valid_runlevel_arg[] = "0123456789SsQqAaBbCcUu"; 328static const char valid_runlevel_arg[] = "0123456789SsQqAaBbCcUu";
305 329
306int 330int
307is_valid_runlevel (int c) 331is_valid_runlevel (int c)
308{ 332{
309 return !!strchr (valid_runlevel_arg, c); 333 return !!strchr (valid_runlevel_arg, c);
@@ -455,14 +479,27 @@ sysvinit_fifo_handler (int fd, void *data)
455 case 'Q': 479 case 'Q':
456 break; 480 break;
457 481
458 default: 482 default:
459 if (buf.req.runlevel != runlevel) 483 if (buf.req.runlevel != runlevel)
460 { 484 {
461 dfl_level = buf.req.runlevel; 485 switch (buf.req.runlevel)
462 inittrans (); 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 {
496 dfl_level = buf.req.runlevel;
497 inittrans ();
498 }
499 }
463 } 500 }
464 } 501 }
465 break; 502 break;
466 503
467 case INIT_CMD_SETENV: 504 case INIT_CMD_SETENV:
468 sysvinit_setenv (buf.req.data, sizeof (buf.req.data)); 505 sysvinit_setenv (buf.req.data, sizeof (buf.req.data));
@@ -816,25 +853,25 @@ struct action_parser
816 const char *action; 853 const char *action;
817 enum pies_comp_mode mode; 854 enum pies_comp_mode mode;
818 int (*parser) (struct component *comp, const char *file, unsigned line); 855 int (*parser) (struct component *comp, const char *file, unsigned line);
819}; 856};
820 857
821static struct action_parser action_tab[] = { 858static struct action_parser action_tab[] = {
822 { "wait", pies_comp_wait }, 859 { "wait", pies_comp_wait },
823 { "once", pies_comp_once }, 860 { "once", pies_comp_once },
824 { "boot", pies_comp_boot }, 861 { "boot", pies_comp_boot },
825 { "bootwait", pies_comp_bootwait }, 862 { "bootwait", pies_comp_bootwait },
826 { "powerfail", pies_comp_powerfail }, 863 { "powerfail", pies_comp_powerfail },
827 { "powerwait", pies_comp_powerwait }, 864 { "powerwait", pies_comp_powerwait },
828 { "powerokwait", pies_comp_powerokwait }, 865 { "powerokwait", pies_comp_powerokwait },
829 { "ctrlaltdel", pies_comp_ctrlaltdel }, 866 { "ctrlaltdel", pies_comp_ctrlaltdel },
830 { "ondemand", pies_comp_ondemand }, 867 { "ondemand", pies_comp_ondemand },
831 { "sysinit", pies_comp_sysinit }, 868 { "sysinit", pies_comp_sysinit },
832 { "powerfailnow", pies_comp_powerfailnow }, 869 { "powerfailnow", pies_comp_powerfailnow },
833 { "kbrequest", pies_comp_kbrequest }, 870 { "kbrequest", pies_comp_kbrequest },
834 { "respawn", pies_comp_respawn }, 871 { "respawn", pies_comp_respawn },
835 { NULL } 872 { NULL }
836}; 873};
837 874
838static struct action_parser * 875static struct action_parser *
839find_action_parser (const char *action) 876