Fix failed services a little, and make timeout more sane
This commit is contained in:
parent
31c6cacb0a
commit
2613316686
@ -80,7 +80,7 @@ RC_BINLINKS = einfon einfo ewarnn ewarn eerrorn eerror ebegin eend ewend \
|
|||||||
RC_SBINLINKS = mark_service_starting mark_service_started \
|
RC_SBINLINKS = mark_service_starting mark_service_started \
|
||||||
mark_service_stopping mark_service_stopped \
|
mark_service_stopping mark_service_stopped \
|
||||||
mark_service_inactive mark_service_wasinactive \
|
mark_service_inactive mark_service_wasinactive \
|
||||||
mark_service_coldplugged \
|
mark_service_coldplugged mark_service_failed \
|
||||||
rc-abort
|
rc-abort
|
||||||
BINLINKS = rc-status
|
BINLINKS = rc-status
|
||||||
SBINLINKS = env-update rc-update runscript start-stop-daemon
|
SBINLINKS = env-update rc-update runscript start-stop-daemon
|
||||||
|
26
src/librc.c
26
src/librc.c
@ -10,8 +10,10 @@
|
|||||||
/* usecs to wait while we poll the fifo */
|
/* usecs to wait while we poll the fifo */
|
||||||
#define WAIT_INTERVAL 20000000
|
#define WAIT_INTERVAL 20000000
|
||||||
|
|
||||||
/* max nsecs to wait until a service comes up */
|
/* max secs to wait until a service comes up */
|
||||||
#define WAIT_MAX 60000000000
|
#define WAIT_MAX 300
|
||||||
|
|
||||||
|
#define ONE_SECOND 1000000000
|
||||||
|
|
||||||
#define SOFTLEVEL RC_SVCDIR "/softlevel"
|
#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;
|
skip_state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == RC_SERVICE_COLDPLUGGED) {
|
if (state == RC_SERVICE_COLDPLUGGED || state == RC_SERVICE_FAILED) {
|
||||||
free (init);
|
free (init);
|
||||||
free (svc);
|
free (svc);
|
||||||
return (true);
|
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)
|
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 (0);
|
||||||
|
|
||||||
return (_exec_service (service, "stop"));
|
return (_exec_service (service, "stop"));
|
||||||
@ -613,7 +620,12 @@ librc_hidden_def(rc_service_stop)
|
|||||||
|
|
||||||
pid_t rc_service_start (const char *service)
|
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 (0);
|
||||||
|
|
||||||
return (_exec_service (service, "start"));
|
return (_exec_service (service, "start"));
|
||||||
@ -676,7 +688,7 @@ bool rc_service_wait (const char *service)
|
|||||||
char *base;
|
char *base;
|
||||||
char *fifo;
|
char *fifo;
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int nloops = WAIT_MAX / WAIT_INTERVAL;
|
int nloops = WAIT_MAX * (ONE_SECOND / WAIT_INTERVAL);
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
bool forever = false;
|
bool forever = false;
|
||||||
|
|
||||||
@ -710,6 +722,8 @@ bool rc_service_wait (const char *service)
|
|||||||
nloops --;
|
nloops --;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! exists (fifo))
|
||||||
|
retval = true;
|
||||||
free (fifo);
|
free (fifo);
|
||||||
return (retval);
|
return (retval);
|
||||||
}
|
}
|
||||||
|
3
src/rc.c
3
src/rc.c
@ -317,6 +317,8 @@ static int do_mark_service (int argc, char **argv)
|
|||||||
ok = rc_service_mark (argv[0], RC_SERVICE_STOPPING);
|
ok = rc_service_mark (argv[0], RC_SERVICE_STOPPING);
|
||||||
else if (strcmp (applet, "mark_service_coldplugged") == 0)
|
else if (strcmp (applet, "mark_service_coldplugged") == 0)
|
||||||
ok = rc_service_mark (argv[0], RC_SERVICE_COLDPLUGGED);
|
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
|
else
|
||||||
eerrorx ("%s: unknown applet", applet);
|
eerrorx ("%s: unknown applet", applet);
|
||||||
|
|
||||||
@ -1057,7 +1059,6 @@ int main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir (dp);
|
closedir (dp);
|
||||||
rmdir (RC_SVCDIR "/failed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mkdir (RC_STOPPING, 0755);
|
mkdir (RC_STOPPING, 0755);
|
||||||
|
Loading…
Reference in New Issue
Block a user