diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2015-11-05 10:26:17 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2015-11-05 10:26:17 +0200 |
commit | e7e3df9a6c4599f982a62bb8d7cd973ccd8cee72 (patch) | |
tree | e897c5d7e85bdaa5503aab6a25c174cf06d1c5d2 /src/progman.c | |
parent | 6cc676f7f8d86849607b7f707c8682e7efdb65c3 (diff) | |
download | pies-e7e3df9a6c4599f982a62bb8d7cd973ccd8cee72.tar.gz pies-e7e3df9a6c4599f982a62bb8d7cd973ccd8cee72.tar.bz2 |
New ctl commands: start, stop, restart, reboot, shutdown.
* src/ctl.c (CTL_ACTION_STATE): New state.
(cmdtab): Add new commands: start, stop, restart, reboot,
shutdown.
(ctlio)<action>: New member.
(ctlio_create): Initialize action.
(list_prog): List scheduled wakeup time for sleeping components.
(cmd_start,cmd_stop)
(cmd_restart,cmd_reboot,cmd_shutdown): New functions.
(ctlwr): Handle CTL_ACTION_STATE.
* src/pies.c (pies_schedule_action): New function.
(stop_components): Use progman_stop_tag().
* src/pies.h (pies_schedule_action, progman_stop_tag): New protos.
(progman_stop_component): Remove.
* src/prog.h (progman_locate, progman_stop_component): New protos.
* src/progman.c (progman_locate): New function.
(progman_cleanup): Set status depending on the CF_DISABLED bit.
(progman_stop_component): Take struct prog* as argument.
(progman_stop_tag): New function.
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/src/progman.c b/src/progman.c index d045efa..90d54b5 100644 --- a/src/progman.c +++ b/src/progman.c @@ -23,6 +23,17 @@ static pies_depmap_t depmap; static int recompute_alarm; static struct grecs_symtab *conn_tab; +struct prog * +progman_locate (const char *name) +{ + struct prog *prog; + + for (prog = proghead; prog; prog = prog->next) + if (strcmp (prog->tag, name) == 0) + break; + return prog; +} + void progman_foreach (int (*filter) (struct prog *, void *data), void *data) { @@ -624,7 +635,6 @@ static size_t envsize; /* Size of environ. If it is not 0, then we #define ENV_REMOTEIP "REMOTEIP" #define ENV_REMOTEPORT "REMOTEPORT" #define ENV_REMOTEHOST "REMOTEHOST" - static char *sockenv_hint[] = { "-" ENV_PROTO, "-" ENV_SOCKTYPE, @@ -2395,7 +2405,8 @@ progman_cleanup (int expect_term) if (is_sysvinit (prog->v.p.comp)) sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog->tag, pid, ""); - prog->v.p.status = status_enabled; + prog->v.p.status = (prog->v.p.comp->flags & CF_DISABLED) + ? status_disabled : status_enabled; prog_stop_dependents (prog); if (!expect_term) react (prog, status, pid); @@ -2426,36 +2437,44 @@ progman_cleanup (int expect_term) } void -progman_stop_component (const char *name) +progman_stop_component (struct prog *prog) { - struct prog *prog; - - for (prog = proghead; prog; prog = prog->next) - if (IS_COMPONENT (prog) && strcmp (prog->tag, name) == 0) - { - logmsg (LOG_INFO, _("stopping component `%s'"), prog->tag); - switch (prog->v.p.status) - { - case status_enabled: - case status_listener: - prog_stop (prog, SIGTERM); - break; - - case status_disabled: - if (!(prog->v.p.comp->flags & CF_DISABLED)) + if (prog && IS_COMPONENT (prog)) + { + switch (prog->v.p.status) + { + case status_enabled: + case status_listener: + logmsg (LOG_INFO, _("stopping component `%s'"), prog->tag); + prog_stop (prog, SIGTERM); + break; + + case status_disabled: + if (!(prog->v.p.comp->flags & CF_DISABLED)) + { + logmsg (LOG_INFO, _("enabling component `%s'"), prog->tag); prog->v.p.status = status_enabled; - break; + } + break; - case status_sleeping: - prog->v.p.failcount = 0; - break; - - default: - logmsg (LOG_INFO, - _("stopping component `%s': component not started"), - prog->tag); - } - } + case status_sleeping: + logmsg (LOG_INFO, _("waking up component `%s'"), prog->tag); + prog->v.p.failcount = 0; + break; + + default: + logmsg (LOG_INFO, + _("stopping component `%s': component not started"), + prog->tag); + } + } +} + +void +progman_stop_tag (const char *name) +{ + struct prog *prog = progman_locate (name); + progman_stop_component (prog); } void |