--- openrc-0.11.8.orig/src/librc/librc.c 2012-12-07 16:53:28.000000000 +0100 +++ openrc-0.11.8/src/librc/librc.c 2013-04-26 01:23:02.450136416 +0200 @@ -892,12 +892,9 @@ list = rc_services_in_runlevel(runlevel); stacks = rc_runlevel_stacks(runlevel); TAILQ_FOREACH(stack, stacks, entries) { - sl = rc_services_in_runlevel(stack->value); - if (list != NULL) { - TAILQ_CONCAT(list, sl, entries); - free(sl); - } else - list = sl; + sl = rc_services_in_runlevel_stacked(stack->value); + TAILQ_CONCAT(list, sl, entries); + free(sl); } return list; } --- openrc-0.11.8.orig/src/rc/rc-status.c 2012-12-07 16:53:28.000000000 +0100 +++ openrc-0.11.8/src/rc/rc-status.c 2013-04-26 19:23:39.995490728 +0200 @@ -171,6 +171,26 @@ rc_stringlist_free(l); } +static void +print_stacked_services(const char *runlevel) +{ + RC_STRINGLIST *stackedlevels, *servicelist; + RC_STRING *stackedlevel; + + stackedlevels = rc_runlevel_stacks(runlevel); + TAILQ_FOREACH(stackedlevel, stackedlevels, entries) { + if (rc_stringlist_find(levels, stackedlevel->value) != NULL) + continue; + print_level("Stacked", stackedlevel->value); + servicelist = rc_services_in_runlevel(stackedlevel->value); + print_services(stackedlevel->value, servicelist); + rc_stringlist_free(servicelist); + print_stacked_services(stackedlevel->value); + } + rc_stringlist_free(stackedlevels); + stackedlevels = NULL; +} + #include "_usage.h" #define extraopts "[runlevel1] [runlevel2] ..." #define getoptstring "aclrsu" getoptstring_COMMON @@ -197,7 +217,7 @@ int rc_status(int argc, char **argv) { - RC_STRING *s, *l, *t; + RC_STRING *s, *l, *t, *level; char *p, *runlevel = NULL; int opt, aflag = 0, retval = 0; @@ -278,18 +298,7 @@ print_level(NULL, l->value); services = rc_services_in_runlevel(l->value); print_services(l->value, services); - nservices = rc_runlevel_stacks(l->value); - TAILQ_FOREACH(s, nservices, entries) { - if (rc_stringlist_find(levels, s->value) != NULL) - continue; - print_level("Stacked", s->value); - sservices = rc_services_in_runlevel(s->value); - print_services(s->value, sservices); - rc_stringlist_free(sservices); - } - sservices = NULL; - rc_stringlist_free(nservices); - nservices = NULL; + print_stacked_services(l->value); rc_stringlist_free(services); services = NULL; } @@ -315,16 +324,14 @@ services = rc_services_in_runlevel(NULL); sservices = rc_stringlist_new(); TAILQ_FOREACH(l, levels, entries) { - nservices = rc_services_in_runlevel(l->value); + nservices = rc_services_in_runlevel_stacked(l->value); TAILQ_CONCAT(sservices, nservices, entries); free(nservices); } TAILQ_FOREACH_SAFE(s, services, entries, t) { - if (rc_stringlist_find(sservices, s->value) || - rc_service_state(s->value) & - (RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED)) - { - TAILQ_REMOVE(services, s, entries); + if ((rc_stringlist_find(sservices, s->value) || + (rc_service_state(s->value) & (RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED)))) { + TAILQ_REMOVE(services, s, entries); free(s->value); free(s); } @@ -335,20 +342,20 @@ alist = rc_stringlist_new(); l = rc_stringlist_add(alist, ""); p = l->value; - if (!runlevel) - runlevel = rc_runlevel_get(); - TAILQ_FOREACH_SAFE(s, services, entries, t) { - l->value = s->value; - unsetenv("RC_SVCNAME"); - setenv("RC_SVCNAME", l->value, 1); - tmp = rc_deptree_depends(deptree, needsme, alist, runlevel, RC_DEP_TRACE); - if (TAILQ_FIRST(tmp)) { - TAILQ_REMOVE(services, s, entries); - TAILQ_INSERT_TAIL(nservices, s, entries); + TAILQ_FOREACH(level, levels, entries) { + TAILQ_FOREACH_SAFE(s, services, entries, t) { + l->value = s->value; + setenv("RC_SVCNAME", l->value, 1); + tmp = rc_deptree_depends(deptree, needsme, alist, level->value, RC_DEP_TRACE); + if (TAILQ_FIRST(tmp)) { + TAILQ_REMOVE(services, s, entries); + TAILQ_INSERT_TAIL(nservices, s, entries); + } + rc_stringlist_free(tmp); } - rc_stringlist_free(tmp); } l->value = p; + unsetenv("RC_SVCNAME"); print_level("Dynamic", "needed"); print_services(NULL, nservices); print_level("Dynamic", "manual");