diff --git a/src/service.c b/src/service.c index f16d3cb3..ae987e11 100644 --- a/src/service.c +++ b/src/service.c @@ -1893,6 +1893,8 @@ restart: case SVC_DONE_STATE: if (svc_is_changed(svc)) svc_set_state(svc, SVC_HALTED_STATE); + if (svc_is_runtask(svc) && svc_is_manual(svc) && enabled) + svc_set_state(svc, SVC_READY_STATE); break; case SVC_STOPPING_STATE: @@ -1916,11 +1918,9 @@ restart: case SVC_TYPE_TASK: case SVC_TYPE_RUN: - if (svc->manual) { + if (svc->manual) svc_stop(svc); - svc_set_state(svc, SVC_HALTED_STATE); - } else - svc_set_state(svc, SVC_DONE_STATE); + svc_set_state(svc, SVC_DONE_STATE); break; default: diff --git a/src/svc.h b/src/svc.h index 66f3b626..a81dc25e 100644 --- a/src/svc.h +++ b/src/svc.h @@ -231,6 +231,7 @@ static inline int svc_is_sysv (svc_t *svc) { return svc && SVC_TYPE_SYSV static inline int svc_is_tty (svc_t *svc) { return svc && SVC_TYPE_TTY == svc->type; } static inline int svc_is_runtask (svc_t *svc) { return svc && (SVC_TYPE_RUNTASK & svc->type);} static inline int svc_is_forking (svc_t *svc) { return svc && svc->forking; } +static inline int svc_is_manual (svc_t *svc) { return svc && svc->manual; } static inline int svc_in_runlevel (svc_t *svc, int runlevel) { return svc && ISSET(svc->runlevels, runlevel); } static inline int svc_nohup (svc_t *svc) { return svc && (0 == svc->sighup || 0 != svc->args_dirty); }