diff options
| -rw-r--r-- | ChangeLog | 1 | ||||
| -rw-r--r-- | src/librc.c | 3 | ||||
| -rw-r--r-- | src/rc-update.c | 142 | 
3 files changed, 96 insertions, 50 deletions
@@ -3,6 +3,7 @@    08 Aug 2007; Roy Marples <uberlord@gentoo.org>: +    Add help to rc-update #188170.      If given a pidfile, just match on that for seeing if we have crashed  	or not, #186159. diff --git a/src/librc.c b/src/librc.c index 9bd89cd9..5b815720 100644 --- a/src/librc.c +++ b/src/librc.c @@ -257,9 +257,6 @@ bool rc_service_in_runlevel (const char *service, const char *runlevel)  	if (! runlevel || ! service)  		return (false); -	if (! rc_service_exists (service)) -		return (false); -  	svc = rc_xstrdup (service);  	file = rc_strcatpaths (RC_RUNLEVELDIR, runlevel, basename (svc),  						   (char *) NULL); diff --git a/src/rc-update.c b/src/rc-update.c index 96eb06bb..aa996c9d 100644 --- a/src/rc-update.c +++ b/src/rc-update.c @@ -5,6 +5,8 @@     Released under the GPLv2     */ +#define APPLET "rc-update" +  #include <errno.h>  #include <limits.h>  #include <stdbool.h> @@ -21,31 +23,76 @@  static char *applet = NULL; +static void usage (void ) +{ +	printf ( +			"usage: %s -a|add script runlevel1 [runlevel2 ...]\n" +			"       %s -d|del script [runlevel1 ...]\n" +			"       %s -s|show [-v|--verbose] [runlevel1 ...]\n" +			"       %s -h|help\n" +			"\n" +			"examples:\n" +			"       # %s add net.eth0 default\n" +			"       Adds the net.eth0 script (in /etc/init.d) to the `default' runlevel.\n" +			"\n" +			"       # %s del sysklogd\n" +			"       Deletes the sysklogd script from all runlevels.  The original script\n" +			"       is not deleted, just any symlinks to the script in /etc/runlevels/*.\n" +			"\n" +			"       # %s del net.eth2 default wumpus\n" +			"       Delete the net.eth2 script from the default and wumpus runlevels.\n" +			"       All other runlevels are unaffected.  Again, the net.eth2 script\n" +			"       residing in /etc/init.d is not deleted, just any symlinks in\n" +			"       /etc/runlevels/default and /etc/runlevels/wumpus.\n" +			"\n" +			"       # %s show\n" +			"       Show all enabled scripts and list at which runlevels they will\n" +			"       execute.  Run with --verbose to see all available scripts.\n", +		applet, applet, applet, applet, applet, applet, applet, applet); +} +  static bool add (const char *runlevel, const char *service)  { -	bool retval = true; +	bool retval = false; -	if (! rc_runlevel_exists (runlevel)) { -		ewarn ("runlevel `%s' does not exist", runlevel); -		return (false); -	} -	if (rc_service_in_runlevel (service, runlevel)) { +	if (! rc_service_exists (service)) +		eerror ("service `%s' does not exist", service); +	else if (! rc_runlevel_exists (runlevel)) +		eerror ("runlevel `%s' does not exist", runlevel); +	else if (rc_service_in_runlevel (service, runlevel)) {  		ewarn ("%s already installed in runlevel `%s'; skipping",  			   service, runlevel); -		return (false); -	} - -	if (rc_service_add (runlevel, service)) +		retval = true; +	} else if (rc_service_add (runlevel, service)) {  		einfo ("%s added to runlevel %s", service, runlevel); -	else { +		retval = true; +	} else  		eerror ("%s: failed to add service `%s' to runlevel `%s': %s",  				applet, service, runlevel, strerror (errno)); -		retval = false; -	}  	return (retval);  } +static bool delete (const char *runlevel, const char *service) +{ +	bool retval = false; + +	if (rc_service_in_runlevel (service, runlevel))	{ +		if (rc_service_delete (runlevel, service)) { +			einfo ("%s removed from runlevel %s", service, runlevel); +			retval = true; +		} else +			eerror ("%s: failed to remove service `%s' from runlevel `%s': %s", +					applet, service, runlevel, strerror (errno)); +	} else if (! rc_service_exists (service)) +		eerror ("service `%s' does not exist", service); +	else if (! rc_runlevel_exists (runlevel)) +		eerror ("runlevel `%s' does not exist", runlevel); +	else +		retval = true; +	return (retval); +} +  int rc_update (int argc, char **argv)  {  	int i; @@ -53,6 +100,8 @@ int rc_update (int argc, char **argv)  	char *service;  	char **runlevels = NULL;  	char *runlevel; +	bool doadd; +	int retval;  	applet = argv[0];  	if (argc < 2 || @@ -96,8 +145,18 @@ int rc_update (int argc, char **argv)  			STRLIST_FOREACH (in, runlevel, j)  				printf (" %s", runlevel);  			printf ("\n"); +			rc_strlist_free (in);  		} +		rc_strlist_free (runlevels); +		rc_strlist_free (services); +		return (EXIT_SUCCESS); +	} else if (argc > 1 && +			   (strcmp (argv[1], "help") == 0 || +				strcmp (argv[1], "--help") == 0 || +				strcmp (argv[1], "-h") == 0)) +	{ +		usage ();  		return (EXIT_SUCCESS);  	} @@ -110,43 +169,32 @@ int rc_update (int argc, char **argv)  	if (strcmp (argv[1], "add") == 0 ||  		strcmp (argv[1], "-a") == 0) -	{ -		if (! service)  -			eerrorx ("%s: no service specified", applet); -		if (! rc_service_exists (service)) -			eerrorx ("%s: service `%s' does not exist", applet, service); - -		if (argc < 4) -			add (rc_get_runlevel (), service); - -		for (i = 3; i < argc; i++) -			add (argv[i], service); - -		return (EXIT_SUCCESS); -	} - -	if (strcmp (argv[1], "delete") == 0 || +		doadd = true; +	else if (strcmp (argv[1], "delete") == 0 ||  		strcmp (argv[1], "del") == 0 ||  		strcmp (argv[1], "-d") == 0) -	{ -		for (i = 3; i < argc; i++) -			runlevels = rc_strlist_add (runlevels, argv[i]); - -		if (! runlevels) -			runlevels = rc_strlist_add (runlevels, rc_get_runlevel ());  - -		STRLIST_FOREACH (runlevels, runlevel, i) { -			if (rc_service_in_runlevel (service, runlevel))	{ -				if (rc_service_delete (runlevel, service)) -					einfo ("%s removed from runlevel %s", service, runlevel); -				else -					eerror ("%s: failed to remove service `%s' from runlevel `%s': %s", -							applet, service, runlevel, strerror (errno)); -			} +		doadd = false; +	else +		eerrorx ("%s: unknown command `%s'", applet, argv[1]); + +	for (i = 3; i < argc; i++) +		runlevels = rc_strlist_add (runlevels, argv[i]); + +	if (! runlevels) +		runlevels = rc_strlist_add (runlevels, rc_get_runlevel ());  + +	retval = EXIT_SUCCESS; +	STRLIST_FOREACH (runlevels, runlevel, i) { +		if (doadd) { +			if (! add (runlevel, service)) +				retval = EXIT_FAILURE; +		} else { +			if (! delete (runlevel, service)) +				retval = EXIT_FAILURE;  		} - -		return (EXIT_SUCCESS);  	} -	eerrorx ("%s: unknown command `%s'", applet, argv[1]); +	rc_strlist_free (runlevels); + +	return (retval);  }  | 
