--- chkconfig.c.orig 2004-01-18 09:51:20.000000000 +0100 +++ chkconfig.c 2004-01-18 10:50:21.000000000 +0100 @@ -22,7 +22,7 @@ fprintf(stderr, _("This may be freely redistributed under the terms of " "the GNU Public License.\n")); fprintf(stderr, "\n"); - fprintf(stderr, _("usage: %s --list [name]\n"), progname); + fprintf(stderr, _("usage: %s [--priority] [--skip-xinetd] [--show-level ] --list [name]\n"), progname); fprintf(stderr, _(" %s --add \n"), progname); fprintf(stderr, _(" %s --del \n"), progname); fprintf(stderr, _(" %s [--level ] %s)\n"), progname, ""); @@ -183,7 +183,7 @@ return 0; } -static int showServiceInfo(char * name, int forgiving) { +static int showServiceInfo(char * name, int forgiving, int priority, int level) { int rc; int i; struct service s; @@ -206,16 +206,28 @@ return forgiving ? 0 : 1; } + int show = 1; + if (level != -1) + { + show = isOn(s.name, level); + } + + if (show) + { printf("%-15s", s.name); if (s.type == TYPE_XINETD) { printf("\t%s\n", s.levels ? _("on") : _("off")); return 0; } + if (priority) + printf("\t%d\t%d", s.sPriority, s.kPriority); + for (i = 0; i < 7; i++) { printf("\t%d:%s", i, isOn(s.name, i) ? _("on") : _("off")); } printf("\n"); + } return 0; } @@ -235,14 +247,14 @@ } -static int listService(char * item) { +static int listService(char * item, int priority, int skipxinetd, int level) { DIR * dir; struct dirent * ent; struct stat sb; char fn[1024]; int err = 0; - if (item) return showServiceInfo(item, 0); + if (item) return showServiceInfo(item, 0, priority, level); if (!(dir = opendir(RUNLEVELS "/init.d"))) { fprintf(stderr, _("failed to open %s/init.d: %s\n"), RUNLEVELS, @@ -272,7 +284,7 @@ } if (!S_ISREG(sb.st_mode)) continue; - if (showServiceInfo(ent->d_name, 1)) { + if (showServiceInfo(ent->d_name, 1, priority, level)) { closedir(dir); return 1; } @@ -286,7 +298,7 @@ closedir(dir); - if (isXinetdEnabled()) { + if (isXinetdEnabled() && !skipxinetd) { printf(_("xinetd based services:\n")); if (!(dir = opendir(XINETDDIR))) { fprintf(stderr, _("failed to open directory %s: %s\n"), @@ -357,7 +369,7 @@ } int main(int argc, char ** argv) { - int listItem = 0, addItem = 0, delItem = 0; + int listItem = 0, priorityItem=0, skipxinetdItem=0, showlevelItem=-1, addItem = 0, delItem = 0; int rc, i, x; int LSB = 0; char * levels = NULL; @@ -367,6 +379,9 @@ { "add", '\0', 0, &addItem, 0 }, { "del", '\0', 0, &delItem, 0 }, { "list", '\0', 0, &listItem, 0 }, + { "priority", '\0', 0, &priorityItem, 0 }, + { "skip-xinetd", '\0', 0, &skipxinetdItem, 0 }, + { "show-level", '\0', POPT_ARG_INT, &showlevelItem, 0 }, { "level", '\0', POPT_ARG_STRING, &levels, 0 }, { "levels", '\0', POPT_ARG_STRING, &levels, 0 }, { "help", 'h', POPT_ARG_NONE, &help, 0 }, @@ -436,7 +451,9 @@ if (item && poptGetArg(optCon)) usage(); - return listService(item); + if (showlevelItem < -1 || showlevelItem > 6) usage(); + + return listService(item, priorityItem, skipxinetdItem, showlevelItem); } else { char * name = (char *)poptGetArg(optCon); char * state = (char *)poptGetArg(optCon);