diff --git a/man/rc-update.8 b/man/rc-update.8 index 3fa97a4e..dca4b90b 100644 --- a/man/rc-update.8 +++ b/man/rc-update.8 @@ -21,7 +21,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd May 2, 2009 +.Dd Jan 13, 2014 .Dt RC-UPDATE 8 SMM .Os OpenRC .Sh NAME @@ -35,6 +35,7 @@ .Op Ar runlevel ... .Nm .Op Fl s , -stack +.Op Fl a , -all .Ar delete .Ar service .Op Ar runlevel ... @@ -86,9 +87,16 @@ If the .Fl s , -stack option is given then we either add or remove the runlevel from the runlevel. This allows inheritance of runlevels. + +If the +.Fl a, -all +option is given, we remove the service from all runlevels. This is +useful, for example, to clean up the dangling symlinks after a service +is removed. .Sh SEE ALSO .Xr openrc 8 , .Xr openrc-run 8 , .Xr rc-status 8 .Sh AUTHORS .An Roy Marples +.An The OpenRC Team diff --git a/src/rc/rc-update.c b/src/rc/rc-update.c index 88856370..d16af1b2 100644 --- a/src/rc/rc-update.c +++ b/src/rc/rc-update.c @@ -199,13 +199,15 @@ show(RC_STRINGLIST *runlevels, bool verbose) "Usage: rc-update [options] add [...]\n" \ " or: rc-update [options] del [...]\n" \ " or: rc-update [options] [show [...]]" -#define getoptstring "su" getoptstring_COMMON +#define getoptstring "asu" getoptstring_COMMON static const struct option longopts[] = { + { "all", 0, NULL, 'a' }, { "stack", 0, NULL, 's' }, { "update", 0, NULL, 'u' }, longopts_COMMON }; static const char * const longopts_help[] = { + "Process all runlevels", "Stack a runlevel instead of a service", "Force an update of the dependency tree", longopts_help_COMMON @@ -225,7 +227,7 @@ rc_update(int argc, char **argv) char *service = NULL; char *p; int action = 0; - bool verbose = false, stack = false; + bool verbose = false, stack = false, all_runlevels = false; int opt; int retval = EXIT_FAILURE; int num_updated = 0; @@ -235,6 +237,9 @@ rc_update(int argc, char **argv) while ((opt = getopt_long(argc, argv, getoptstring, longopts, (int *)0)) != -1) switch (opt) { + case 'a': + all_runlevels = true; + break; case 's': stack = true; break; @@ -306,6 +311,10 @@ rc_update(int argc, char **argv) eerror ("%s: no service specified", applet); else { if (action & DOADD) { + if (all_runlevels) { + rc_stringlist_free(runlevels); + eerrorx("%s: the -a option is invalid with add", applet); + } actfunc = stack ? addstack : add; } else if (action & DODELETE) { actfunc = stack ? delstack : delete; @@ -315,9 +324,14 @@ rc_update(int argc, char **argv) } if (!TAILQ_FIRST(runlevels)) { - p = rc_runlevel_get(); - rc_stringlist_add(runlevels, p); - free(p); + if (all_runlevels) { + free(runlevels); + runlevels = rc_runlevel_list(); + } else { + p = rc_runlevel_get(); + rc_stringlist_add(runlevels, p); + free(p); + } } if (!TAILQ_FIRST(runlevels)) {