static bool runlevel_config(const char *service, const char *level) { char *init = rc_service_resolve(service); char *conf, *dir; size_t l; bool retval; dir = dirname(init); dir = dirname(init); l = strlen(dir) + strlen(level) + strlen(service) + 10; conf = xmalloc(sizeof(char) * l); snprintf(conf, l, "%s/conf.d/%s.%s", dir, service, level); retval = exists(conf); free(conf); free(init); return retval; }
int main(int argc, char **argv) { int opt; char *service; RC_STRINGLIST *list; RC_STRING *s; RC_SERVICE state; bool if_crashed = false; bool if_exists = false; bool if_inactive = false; bool if_notstarted = false; bool if_started = false; bool if_stopped = false; applet = basename_c(argv[0]); /* Ensure that we are only quiet when explicitly told to be */ unsetenv("EINFO_QUIET"); while ((opt = getopt_long(argc, argv, getoptstring, longopts, (int *) 0)) != -1) { switch (opt) { case 'd': setenv("RC_DEBUG", "yes", 1); break; case 'D': setenv("RC_NODEPS", "yes", 1); break; case 'e': service = rc_service_resolve(optarg); opt = service ? EXIT_SUCCESS : EXIT_FAILURE; free(service); return opt; /* NOTREACHED */ case 'c': if_crashed = true; break; case 'i': if_exists = true; break; case 'I': if_inactive = true; break; case 'N': if_notstarted = true; break; case 'l': list = rc_services_in_runlevel(NULL); if (TAILQ_FIRST(list) == NULL) return EXIT_FAILURE; rc_stringlist_sort(&list); TAILQ_FOREACH(s, list, entries) printf("%s\n", s->value); rc_stringlist_free(list); return EXIT_SUCCESS; /* NOTREACHED */ case 'r': service = rc_service_resolve(optarg); if (service == NULL) return EXIT_FAILURE; printf("%s\n", service); free(service); return EXIT_SUCCESS; /* NOTREACHED */ case 's': if_started = true; break; case 'S': if_stopped = true; break; case 'Z': setenv("IN_DRYRUN", "yes", 1); break; case_RC_COMMON_GETOPT } } argc -= optind; argv += optind; if (*argv == NULL) eerrorx("%s: you need to specify a service", applet); if ((service = rc_service_resolve(*argv)) == NULL) { if (if_exists) return 0; eerrorx("%s: service `%s' does not exist", applet, *argv); } state = rc_service_state(*argv); if (if_crashed && ! (rc_service_daemons_crashed(*argv) && errno != EACCES)) return 0; if (if_inactive && ! (state & RC_SERVICE_INACTIVE)) return 0; if (if_notstarted && (state & RC_SERVICE_STARTED)) return 0; if (if_started && ! (state & RC_SERVICE_STARTED)) return 0; if (if_stopped && ! (state & RC_SERVICE_STOPPED)) return 0; *argv = service; execv(*argv, argv); eerrorx("%s: %s", applet, strerror(errno)); /* NOTREACHED */ }