aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-10-05 10:16:14 +0000
committerRoy Marples <roy@marples.name>2007-10-05 10:16:14 +0000
commit05b8eff319536ade894d07705bc74abaf425788e (patch)
tree499e2bdf43323f6b3901ff11685fba71cc813cb5 /src
parentefe6e76cc14fb92c2784ef29d40ef42860078d74 (diff)
Punt rc_ls_dir
Diffstat (limited to 'src')
-rw-r--r--src/env-update.c87
-rw-r--r--src/librc-daemon.c79
-rw-r--r--src/librc-depend.c34
-rw-r--r--src/librc-misc.c41
-rw-r--r--src/librc.c62
-rw-r--r--src/librc.h1
-rw-r--r--src/rc-depend.c2
-rw-r--r--src/rc-plugin.c28
-rw-r--r--src/rc.c100
-rw-r--r--src/rc.h11
-rw-r--r--src/rc.map1
11 files changed, 229 insertions, 217 deletions
diff --git a/src/env-update.c b/src/env-update.c
index c9fbf1a8..2f97719f 100644
--- a/src/env-update.c
+++ b/src/env-update.c
@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <sys/stat.h>
+#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
@@ -90,8 +91,8 @@ static const char * const longopts_help[] = {
int env_update (int argc, char **argv)
{
- char **files = rc_ls_dir (ENVDIR, 0);
- char *file;
+ DIR *dp;
+ struct dirent *d;
char **envs = NULL;
char *env;
int i = 0;
@@ -108,6 +109,9 @@ int env_update (int argc, char **argv)
bool ldconfig = true;
bool fork_ldconfig = false;
int nents = 0;
+ char *path;
+ char **entries = NULL;
+ struct stat buf;
applet = argv[0];
@@ -126,45 +130,50 @@ int env_update (int argc, char **argv)
}
}
- if (! files)
- eerrorx ("%s: no files in " ENVDIR " to process", applet);
+ if (! (dp = opendir (ENVDIR)))
+ eerrorx ("%s: opendir `" ENVDIR "': %s", applet, strerror (errno));
- STRLIST_FOREACH (files, file, i) {
- char *path = rc_strcatpaths (ENVDIR, file, (char *) NULL);
- char **entries = NULL;
- struct stat buf;
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == '.')
+ continue;
- j = strlen (file);
- if (stat (file, &buf) == 0 && S_ISDIR (buf.st_mode) == 0 &&
+ j = strlen (d->d_name);
+ if (stat (d->d_name, &buf) == 0 && S_ISDIR (buf.st_mode) == 0 &&
j > 2 &&
- *file >= '0' &&
- *file <= '9' &&
- *(file + 1) >= '0' &&
- *(file + 1) <= '9' &&
- *(file + j - 1) != '~' &&
- (j < 4 || strcmp (file + j - 4, ".bak") != 0) &&
- (j < 5 || strcmp (file + j - 5, ".core") != 0))
+ d->d_name[0] >= '0' &&
+ d->d_name[0] <= '9' &&
+ d->d_name[1] >= '0' &&
+ d->d_name[1] <= '9' &&
+ d->d_name[j - 1] != '~' &&
+ (j < 4 || strcmp (d->d_name + j - 4, ".bak") != 0) &&
+ (j < 5 || strcmp (d->d_name + j - 5, ".core") != 0))
+ {
+ path = rc_strcatpaths (ENVDIR, d->d_name, (char *) NULL);
entries = rc_config_load (path);
- free (path);
-
- STRLIST_FOREACH (entries, entry, j) {
- char *tmpent = rc_xstrdup (entry);
- char *value = tmpent;
- char *var = strsep (&value, "=");
-
- if (strcmp (var, "COLON_SEPARATED") == 0)
- while ((var = strsep (&value, " ")))
- rc_strlist_addu (&mycolons, var);
- else if (strcmp (var, "SPACE_SEPARATED") == 0)
- while ((var = strsep (&value, " ")))
- rc_strlist_addu (&myspaces, var);
- else
- rc_strlist_add (&config, entry);
- free (tmpent);
+ free (path);
+
+ STRLIST_FOREACH (entries, entry, j) {
+ char *tmpent = rc_xstrdup (entry);
+ char *value = tmpent;
+ char *var = strsep (&value, "=");
+
+ if (strcmp (var, "COLON_SEPARATED") == 0)
+ while ((var = strsep (&value, " ")))
+ rc_strlist_addu (&mycolons, var);
+ else if (strcmp (var, "SPACE_SEPARATED") == 0)
+ while ((var = strsep (&value, " ")))
+ rc_strlist_addu (&myspaces, var);
+ else
+ rc_strlist_add (&config, entry);
+ free (tmpent);
+ }
+ rc_strlist_free (entries);
}
-
- rc_strlist_free (entries);
}
+ closedir (dp);
+
+ if (! config)
+ eerrorx ("%s: nothing to process", applet);
STRLIST_FOREACH (config, entry, i) {
char *tmpent = rc_xstrdup (entry);
@@ -241,7 +250,6 @@ int env_update (int argc, char **argv)
rc_strlist_free (mycolons);
rc_strlist_free (myspaces);
rc_strlist_free (config);
- rc_strlist_free (files);
if ((fp = fopen (PROFILE_ENV, "w")) == NULL)
eerrorx ("%s: fopen `%s': %s", applet, PROFILE_ENV, strerror (errno));
@@ -288,11 +296,8 @@ int env_update (int argc, char **argv)
return (EXIT_SUCCESS);
}
- while ((file = strsep (&ldent, ":"))) {
- if (strlen (file) == 0)
- continue;
-
- if (rc_strlist_addu (&ldents, file))
+ while ((env = strsep (&ldent, ":"))) {
+ if (*env && rc_strlist_addu (&ldents, env))
nents++;
}
diff --git a/src/librc-daemon.c b/src/librc-daemon.c
index 90d28c6f..ebad6a54 100644
--- a/src/librc-daemon.c
+++ b/src/librc-daemon.c
@@ -289,9 +289,7 @@ bool rc_service_daemon_set (const char *service, const char *exec,
{
char *svc;
char *dirpath;
- char **files = NULL;
- char *file;
- char *ffile = NULL;
+ char *file = NULL;
int i;
char *mexec;
char *mname;
@@ -299,6 +297,8 @@ bool rc_service_daemon_set (const char *service, const char *exec,
int nfiles = 0;
char *oldfile = NULL;
bool retval = false;
+ DIR *dp;
+ struct dirent *d;
if (! exec && ! name && ! pidfile) {
errno = EINVAL;
@@ -331,25 +331,30 @@ bool rc_service_daemon_set (const char *service, const char *exec,
mpidfile = rc_xstrdup ("pidfile=");
/* Regardless, erase any existing daemon info */
- files = rc_ls_dir (dirpath, 0);
- STRLIST_FOREACH (files, file, i) {
- ffile = rc_strcatpaths (dirpath, file, (char *) NULL);
- nfiles++;
-
- if (! oldfile) {
- if (_match_daemon (dirpath, file, mexec, mname, mpidfile)) {
- unlink (ffile);
- oldfile = ffile;
- nfiles--;
+ if ((dp = opendir (dirpath))) {
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == '.')
+ continue;
+ file = rc_strcatpaths (dirpath, d->d_name, (char *) NULL);
+ nfiles++;
+
+ if (! oldfile) {
+ if (_match_daemon (dirpath, d->d_name,
+ mexec, mname, mpidfile))
+ {
+ unlink (file);
+ oldfile = file;
+ nfiles--;
+ }
+ } else {
+ rename (file, oldfile);
+ free (oldfile);
+ oldfile = file;
}
- } else {
- rename (ffile, oldfile);
- free (oldfile);
- oldfile = ffile;
}
+ free (file);
+ closedir (dp);
}
- free (ffile);
- rc_strlist_free (files);
/* Now store our daemon info */
if (started) {
@@ -387,6 +392,8 @@ bool rc_service_started_daemon (const char *service, const char *exec,
char *mexec;
bool retval = false;
char *svc;
+ DIR *dp;
+ struct dirent *d;
if (! service || ! exec)
return (false);
@@ -407,13 +414,16 @@ bool rc_service_started_daemon (const char *service, const char *exec,
retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
free (file);
} else {
- char **files = rc_ls_dir (dirpath, 0);
- STRLIST_FOREACH (files, file, i) {
- retval = _match_daemon (dirpath, file, mexec, NULL, NULL);
- if (retval)
- break;
+ if ((dp = opendir (dirpath))) {
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == ',')
+ continue;
+ retval = _match_daemon (dirpath, d->d_name, mexec, NULL, NULL);
+ if (retval)
+ break;
+ }
+ closedir (dp);
}
- rc_strlist_free (files);
}
free (dirpath);
@@ -425,10 +435,9 @@ librc_hidden_def(rc_service_started_daemon)
bool rc_service_daemons_crashed (const char *service)
{
char *dirpath;
- char **files;
- char *file;
+ DIR *dp;
+ struct dirent *d;
char *path;
- int i;
FILE *fp;
char buffer[RC_LINEBUFFER];
char *exec = NULL;
@@ -449,10 +458,16 @@ bool rc_service_daemons_crashed (const char *service)
(char *) NULL);
free (svc);
+ if (! (dp = opendir (dirpath)))
+ return (false);
+
memset (buffer, 0, sizeof (buffer));
- files = rc_ls_dir (dirpath, 0);
- STRLIST_FOREACH (files, file, i) {
- path = rc_strcatpaths (dirpath, file, (char *) NULL);
+
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == '.')
+ continue;
+
+ path = rc_strcatpaths (dirpath, d->d_name, (char *) NULL);
fp = fopen (path, "r");
free (path);
if (! fp)
@@ -530,7 +545,7 @@ bool rc_service_daemons_crashed (const char *service)
free (exec);
free (name);
free (dirpath);
- rc_strlist_free (files);
+ closedir (dp);
return (retval);
}
diff --git a/src/librc-depend.c b/src/librc-depend.c
index c701c214..4794c856 100644
--- a/src/librc-depend.c
+++ b/src/librc-depend.c
@@ -497,13 +497,13 @@ char **rc_deptree_order_services (rc_depinfo_t *deptree, const char *runlevel,
strcmp (runlevel, RC_LEVEL_SHUTDOWN) == 0 ||
strcmp (runlevel, RC_LEVEL_REBOOT) == 0)
{
- list = rc_ls_dir (RC_SVCDIR_STARTING, RC_LS_INITD);
+ list = rc_services_in_state (RC_SERVICE_STARTED);
- tmp = rc_ls_dir (RC_SVCDIR_INACTIVE, RC_LS_INITD);
+ tmp = rc_services_in_state (RC_SERVICE_INACTIVE);
rc_strlist_join (&list, tmp);
rc_strlist_free (tmp);
- tmp = rc_ls_dir (RC_SVCDIR_INACTIVE, RC_LS_INITD);
+ tmp = rc_services_in_state (RC_SERVICE_STARTING);
rc_strlist_join (&list, tmp);
rc_strlist_free (tmp);
reverse = true;
@@ -511,18 +511,15 @@ char **rc_deptree_order_services (rc_depinfo_t *deptree, const char *runlevel,
list = rc_services_in_runlevel (runlevel);
/* Add coldplugged services */
- tmp = rc_ls_dir (RC_SVCDIR_COLDPLUGGED, RC_LS_INITD);
+ tmp = rc_services_in_state (RC_SERVICE_COLDPLUGGED);
rc_strlist_join (&list, tmp);
rc_strlist_free (tmp);
/* If we're not the boot runlevel then add that too */
if (strcmp (runlevel, bootlevel) != 0) {
- char *path = rc_strcatpaths (RC_RUNLEVELDIR, bootlevel,
- (char *) NULL);
- tmp = rc_ls_dir (path, RC_LS_INITD);
+ tmp = rc_services_in_runlevel (bootlevel);
rc_strlist_join (&list, tmp);
rc_strlist_free (tmp);
- free (path);
}
}
@@ -547,10 +544,10 @@ static bool is_newer_than (const char *file, const char *target)
{
struct stat buf;
time_t mtime;
- char **targets;
- char *t;
- int i;
bool newer = true;
+ DIR *dp;
+ struct dirent *d;
+ char *path;
if (stat (file, &buf) != 0 || buf.st_size == 0)
return (false);
@@ -564,16 +561,21 @@ static bool is_newer_than (const char *file, const char *target)
if (mtime < buf.st_mtime)
return (false);
- targets = rc_ls_dir (target, 0);
- STRLIST_FOREACH (targets, t, i)
- {
- char *path = rc_strcatpaths (target, t, (char *) NULL);
+ if (! (dp = opendir (target)))
+ return (true);
+
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == '.')
+ continue;
+
+ path = rc_strcatpaths (target, d->d_name, (char *) NULL);
newer = is_newer_than (file, path);
free (path);
if (! newer)
break;
}
- rc_strlist_free (targets);
+ closedir (dp);
+
return (newer);
}
diff --git a/src/librc-misc.c b/src/librc-misc.c
index f255f706..11cbadc6 100644
--- a/src/librc-misc.c
+++ b/src/librc-misc.c
@@ -94,47 +94,6 @@ char *rc_strcatpaths (const char *path1, const char *paths, ...)
}
librc_hidden_def(rc_strcatpaths)
-char **rc_ls_dir (const char *dir, int options)
-{
- DIR *dp;
- struct dirent *d;
- char **list = NULL;
-
- if ((dp = opendir (dir)) == NULL)
- return (NULL);
-
- errno = 0;
- while (((d = readdir (dp)) != NULL) && errno == 0) {
- if (d->d_name[0] != '.') {
- if (options & RC_LS_INITD) {
- int l = strlen (d->d_name);
- char *init = rc_strcatpaths (RC_INITDIR, d->d_name,
- (char *) NULL);
- bool ok = rc_exists (init);
- free (init);
- if (! ok)
- continue;
-
- /* .sh files are not init scripts */
- if (l > 2 && d->d_name[l - 3] == '.' &&
- d->d_name[l - 2] == 's' &&
- d->d_name[l - 1] == 'h')
- continue;
- }
- if (options & RC_LS_DIR) {
- struct stat buf;
-
- if (stat (d->d_name, &buf) == 0 && ! S_ISDIR (buf.st_mode))
- continue;
- }
- rc_strlist_addsort (&list, d->d_name);
- }
- }
- closedir (dp);
-
- return (list);
-}
-librc_hidden_def(rc_ls_dir)
bool rc_rm_dir (const char *pathname, bool top)
{
diff --git a/src/librc.c b/src/librc.c
index 0aecc4c7..1ff76928 100644
--- a/src/librc.c
+++ b/src/librc.c
@@ -42,6 +42,50 @@ static const rc_service_state_name_t rc_service_state_names[] = {
{ 0, NULL}
};
+
+#define LS_INITD 0x01
+#define LS_DIR 0x02
+static char **ls_dir (const char *dir, int options)
+{
+ DIR *dp;
+ struct dirent *d;
+ char **list = NULL;
+
+ if ((dp = opendir (dir)) == NULL)
+ return (NULL);
+
+ errno = 0;
+ while (((d = readdir (dp)) != NULL) && errno == 0) {
+ if (d->d_name[0] != '.') {
+ if (options & LS_INITD) {
+ int l = strlen (d->d_name);
+ char *init = rc_strcatpaths (RC_INITDIR, d->d_name,
+ (char *) NULL);
+ bool ok = rc_exists (init);
+ free (init);
+ if (! ok)
+ continue;
+
+ /* .sh files are not init scripts */
+ if (l > 2 && d->d_name[l - 3] == '.' &&
+ d->d_name[l - 2] == 's' &&
+ d->d_name[l - 1] == 'h')
+ continue;
+ }
+ if (options & LS_DIR) {
+ struct stat buf;
+
+ if (stat (d->d_name, &buf) == 0 && ! S_ISDIR (buf.st_mode))
+ continue;
+ }
+ rc_strlist_addsort (&list, d->d_name);
+ }
+ }
+ closedir (dp);
+
+ return (list);
+}
+
static const char *rc_parse_service_state (rc_service_state_t state)
{
int i;
@@ -68,7 +112,7 @@ librc_hidden_def(rc_runlevel_stopping)
char **rc_runlevel_list (void)
{
- return (rc_ls_dir (RC_RUNLEVELDIR, RC_LS_DIR));
+ return (ls_dir (RC_RUNLEVELDIR, LS_DIR));
}
librc_hidden_def(rc_runlevel_list)
@@ -376,7 +420,7 @@ bool rc_service_mark (const char *service, const rc_service_state_t state)
/* These are final states, so remove us from scheduled */
if (state == RC_SERVICE_STARTED || state == RC_SERVICE_STOPPED) {
char *sdir = rc_strcatpaths (RC_SVCDIR, "scheduled", (char *) NULL);
- char **dirs = rc_ls_dir (sdir, 0);
+ char **dirs = ls_dir (sdir, 0);
char *dir;
int serrno;
@@ -657,7 +701,7 @@ char **rc_services_in_runlevel (const char *runlevel)
char **list = NULL;
if (! runlevel)
- return (rc_ls_dir (RC_INITDIR, RC_LS_INITD));
+ return (ls_dir (RC_INITDIR, LS_INITD));
/* These special levels never contain any services */
if (strcmp (runlevel, RC_LEVEL_SYSINIT) == 0 ||
@@ -665,7 +709,7 @@ char **rc_services_in_runlevel (const char *runlevel)
return (NULL);
dir = rc_strcatpaths (RC_RUNLEVELDIR, runlevel, (char *) NULL);
- list = rc_ls_dir (dir, RC_LS_INITD);
+ list = ls_dir (dir, LS_INITD);
free (dir);
return (list);
}
@@ -678,13 +722,13 @@ char **rc_services_in_state (rc_service_state_t state)
char **list = NULL;
if (state == RC_SERVICE_SCHEDULED) {
- char **dirs = rc_ls_dir (dir, 0);
+ char **dirs = ls_dir (dir, 0);
char *d;
int i;
STRLIST_FOREACH (dirs, d, i) {
char *p = rc_strcatpaths (dir, d, (char *) NULL);
- char **entries = rc_ls_dir (p, RC_LS_INITD);
+ char **entries = ls_dir (p, LS_INITD);
char *e;
int j;
@@ -698,7 +742,7 @@ char **rc_services_in_state (rc_service_state_t state)
if (dirs)
free (dirs);
} else {
- list = rc_ls_dir (dir, RC_LS_INITD);
+ list = ls_dir (dir, LS_INITD);
}
free (dir);
@@ -758,7 +802,7 @@ librc_hidden_def(rc_service_delete)
char **rc_services_scheduled_by (const char *service)
{
- char **dirs = rc_ls_dir (RC_SVCDIR "/scheduled", 0);
+ char **dirs = ls_dir (RC_SVCDIR "/scheduled", 0);
char **list = NULL;
char *dir;
int i;
@@ -784,7 +828,7 @@ char **rc_services_scheduled (const char *service)
char **list = NULL;
free (svc);
- list = rc_ls_dir (dir, RC_LS_INITD);
+ list = ls_dir (dir, LS_INITD);
free (dir);
return (list);
}
diff --git a/src/librc.h b/src/librc.h
index 1a65c3bc..3d0ce3ef 100644
--- a/src/librc.h
+++ b/src/librc.h
@@ -65,7 +65,6 @@ librc_hidden_proto(rc_env_config)
librc_hidden_proto(rc_env_filter)
librc_hidden_proto(rc_exists)
librc_hidden_proto(rc_find_pids)
-librc_hidden_proto(rc_ls_dir)
librc_hidden_proto(rc_rm_dir)
librc_hidden_proto(rc_runlevel_exists)
librc_hidden_proto(rc_runlevel_get)
diff --git a/src/rc-depend.c b/src/rc-depend.c
index 80ee9ceb..ad95d6a4 100644
--- a/src/rc-depend.c
+++ b/src/rc-depend.c
@@ -29,7 +29,7 @@ rc_depinfo_t *_rc_deptree_load (void) {
ebegin ("Caching service dependencies");
retval = rc_deptree_update ();
- eend (retval, "Failed to update the dependency tree");
+ eend (retval ? 0 : -1, "Failed to update the dependency tree");
}
return (rc_deptree_load ());
diff --git a/src/rc-plugin.c b/src/rc-plugin.c
index 76b8e08e..b367228f 100644
--- a/src/rc-plugin.c
+++ b/src/rc-plugin.c
@@ -5,6 +5,7 @@
Released under the GPLv2
*/
+#include <dirent.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
@@ -49,10 +50,12 @@ dlfunc_t dlfunc (void * __restrict handle, const char * __restrict symbol)
void rc_plugin_load (void)
{
- char **files;
- char *file;
- int i;
+ DIR *dp;
+ struct dirent *d;
plugin_t *plugin = plugins;
+ char *p;
+ void *h;
+ int (*fptr) (rc_hook_t, const char *);
/* Don't load plugins if we're in one */
if (rc_in_plugin)
@@ -61,15 +64,15 @@ void rc_plugin_load (void)
/* Ensure some sanity here */
rc_plugin_unload ();
- if (! rc_exists (RC_PLUGINDIR))
+ if (! (dp = opendir (RC_PLUGINDIR)))
return;
- files = rc_ls_dir (RC_PLUGINDIR, 0);
- STRLIST_FOREACH (files, file, i) {
- char *p = rc_strcatpaths (RC_PLUGINDIR, file, NULL);
- void *h = dlopen (p, RTLD_LAZY);
- int (*fptr) (rc_hook_t, const char *);
+ while ((d = readdir (dp))) {
+ if (d->d_name[0] == '.')
+ continue;
+ p = rc_strcatpaths (RC_PLUGINDIR, d->d_name, NULL);
+ h = dlopen (p, RTLD_LAZY);
free (p);
if (! h) {
eerror ("dlopen: %s", dlerror ());
@@ -78,7 +81,7 @@ void rc_plugin_load (void)
fptr = (int (*)(rc_hook_t, const char*)) dlfunc (h, RC_PLUGIN_HOOK);
if (! fptr) {
- eerror ("%s: cannot find symbol `%s'", file, RC_PLUGIN_HOOK);
+ eerror ("%s: cannot find symbol `%s'", d->d_name, RC_PLUGIN_HOOK);
dlclose (h);
} else {
if (plugin) {
@@ -88,13 +91,12 @@ void rc_plugin_load (void)
plugin = plugins = rc_xmalloc (sizeof (plugin_t));
memset (plugin, 0, sizeof (plugin_t));
- plugin->name = rc_xstrdup (file);
+ plugin->name = rc_xstrdup (d->d_name);
plugin->handle = h;
plugin->hook = fptr;
}
}
-
- rc_strlist_free (files);
+ closedir (dp);
}
void rc_plugin_run (rc_hook_t hook, const char *value)
diff --git a/src/rc.c b/src/rc.c
index ae814877..7117a1ee 100644
--- a/src/rc.c
+++ b/src/rc.c
@@ -20,6 +20,7 @@
#include <sys/utsname.h>
#include <sys/wait.h>
#include <errno.h>
+#include <dirent.h>
#include <ctype.h>
#include <getopt.h>
#include <libgen.h>
@@ -331,7 +332,7 @@ static int do_mark_service (int argc, char **argv)
eerror ("%s: failed to signal parent %d: %s",
applet, pid, strerror (errno));
- /* Remove the exclsive time test. This ensures that it's not
+ /* Remove the exclusive time test. This ensures that it's not
in control as well */
l = strlen (RC_SVCDIR "exclusive") +
strlen (svcname) +
@@ -420,7 +421,7 @@ static char read_key (bool block)
struct termios termios;
char c = 0;
int fd = fileno (stdin);
-
+
if (! isatty (fd))
return (false);
@@ -736,6 +737,8 @@ int main (int argc, char **argv)
char ksoftbuffer [PATH_MAX];
char pidstr[6];
int opt;
+ DIR *dp;
+ struct dirent *d;
atexit (cleanup);
if (argv[0])
@@ -1032,18 +1035,14 @@ int main (int argc, char **argv)
its coldplugging thing. runscript knows when we're not ready so it
stores a list of coldplugged services in DEVBOOT for us to pick up
here when we are ready for them */
- start_services = rc_ls_dir (DEVBOOT, RC_LS_INITD);
- if (start_services) {
+ if ((dp = opendir (DEVBOOT))) {
+ while ((d = readdir (dp))) {
+ if (rc_service_exists (d->d_name) &&
+ rc_service_plugable (d->d_name))
+ rc_service_mark (d->d_name, RC_SERVICE_COLDPLUGGED);
+ }
+ closedir (dp);
rc_rm_dir (DEVBOOT, true);
-
- STRLIST_FOREACH (start_services, service, i)
- if (rc_service_plugable (service))
- rc_service_mark (service, RC_SERVICE_COLDPLUGGED);
- /* We need to dump this list now.
- This may seem redunant, but only Linux needs this and saves on
- code bloat. */
- rc_strlist_free (start_services);
- start_services = NULL;
}
#else
/* BSD's on the other hand populate /dev automagically and use devd.
@@ -1057,50 +1056,52 @@ int main (int argc, char **argv)
{
#if defined(__DragonFly__) || defined(__FreeBSD__)
/* The net interfaces are easy - they're all in net /dev/net :) */
- start_services = rc_ls_dir ("/dev/net", 0);
- STRLIST_FOREACH (start_services, service, i) {
- j = (strlen ("net.") + strlen (service) + 1);
- tmp = rc_xmalloc (sizeof (char *) * j);
- snprintf (tmp, j, "net.%s", service);
- if (rc_service_exists (tmp) && rc_service_plugable (tmp))
- rc_service_mark (tmp, RC_SERVICE_COLDPLUGGED);
- CHAR_FREE (tmp);
+ if ((dp = opendir ("/dev/net"))) {
+ while ((d = readdir (dp))) {
+ i = (strlen ("net.") + strlen (d->d_name) + 1);
+ tmp = rc_xmalloc (sizeof (char *) * i);
+ snprintf (tmp, i, "net.%s", d->d_name);
+ if (rc_service_exists (d->d_name) &&
+ rc_service_plugable (d->d_name))
+ rc_service_mark (d->d_name, RC_SERVICE_COLDPLUGGED);
+ CHAR_FREE (tmp);
+ }
+ closedir (dp);
}
- rc_strlist_free (start_services);
#endif
/* The mice are a little more tricky.
If we coldplug anything else, we'll probably do it here. */
- start_services = rc_ls_dir ("/dev", 0);
- STRLIST_FOREACH (start_services, service, i) {
- if (strncmp (service, "psm", 3) == 0 ||
- strncmp (service, "ums", 3) == 0)
- {
- char *p = service + 3;
- if (p && isdigit (*p)) {
- j = (strlen ("moused.") + strlen (service) + 1);
- tmp = rc_xmalloc (sizeof (char *) * j);
- snprintf (tmp, j, "moused.%s", service);
- if (rc_service_exists (tmp) && rc_service_plugable (tmp))
- rc_service_mark (tmp, RC_SERVICE_COLDPLUGGED);
- CHAR_FREE (tmp);
+ if ((dp == opendir ("/dev"))) {
+ while ((d = readdir (dp))) {
+ if (strncmp (d->d_name, "psm", 3) == 0 ||
+ strncmp (d->d_name, "ums", 3) == 0)
+ {
+ char *p = d->d_name + 3;
+ if (p && isdigit (*p)) {
+ i = (strlen ("moused.") + strlen (d->d_name) + 1);
+ tmp = rc_xmalloc (sizeof (char *) * i);
+ snprintf (tmp, i, "moused.%s", d->d_name);
+ if (rc_service_exists (tmp) && rc_service_plugable (tmp))
+ rc_service_mark (tmp, RC_SERVICE_COLDPLUGGED);
+ CHAR_FREE (tmp);
+ }
}
}
+ closedir (dp);
}
- rc_strlist_free (start_services);
- start_services = NULL;
}
#endif
/* Build a list of all services to stop and then work out the
correct order for stopping them */
- stop_services = rc_ls_dir (RC_SVCDIR_STARTING, RC_LS_INITD);
-
- tmplist = rc_ls_dir (RC_SVCDIR_INACTIVE, RC_LS_INITD);
+ stop_services = rc_services_in_state (RC_SERVICE_STARTING);
+
+ tmplist = rc_services_in_state (RC_SERVICE_INACTIVE);
rc_strlist_join (&stop_services, tmplist);
rc_strlist_free (tmplist);
- tmplist = rc_ls_dir (RC_SVCDIR_STARTED, RC_LS_INITD);
+ tmplist = rc_services_in_state (RC_SERVICE_STARTED);
rc_strlist_join (&stop_services, tmplist);
rc_strlist_free (tmplist);
@@ -1110,7 +1111,7 @@ int main (int argc, char **argv)
rc_strlist_add (&types, "iafter");
deporder = rc_deptree_depends (deptree, types, stop_services,
- runlevel, depoptions | RC_DEP_STOP);
+ runlevel, depoptions | RC_DEP_STOP);
rc_strlist_free (stop_services);
rc_strlist_free (types);
@@ -1120,7 +1121,7 @@ int main (int argc, char **argv)
rc_strlist_reverse (stop_services);
/* Load our list of coldplugged services */
- coldplugged_services = rc_ls_dir (RC_SVCDIR_COLDPLUGGED, RC_LS_INITD);
+ coldplugged_services = rc_services_in_state (RC_SERVICE_COLDPLUGGED);
/* Load our start services now.
We have different rules dependent on runlevel. */
@@ -1133,15 +1134,12 @@ int main (int argc, char **argv)
}
printf ("\n");
}
- tmp = rc_strcatpaths (RC_RUNLEVELDIR, newlevel ? newlevel : runlevel,
- (char *) NULL);
- tmplist = rc_ls_dir (tmp, RC_LS_INITD);
+ tmplist = rc_services_in_runlevel (newlevel ? newlevel : runlevel);
rc_strlist_join (&start_services, tmplist);
rc_strlist_free (tmplist);
- CHAR_FREE (tmp);
} else {
/* Store our list of coldplugged services */
- tmplist = rc_ls_dir (RC_SVCDIR_COLDPLUGGED, RC_LS_INITD);
+ tmplist = rc_services_in_state (RC_SERVICE_COLDPLUGGED);
rc_strlist_join (&coldplugged_services, tmplist);
rc_strlist_free (tmplist);
if (strcmp (newlevel ? newlevel : runlevel, RC_LEVEL_SINGLE) != 0 &&
@@ -1155,7 +1153,7 @@ int main (int argc, char **argv)
tmplist = rc_services_in_runlevel (newlevel ? newlevel : runlevel);
rc_strlist_join (&start_services, tmplist);
rc_strlist_free (tmplist);
-
+
STRLIST_FOREACH (coldplugged_services, service, i)
rc_strlist_add (&start_services, service);
@@ -1229,7 +1227,7 @@ int main (int argc, char **argv)
going to be started depends on us */
rc_strlist_add (&stopdeps, service);
deporder = rc_deptree_depends (deptree, types, stopdeps,
- runlevel, RC_DEP_STRICT);
+ runlevel, RC_DEP_STRICT);
rc_strlist_free (stopdeps);
stopdeps = NULL;
found = false;
@@ -1299,7 +1297,7 @@ int main (int argc, char **argv)
rc_strlist_add (&types, "iuse");
rc_strlist_add (&types, "iafter");
deporder = rc_deptree_depends (deptree, types, start_services,
- runlevel, depoptions | RC_DEP_START);
+ runlevel, depoptions | RC_DEP_START);
rc_strlist_free (types);
types = NULL;
rc_strlist_free (start_services);
diff --git a/src/rc.h b/src/rc.h
index 65421dec..82b24ce2 100644
--- a/src/rc.h
+++ b/src/rc.h
@@ -438,17 +438,6 @@ char *rc_strcatpaths (const char *path1, const char *paths, ...) SENTINEL;
* @return true if it matches true, yes or 1, false if otherwise. */
bool rc_env_bool (const char *variable);
-/*! @name rc_ls_dir options */
-/*! Ensure that an init.d service exists for each file returned */
-#define RC_LS_INITD 0x01
-#define RC_LS_DIR 0x02
-
-/*! Return a NULL terminted sorted list of the contents of the directory
- * @param dir to list
- * @param options any options to apply
- * @return NULL terminated list */
-char **rc_ls_dir (const char *dir, int options);
-
/*! Remove a directory
* @param pathname to remove
* @param top remove the top level directory too
diff --git a/src/rc.map b/src/rc.map
index fa738c37..71b7ce09 100644
--- a/src/rc.map
+++ b/src/rc.map
@@ -14,7 +14,6 @@ global:
rc_env_filter;
rc_environ_fd;
rc_find_pids;
- rc_ls_dir;
rc_rm_dir;
rc_runlevel_exists;
rc_runlevel_get;