diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/librc.c | 26 | ||||
-rw-r--r-- | src/rc.c | 3 |
3 files changed, 23 insertions, 8 deletions
diff --git a/src/Makefile b/src/Makefile index 58f4032e..54660a42 100644 --- a/src/Makefile +++ b/src/Makefile @@ -80,7 +80,7 @@ RC_BINLINKS = einfon einfo ewarnn ewarn eerrorn eerror ebegin eend ewend \ RC_SBINLINKS = mark_service_starting mark_service_started \ mark_service_stopping mark_service_stopped \ mark_service_inactive mark_service_wasinactive \ - mark_service_coldplugged \ + mark_service_coldplugged mark_service_failed \ rc-abort BINLINKS = rc-status SBINLINKS = env-update rc-update runscript start-stop-daemon diff --git a/src/librc.c b/src/librc.c index 43809e2a..0995d3d6 100644 --- a/src/librc.c +++ b/src/librc.c @@ -10,8 +10,10 @@ /* usecs to wait while we poll the fifo */ #define WAIT_INTERVAL 20000000 -/* max nsecs to wait until a service comes up */ -#define WAIT_MAX 60000000000 +/* max secs to wait until a service comes up */ +#define WAIT_MAX 300 + +#define ONE_SECOND 1000000000 #define SOFTLEVEL RC_SVCDIR "/softlevel" @@ -393,7 +395,7 @@ bool rc_service_mark (const char *service, const rc_service_state_t state) skip_state = state; } - if (state == RC_SERVICE_COLDPLUGGED) { + if (state == RC_SERVICE_COLDPLUGGED || state == RC_SERVICE_FAILED) { free (init); free (svc); return (true); @@ -604,7 +606,12 @@ static pid_t _exec_service (const char *service, const char *arg) pid_t rc_service_stop (const char *service) { - if (rc_service_state (service) & RC_SERVICE_STOPPED) + rc_service_state_t state = rc_service_state (service); + + if (state & RC_SERVICE_FAILED) + return (-1); + + if (state & RC_SERVICE_STOPPED) return (0); return (_exec_service (service, "stop")); @@ -613,7 +620,12 @@ librc_hidden_def(rc_service_stop) pid_t rc_service_start (const char *service) { - if (! rc_service_state (service) & RC_SERVICE_STOPPED) + rc_service_state_t state = rc_service_state (service); + + if (state & RC_SERVICE_FAILED) + return (-1); + + if (! state & RC_SERVICE_STOPPED) return (0); return (_exec_service (service, "start")); @@ -676,7 +688,7 @@ bool rc_service_wait (const char *service) char *base; char *fifo; struct timespec ts; - int nloops = WAIT_MAX / WAIT_INTERVAL; + int nloops = WAIT_MAX * (ONE_SECOND / WAIT_INTERVAL); bool retval = false; bool forever = false; @@ -710,6 +722,8 @@ bool rc_service_wait (const char *service) nloops --; } + if (! exists (fifo)) + retval = true; free (fifo); return (retval); } @@ -317,6 +317,8 @@ static int do_mark_service (int argc, char **argv) ok = rc_service_mark (argv[0], RC_SERVICE_STOPPING); else if (strcmp (applet, "mark_service_coldplugged") == 0) ok = rc_service_mark (argv[0], RC_SERVICE_COLDPLUGGED); + else if (strcmp (applet, "mark_service_failed") == 0) + ok = rc_service_mark (argv[0], RC_SERVICE_FAILED); else eerrorx ("%s: unknown applet", applet); @@ -1057,7 +1059,6 @@ int main (int argc, char **argv) } } closedir (dp); - rmdir (RC_SVCDIR "/failed"); } mkdir (RC_STOPPING, 0755); |