summaryrefslogtreecommitdiffabout
authorSergey Poznyakoff <gray@gnu.org>2016-01-31 14:40:27 (GMT)
committer Sergey Poznyakoff <gray@gnu.org>2016-01-31 14:40:27 (GMT)
commitd9d267052215f223897af18310e4adee310308e7 (patch) (unidiff)
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.
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--src/ctl.c16
-rw-r--r--src/progman.c5
-rw-r--r--src/sysvinit.c60
3 files changed, 66 insertions, 15 deletions
diff --git a/src/ctl.c b/src/ctl.c
index 0e5ea97..489fc7f 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -1878,4 +1878,5 @@ fun_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;
@@ -1883,5 +1884,6 @@ fun_start (struct json_value *result, struct prog *prog)
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;
@@ -1890,5 +1892,5 @@ fun_start (struct json_value *result, struct prog *prog)
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");
diff --git a/src/progman.c b/src/progman.c
index 4ca3824..020dccd 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -305,3 +305,3 @@ progman_waiting_p ()
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),
@@ -2307,3 +2307,4 @@ progman_cleanup (int expect_term)
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 {
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
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";
@@ -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
886static char *
887strupr (char *s)
888{
889 char *p;
890 for (p = s; *p; p++)
891 *p = toupper (*p);
892 return s;
893}
894
849int 895int
@@ -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

Return to:

Send suggestions and report system problems to the System administrator.