diff options
Diffstat (limited to 'src/librc.c')
| -rw-r--r-- | src/librc.c | 111 | 
1 files changed, 64 insertions, 47 deletions
| diff --git a/src/librc.c b/src/librc.c index 46ad9d0a..366c7c49 100644 --- a/src/librc.c +++ b/src/librc.c @@ -18,19 +18,36 @@  /* File stream used for plugins to write environ vars to */  FILE *rc_environ_fd = NULL; -static const char *rc_service_state_names[] = { -	"started", -	"stopped", -	"starting", -	"stopping", -	"inactive", -	"wasinactive", -	"coldplugged", -	"failed", -	"scheduled", -	NULL +typedef struct rc_service_state_name { +	rc_service_state_t state; +	const char *name; +} rc_service_state_name_t; + +static const rc_service_state_name_t rc_service_state_names[] = { +	{ RC_SERVICE_STARTED,     "started" }, +	{ RC_SERVICE_STOPPED,     "stopped" }, +	{ RC_SERVICE_STARTING,    "starting" }, +	{ RC_SERVICE_STOPPING,    "stopping" }, +	{ RC_SERVICE_INACTIVE,    "inactive" }, +	{ RC_SERVICE_WASINACTIVE, "wasinactive" }, +	{ RC_SERVICE_COLDPLUGGED, "coldplugged" }, +	{ RC_SERVICE_FAILED,      "failed" }, +	{ RC_SERVICE_SCHEDULED,   "scheduled"}, +	{ 0, NULL}  }; +static const char *rc_parse_service_state (rc_service_state_t state) +{ +	int i; + +	for (i = 0; rc_service_state_names[i].name; i++) { +		if (rc_service_state_names[i].state == state) +			return (rc_service_state_names[i].name); +	} + +	return (NULL); +} +  bool rc_runlevel_starting (void)  {  	return (rc_is_dir (RC_STARTING)); @@ -283,14 +300,14 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)  	svc = rc_xstrdup (service);  	base = basename (svc); -	if (state != rc_service_stopped) { +	if (state != RC_SERVICE_STOPPED) {  		if (! rc_is_file(init)) {  			free (init);  			free (svc);  			return (false);  		} -		file = rc_strcatpaths (RC_SVCDIR, rc_service_state_names[state], base, +		file = rc_strcatpaths (RC_SVCDIR, rc_parse_service_state (state), base,  							   (char *) NULL);  		if (rc_exists (file))  			unlink (file); @@ -307,31 +324,32 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)  		skip_state = state;  	} -	if (state == rc_service_coldplugged) { +	if (state == RC_SERVICE_COLDPLUGGED) {  		free (init);  		free (svc);  		return (true);  	}  	/* Remove any old states now */ -	i = 0; -	while (rc_service_state_names[i]) { -		if ((i != skip_state && -			 i != rc_service_stopped && -			 i != rc_service_coldplugged && -			 i != rc_service_scheduled && -			 i != rc_service_crashed) && -			(! skip_wasinactive || i != rc_service_wasinactive)) +	for (i = 0; rc_service_state_names[i].name; i++) { +		int s = rc_service_state_names[i].state; + +		if ((s != skip_state && +			 s != RC_SERVICE_STOPPED && +			 s != RC_SERVICE_COLDPLUGGED && +			 s != RC_SERVICE_SCHEDULED && +			 s != RC_SERVICE_CRASHED) && +			(! skip_wasinactive || i != RC_SERVICE_WASINACTIVE))  		{ -			file = rc_strcatpaths (RC_SVCDIR, rc_service_state_names[i], base, +			file = rc_strcatpaths (RC_SVCDIR, rc_parse_service_state(s), base,  								   (char *) NULL);  			if (rc_exists (file)) { -				if ((state == rc_service_starting || -					 state == rc_service_stopping) && -					i == rc_service_inactive) +				if ((state == RC_SERVICE_STARTING || +					 state == RC_SERVICE_STOPPING) && +					s == RC_SERVICE_INACTIVE)  				{  					char *wasfile = rc_strcatpaths (RC_SVCDIR, -													rc_service_state_names[rc_service_wasinactive], +	rc_parse_service_state (RC_SERVICE_WASINACTIVE),  													base, (char *) NULL);  					if (symlink (init, wasfile) != 0) @@ -349,13 +367,12 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)  			}  			free (file);  		} -		i++;  	}  	/* Remove the exclusive state if we're inactive */ -	if (state == rc_service_started || -		state == rc_service_stopped || -		state == rc_service_inactive) +	if (state == RC_SERVICE_STARTED || +		state == RC_SERVICE_STOPPED || +		state == RC_SERVICE_INACTIVE)  	{  		file = rc_strcatpaths (RC_SVCDIR, "exclusive", base, (char *) NULL);  		if (rc_exists (file)) @@ -365,7 +382,7 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)  	}  	/* Remove any options and daemons the service may have stored */ -	if (state == rc_service_stopped) { +	if (state == RC_SERVICE_STOPPED) {  		char *dir = rc_strcatpaths (RC_SVCDIR, "options", base, (char *) NULL);  		if (rc_is_dir (dir)) @@ -381,7 +398,7 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)  	}  	/* These are final states, so remove us from scheduled */ -	if (state == rc_service_started || state == rc_service_stopped) { +	if (state == RC_SERVICE_STARTED || state == RC_SERVICE_STOPPED) {  		char *sdir = rc_strcatpaths (RC_SVCDIR, "scheduled", (char *) NULL);  		char **dirs = rc_ls_dir (sdir, 0);  		char *dir; @@ -419,19 +436,19 @@ bool rc_service_state (const char *service, const rc_service_state_t state)  	/* If the init script does not exist then we are stopped */  	if (! rc_service_exists (service)) -		return (state == rc_service_stopped ? true : false); +		return (state == RC_SERVICE_STOPPED ? true : false);  	/* We check stopped state by not being in any of the others */ -	if (state == rc_service_stopped) -		return ( ! (rc_service_state (service, rc_service_started) || -					rc_service_state (service, rc_service_starting) || -					rc_service_state (service, rc_service_stopping) || -					rc_service_state (service, rc_service_inactive))); +	if (state == RC_SERVICE_STOPPED) +		return ( ! (rc_service_state (service, RC_SERVICE_STARTED) || +					rc_service_state (service, RC_SERVICE_STARTING) || +					rc_service_state (service, RC_SERVICE_STOPPING) || +					rc_service_state (service, RC_SERVICE_INACTIVE)));  	/* The crashed state and scheduled states are virtual */ -	if (state == rc_service_crashed) +	if (state == RC_SERVICE_CRASHED)  		return (rc_service_daemons_crashed (service)); -	else if (state == rc_service_scheduled) { +	else if (state == RC_SERVICE_SCHEDULED) {  		char **services = rc_services_scheduled_by (service);  		retval = (services);  		if (services) @@ -442,7 +459,7 @@ bool rc_service_state (const char *service, const rc_service_state_t state)  	/* Now we just check if a file by the service name rc_exists  	   in the state dir */  	svc = rc_xstrdup (service); -	file = rc_strcatpaths (RC_SVCDIR, rc_service_state_names[state], +	file = rc_strcatpaths (RC_SVCDIR, rc_parse_service_state (state),  						   basename (svc), (char*) NULL);  	free (svc);  	retval = rc_exists (file); @@ -516,7 +533,7 @@ static pid_t _exec_service (const char *service, const char *arg)  	file = rc_resolve_service (service);  	if (! rc_is_file (file)) { -		rc_mark_service (service, rc_service_stopped); +		rc_mark_service (service, RC_SERVICE_STOPPED);  		free (file);  		return (0);  	} @@ -568,7 +585,7 @@ librc_hidden_def(rc_waitpid)  pid_t rc_stop_service (const char *service)  { -	if (rc_service_state (service, rc_service_stopped)) +	if (rc_service_state (service, RC_SERVICE_STOPPED))  		return (0);  	return (_exec_service (service, "stop")); @@ -577,7 +594,7 @@ librc_hidden_def(rc_stop_service)  pid_t rc_start_service (const char *service)  { -	if (! rc_service_state (service, rc_service_stopped)) +	if (! rc_service_state (service, RC_SERVICE_STOPPED))  		return (0);  	return (_exec_service (service, "start")); @@ -706,11 +723,11 @@ librc_hidden_def(rc_services_in_runlevel)  char **rc_services_in_state (rc_service_state_t state)  { -	char *dir = rc_strcatpaths (RC_SVCDIR, rc_service_state_names[state], +	char *dir = rc_strcatpaths (RC_SVCDIR, rc_parse_service_state (state),  								(char *) NULL);  	char **list = NULL; -	if (state == rc_service_scheduled) { +	if (state == RC_SERVICE_SCHEDULED) {  		char **dirs = rc_ls_dir (dir, 0);  		char *d;  		int i; | 
