aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-09-18 11:36:55 +0000
committerRoy Marples <roy@marples.name>2007-09-18 11:36:55 +0000
commitf1bba128929778c21168e84b8970f6623611dc6e (patch)
tree25bbbf017bd14dfe9a81ff4070c70d24dd8a7848 /src
parent99eabdc3ba537194432a11c5793ca4117296227b (diff)
API change! rc_strlist_add and friends now take char *** instead of
char ** and return a pointer to the item added instead of the new list head. This is so we can easily tell if the item was successfully added or not instead of iterating through the list looking for it. list = rc_strlist_add (list, item); becomes rc_strlist_add (&list, item);
Diffstat (limited to 'src')
-rw-r--r--src/env-update.c18
-rw-r--r--src/librc-depend.c29
-rw-r--r--src/librc-misc.c32
-rw-r--r--src/librc-strlist.c84
-rw-r--r--src/librc.c10
-rw-r--r--src/mountinfo.c4
-rw-r--r--src/rc-depend.c8
-rw-r--r--src/rc-status.c4
-rw-r--r--src/rc-update.c10
-rw-r--r--src/rc.c24
-rw-r--r--src/rc.h12
-rw-r--r--src/runscript.c47
-rw-r--r--src/start-stop-daemon.c4
13 files changed, 154 insertions, 132 deletions
diff --git a/src/env-update.c b/src/env-update.c
index 909264d2..516f3580 100644
--- a/src/env-update.c
+++ b/src/env-update.c
@@ -102,6 +102,7 @@ int env_update (int argc, char **argv)
int opt;
bool ldconfig = true;
bool fork_ldconfig = false;
+ int nents = 0;
applet = argv[0];
@@ -147,12 +148,12 @@ int env_update (int argc, char **argv)
if (strcmp (var, "COLON_SEPARATED") == 0)
while ((var = strsep (&value, " ")))
- mycolons = rc_strlist_addu (mycolons, var);
+ rc_strlist_addu (&mycolons, var);
else if (strcmp (var, "SPACE_SEPARATED") == 0)
while ((var = strsep (&value, " ")))
- myspaces = rc_strlist_addu (myspaces, var);
- else
- config = rc_strlist_add (config, entry);
+ rc_strlist_addu (&myspaces, var);
+ else
+ rc_strlist_add (&config, entry);
free (tmpent);
}
@@ -227,7 +228,7 @@ int env_update (int argc, char **argv)
}
if (! replaced)
- envs = rc_strlist_addsort (envs, entry);
+ rc_strlist_addsort (&envs, entry);
free (tmpent);
}
@@ -285,7 +286,8 @@ int env_update (int argc, char **argv)
if (strlen (file) == 0)
continue;
- ldents = rc_strlist_addu (ldents, file);
+ if (rc_strlist_addu (&ldents, file))
+ nents++;
}
if (ldconfig) {
@@ -293,12 +295,8 @@ int env_update (int argc, char **argv)
if (rc_exists (LDSOCONF)) {
char **lines = rc_get_list (NULL, LDSOCONF);
char *line;
- int nents = 0;
ld = false;
- STRLIST_FOREACH (ldents, line, i)
- nents ++;
-
STRLIST_FOREACH (lines, line, i)
if (i > nents || strcmp (line, ldents[i - 1]) != 0)
{
diff --git a/src/librc-depend.c b/src/librc-depend.c
index 67e51985..16337240 100644
--- a/src/librc-depend.c
+++ b/src/librc-depend.c
@@ -144,7 +144,7 @@ rc_depinfo_t *rc_load_deptree (void)
if (! deptype->type)
deptype->type = rc_xstrdup (type);
- deptype->services = rc_strlist_addsort (deptype->services, e);
+ rc_strlist_addsort (&deptype->services, e);
}
fclose (fp);
@@ -232,7 +232,7 @@ static bool get_provided1 (const char *runlevel, struct lhead *providers,
continue;
retval = true;
- providers->list = rc_strlist_add (providers->list, service);
+ rc_strlist_add (&providers->list, service);
}
return (retval);
@@ -271,7 +271,7 @@ static char **get_provided (rc_depinfo_t *deptree, rc_depinfo_t *depinfo,
if (options & RC_DEP_STOP)
{
STRLIST_FOREACH (dt->services, service, i)
- providers.list = rc_strlist_add (providers.list, service);
+ rc_strlist_add (&providers.list, service);
return (providers.list);
}
@@ -283,7 +283,7 @@ static char **get_provided (rc_depinfo_t *deptree, rc_depinfo_t *depinfo,
STRLIST_FOREACH (dt->services, service, i)
if (rc_service_in_runlevel (service, runlevel) ||
rc_service_in_runlevel (service, bootlevel))
- providers.list = rc_strlist_add (providers.list, service);
+ rc_strlist_add (&providers.list, service);
if (providers.list)
return (providers.list);
@@ -348,7 +348,7 @@ static char **get_provided (rc_depinfo_t *deptree, rc_depinfo_t *depinfo,
/* Still nothing? OK, list all services */
STRLIST_FOREACH (dt->services, service, i)
- providers.list = rc_strlist_add (providers.list, service);
+ rc_strlist_add (&providers.list, service);
return (providers.list);
}
@@ -375,7 +375,7 @@ static void visit_service (rc_depinfo_t *deptree, char **types,
return;
/* Add ourselves as a visited service */
- visited->list = rc_strlist_add (visited->list, depinfo->service);
+ rc_strlist_add (&visited->list, depinfo->service);
STRLIST_FOREACH (types, item, i)
{
@@ -385,7 +385,7 @@ static void visit_service (rc_depinfo_t *deptree, char **types,
{
if (! options & RC_DEP_TRACE || strcmp (item, "iprovide") == 0)
{
- sorted->list = rc_strlist_add (sorted->list, service);
+ rc_strlist_add (&sorted->list, service);
continue;
}
@@ -438,7 +438,7 @@ static void visit_service (rc_depinfo_t *deptree, char **types,
svcname = getenv("SVCNAME");
if (! svcname || strcmp (svcname, depinfo->service) != 0)
if (! rc_get_deptype (depinfo, "providedby"))
- sorted->list = rc_strlist_add (sorted->list, depinfo->service);
+ rc_strlist_add (&sorted->list, depinfo->service);
}
char **rc_get_depends (rc_depinfo_t *deptree,
@@ -517,9 +517,9 @@ char **rc_order_services (rc_depinfo_t *deptree, const char *runlevel,
/* Now we have our lists, we need to pull in any dependencies
and order them */
- types = rc_strlist_add (NULL, "ineed");
- types = rc_strlist_add (types, "iuse");
- types = rc_strlist_add (types, "iafter");
+ rc_strlist_add (&types, "ineed");
+ rc_strlist_add (&types, "iuse");
+ rc_strlist_add (&types, "iafter");
services = rc_get_depends (deptree, types, list, runlevel,
RC_DEP_STRICT | RC_DEP_TRACE | options);
rc_strlist_free (list);
@@ -752,7 +752,7 @@ int rc_update_deptree (bool force)
continue;
if (strcmp (type, "config") == 0) {
- config = rc_strlist_addsort (config, depend);
+ rc_strlist_addsort (&config, depend);
continue;
}
@@ -764,7 +764,7 @@ int rc_update_deptree (bool force)
depend[len - 1] == 'h')
continue;
- deptype->services = rc_strlist_addsort (deptype->services, depend);
+ rc_strlist_addsort (&deptype->services, depend);
}
}
@@ -848,8 +848,7 @@ int rc_update_deptree (bool force)
}
if (! already_added)
- dt->services = rc_strlist_addsort (dt->services,
- depinfo->service);
+ rc_strlist_addsort (&dt->services, depinfo->service);
}
}
}
diff --git a/src/librc-misc.c b/src/librc-misc.c
index a138ad02..3451ae27 100644
--- a/src/librc-misc.c
+++ b/src/librc-misc.c
@@ -240,7 +240,7 @@ char **rc_ls_dir (char **list, const char *dir, int options)
d->d_name[l - 1] == 'h')
continue;
}
- list = rc_strlist_addsort (list, d->d_name);
+ rc_strlist_addsort (&list, d->d_name);
}
}
closedir (dp);
@@ -377,7 +377,7 @@ char **rc_get_config (char **list, const char *file)
}
if (! replaced) {
- list = rc_strlist_addsort (list, newline);
+ rc_strlist_addsort (&list, newline);
free (newline);
}
free (entry);
@@ -430,7 +430,7 @@ char **rc_get_list (char **list, const char *file)
if (token[strlen (token) - 1] == '\n')
token[strlen (token) - 1] = 0;
- list = rc_strlist_add (list, token);
+ rc_strlist_add (&list, token);
}
}
fclose (fp);
@@ -515,7 +515,7 @@ char **rc_filter_env (void)
snprintf (e, env_len, "%s=%s", env_name, env_var);
}
- env = rc_strlist_add (env, e);
+ rc_strlist_add (&env, e);
free (e);
}
@@ -525,7 +525,7 @@ char **rc_filter_env (void)
env_len = strlen ("PATH=") + strlen (PATH_PREFIX) + 2;
p = rc_xmalloc (sizeof (char *) * env_len);
snprintf (p, env_len, "PATH=%s", PATH_PREFIX);
- env = rc_strlist_add (env, p);
+ rc_strlist_add (&env, p);
free (p);
}
@@ -606,12 +606,12 @@ char **rc_config_env (char **env)
e = getenv (line);
if (! e) {
*p = '=';
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
} else {
int len = strlen (line) + strlen (e) + 2;
char *new = rc_xmalloc (sizeof (char *) * len);
snprintf (new, len, "%s=%s", line, e);
- env = rc_strlist_add (env, new);
+ rc_strlist_add (&env, new);
free (new);
}
}
@@ -621,23 +621,23 @@ char **rc_config_env (char **env)
i = strlen ("RC_LIBDIR=") + strlen (RC_LIBDIR) + 1;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_LIBDIR=" RC_LIBDIR);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
/* One char less to drop the trailing / */
i = strlen ("RC_SVCDIR=") + strlen (RC_SVCDIR) + 1;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_SVCDIR=" RC_SVCDIR);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
- env = rc_strlist_add (env, "RC_BOOTLEVEL=" RC_LEVEL_BOOT);
+ rc_strlist_add (&env, "RC_BOOTLEVEL=" RC_LEVEL_BOOT);
p = rc_get_runlevel ();
i = strlen ("RC_SOFTLEVEL=") + strlen (p) + 1;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_SOFTLEVEL=%s", p);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
if (rc_exists (RC_KSOFTLEVEL)) {
@@ -652,13 +652,13 @@ char **rc_config_env (char **env)
i += strlen ("RC_DEFAULTLEVEL=") + 2;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_DEFAULTLEVEL=%s", buffer);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
}
fclose (fp);
}
} else
- env = rc_strlist_add (env, "RC_DEFAULTLEVEL=" RC_LEVEL_DEFAULT);
+ rc_strlist_add (&env, "RC_DEFAULTLEVEL=" RC_LEVEL_DEFAULT);
#ifdef __linux__
@@ -687,7 +687,7 @@ char **rc_config_env (char **env)
i = strlen ("RC_SYS=") + strlen (sys) + 2;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_SYS=%s", sys);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
}
@@ -704,7 +704,7 @@ char **rc_config_env (char **env)
i = strlen ("RC_NET_FS_LIST=") + strlen (RC_NET_FS_LIST_DEFAULT) + 1;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_NET_FS_LIST=%s", RC_NET_FS_LIST_DEFAULT);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
}
@@ -714,7 +714,7 @@ char **rc_config_env (char **env)
i = strlen ("RC_UNAME=") + strlen (uts.sysname) + 2;
line = rc_xmalloc (sizeof (char *) * i);
snprintf (line, i, "RC_UNAME=%s", uts.sysname);
- env = rc_strlist_add (env, line);
+ rc_strlist_add (&env, line);
free (line);
}
diff --git a/src/librc-strlist.c b/src/librc-strlist.c
index ac861524..fbcc8f10 100644
--- a/src/librc-strlist.c
+++ b/src/librc-strlist.c
@@ -9,59 +9,67 @@
#include "librc.h"
-static char **_rc_strlist_add (char **list, const char *item, bool uniq)
+static char *_rc_strlist_add (char ***list, const char *item, bool uniq)
{
char **newlist;
+ char **lst = *list;
int i = 0;
if (! item)
- return (list);
+ return (NULL);
- while (list && list[i]) {
- if (uniq && strcmp (list[i], item) == 0)
- return (list);
+ while (lst && lst[i]) {
+ if (uniq && strcmp (lst[i], item) == 0) {
+ errno = EEXIST;
+ return (NULL);
+ }
i++;
}
- newlist = rc_xrealloc (list, sizeof (char *) * (i + 2));
+ newlist = rc_xrealloc (lst, sizeof (char *) * (i + 2));
newlist[i] = rc_xstrdup (item);
newlist[i + 1] = NULL;
- return (newlist);
+ *list = newlist;
+ return (newlist[i]);
}
-char **rc_strlist_add (char **list, const char *item)
+char *rc_strlist_add (char ***list, const char *item)
{
return (_rc_strlist_add (list, item, false));
}
librc_hidden_def(rc_strlist_add)
-char **rc_strlist_addu (char **list, const char *item)
+char *rc_strlist_addu (char ***list, const char *item)
{
return (_rc_strlist_add (list, item, true));
}
librc_hidden_def(rc_strlist_addu)
-static char **_rc_strlist_addsort (char **list, const char *item,
- int (*sortfunc) (const char *s1,
- const char *s2),
- bool uniq)
+static char *_rc_strlist_addsort (char ***list, const char *item,
+ int (*sortfunc) (const char *s1,
+ const char *s2),
+ bool uniq)
{
char **newlist;
+ char **lst = *list;
int i = 0;
char *tmp1;
char *tmp2;
+ char *retval;
if (! item)
- return (list);
+ return (NULL);
- while (list && list[i]) {
- if (uniq && strcmp (list[i], item) == 0)
- return (list);
+ while (lst && lst[i]) {
+ if (uniq && strcmp (lst[i], item) == 0) {
+ errno = EEXIST;
+ return (NULL);
+ }
i++;
}
- newlist = rc_xrealloc (list, sizeof (char *) * (i + 2));
+ newlist = rc_xrealloc (lst, sizeof (char *) * (i + 2));
if (! i)
newlist[i] = NULL;
@@ -72,7 +80,7 @@ static char **_rc_strlist_addsort (char **list, const char *item,
i++;
tmp1 = newlist[i];
- newlist[i] = rc_xstrdup (item);
+ retval = newlist[i] = rc_xstrdup (item);
do {
i++;
tmp2 = newlist[i];
@@ -80,44 +88,50 @@ static char **_rc_strlist_addsort (char **list, const char *item,
tmp1 = tmp2;
} while (tmp1);
- return (newlist);
+ *list = newlist;
+ return (retval);
}
-char **rc_strlist_addsort (char **list, const char *item)
+char *rc_strlist_addsort (char ***list, const char *item)
{
return (_rc_strlist_addsort (list, item, strcoll, false));
}
librc_hidden_def(rc_strlist_addsort)
-char **rc_strlist_addsortc (char **list, const char *item)
+char *rc_strlist_addsortc (char ***list, const char *item)
{
return (_rc_strlist_addsort (list, item, strcmp, false));
}
librc_hidden_def(rc_strlist_addsortc)
-char **rc_strlist_addsortu (char **list, const char *item)
+char *rc_strlist_addsortu (char ***list, const char *item)
{
return (_rc_strlist_addsort (list, item, strcmp, true));
}
librc_hidden_def(rc_strlist_addsortu)
-char **rc_strlist_delete (char **list, const char *item)
+int rc_strlist_delete (char ***list, const char *item)
{
+ char **lst = *list;
int i = 0;
+ int retval = -1;
- if (!list || ! item)
- return (list);
+ if (!lst || ! item)
+ return (-1);
- while (list[i])
- if (! strcmp (list[i], item)) {
- free (list[i]);
+ while (lst[i])
+ if (! strcmp (lst[i], item)) {
+ free (lst[i]);
+ retval = 0;
do {
- list[i] = list[i + 1];
+ lst[i] = lst[i + 1];
i++;
- } while (list[i]);
+ } while (lst[i]);
}
- return (list);
+ if (retval)
+ errno = ENOENT;
+ return (retval);
}
librc_hidden_def(rc_strlist_delete)
@@ -184,10 +198,8 @@ void rc_strlist_free (char **list)
if (! list)
return;
- while (list[i]) {
- free (list[i]);
- list[i++] = NULL;
- }
+ while (list[i])
+ free (list[i++]);
free (list);
}
diff --git a/src/librc.c b/src/librc.c
index e5ea5710..a0b5f0f0 100644
--- a/src/librc.c
+++ b/src/librc.c
@@ -53,7 +53,7 @@ char **rc_get_runlevels (void)
STRLIST_FOREACH (dirs, dir, i) {
char *path = rc_strcatpaths (RC_RUNLEVELDIR, dir, (char *) NULL);
if (rc_is_dir (path))
- runlevels = rc_strlist_addsort (runlevels, dir);
+ rc_strlist_addsort (&runlevels, dir);
free (path);
}
rc_strlist_free (dirs);
@@ -65,7 +65,7 @@ librc_hidden_def(rc_get_runlevels)
char *rc_get_runlevel (void)
{
FILE *fp;
- static char buffer [PATH_MAX];
+ static char buffer[PATH_MAX];
if (! (fp = fopen (SOFTLEVEL, "r"))) {
snprintf (buffer, sizeof (buffer), "sysinit");
@@ -198,7 +198,7 @@ char **rc_service_options (const char *service)
if (buffer[strlen (buffer) - 1] == '\n')
buffer[strlen (buffer) - 1] = '\0';
while ((token = strsep (&p, " ")))
- opts = rc_strlist_addsort (opts, token);
+ rc_strlist_addsort (&opts, token);
}
pclose (fp);
return (opts);
@@ -728,7 +728,7 @@ char **rc_services_in_state (rc_service_state_t state)
int j;
STRLIST_FOREACH (entries, e, j)
- list = rc_strlist_addsortu (list, e);
+ rc_strlist_addsortu (&list, e);
if (entries)
free (entries);
@@ -807,7 +807,7 @@ char **rc_services_scheduled_by (const char *service)
char *file = rc_strcatpaths (RC_SVCDIR, "scheduled", dir, service,
(char *) NULL);
if (rc_exists (file))
- list = rc_strlist_add (list, file);
+ rc_strlist_add (&list, file);
free (file);
}
rc_strlist_free (dirs);
diff --git a/src/mountinfo.c b/src/mountinfo.c
index eb60a4d9..dd7ca4e8 100644
--- a/src/mountinfo.c
+++ b/src/mountinfo.c
@@ -117,7 +117,7 @@ static int process_mount (char ***list, struct args *args,
if (p) {
errno = 0;
- *list = rc_strlist_addsortc (*list, p);
+ rc_strlist_addsortc (list, p);
return (0);
}
@@ -332,7 +332,7 @@ int mountinfo (int argc, char **argv)
while (optind < argc) {
if (argv[optind][0] != '/')
eerrorx ("%s: `%s' is not a mount point", argv[0], argv[optind]);
- args.mounts = rc_strlist_add (args.mounts, argv[optind++]);
+ rc_strlist_add (&args.mounts, argv[optind++]);
}
nodes = find_mounts (&args);
diff --git a/src/rc-depend.c b/src/rc-depend.c
index 9d45e9c1..3201fc77 100644
--- a/src/rc-depend.c
+++ b/src/rc-depend.c
@@ -57,7 +57,7 @@ int rc_depend (int argc, char **argv)
if (argv[i][0] == '-') {
argv[i]++;
- types = rc_strlist_add (types, argv[i]);
+ rc_strlist_add (&types, argv[i]);
} else {
if ((deptree = rc_load_deptree ()) == NULL)
eerrorx ("failed to load deptree");
@@ -66,7 +66,7 @@ int rc_depend (int argc, char **argv)
if (! di)
eerror ("no dependency info for service `%s'", argv[i]);
else
- services = rc_strlist_add (services, argv[i]);
+ rc_strlist_add (&services, argv[i]);
}
}
@@ -80,8 +80,8 @@ int rc_depend (int argc, char **argv)
/* If we don't have any types, then supply some defaults */
if (! types) {
- types = rc_strlist_add (NULL, "ineed");
- rc_strlist_add (types, "iuse");
+ rc_strlist_add (&types, "ineed");
+ rc_strlist_add (&types, "iuse");
}
depends = rc_get_depends (deptree, types, services, runlevel, options);
diff --git a/src/rc-status.c b/src/rc-status.c
index 999026e7..5cde05ef 100644
--- a/src/rc-status.c
+++ b/src/rc-status.c
@@ -114,10 +114,10 @@ int rc_status (int argc, char **argv)
}
while (optind < argc)
- levels = rc_strlist_add (levels, argv[optind++]);
+ rc_strlist_add (&levels, argv[optind++]);
if (! levels)
- levels = rc_strlist_add (NULL, rc_get_runlevel ());
+ rc_strlist_add (&levels, rc_get_runlevel ());
STRLIST_FOREACH (levels, level, i) {
print_level (level);
diff --git a/src/rc-update.c b/src/rc-update.c
index 2d73223d..fc9ef504 100644
--- a/src/rc-update.c
+++ b/src/rc-update.c
@@ -80,13 +80,13 @@ static void show (char **runlevels, bool verbose)
STRLIST_FOREACH (runlevels, runlevel, j) {
if (rc_service_in_runlevel (service, runlevel)) {
- in = rc_strlist_add (in, runlevel);
+ rc_strlist_add (&in, runlevel);
inone = true;
} else {
char buffer[PATH_MAX];
memset (buffer, ' ', strlen (runlevel));
buffer[strlen (runlevel)] = 0;
- in = rc_strlist_add (in, buffer);
+ rc_strlist_add (&in, buffer);
}
}
@@ -186,7 +186,7 @@ int rc_update (int argc, char **argv)
while (optind < argc)
if (rc_runlevel_exists (argv[optind]))
- runlevels = rc_strlist_add (runlevels, argv[optind++]);
+ rc_strlist_add (&runlevels, argv[optind++]);
else {
rc_strlist_free (runlevels);
eerrorx ("%s: `%s' is not a valid runlevel", applet, argv[optind]);
@@ -195,7 +195,7 @@ int rc_update (int argc, char **argv)
if (action & DOSHOW) {
if (service)
- runlevels = rc_strlist_add (runlevels, service);
+ rc_strlist_add (&runlevels, service);
if (! runlevels)
runlevels = rc_get_runlevels ();
@@ -209,7 +209,7 @@ int rc_update (int argc, char **argv)
else {
retval = EXIT_SUCCESS;
if (! runlevels)
- runlevels = rc_strlist_add (runlevels, rc_get_runlevel ());
+ rc_strlist_add (&runlevels, rc_get_runlevel ());
STRLIST_FOREACH (runlevels, runlevel, i) {
if (action & DOADD) {
if (! add (runlevel, service))
diff --git a/src/rc.c b/src/rc.c
index 4e76b56b..8929a973 100644
--- a/src/rc.c
+++ b/src/rc.c
@@ -1092,16 +1092,17 @@ int main (int argc, char **argv)
stop_services = rc_ls_dir (stop_services, RC_SVCDIR_INACTIVE, RC_LS_INITD);
stop_services = rc_ls_dir (stop_services, RC_SVCDIR_STARTED, RC_LS_INITD);
- types = rc_strlist_add (NULL, "ineed");
- types = rc_strlist_add (types, "iuse");
- types = rc_strlist_add (types, "iafter");
+ types = NULL;
+ rc_strlist_add (&types, "ineed");
+ rc_strlist_add (&types, "iuse");
+ rc_strlist_add (&types, "iafter");
deporder = rc_get_depends (deptree, types, stop_services,
runlevel, depoptions | RC_DEP_STOP);
rc_strlist_free (stop_services);
rc_strlist_free (types);
+ types = NULL;
stop_services = deporder;
deporder = NULL;
- types = NULL;
rc_strlist_reverse (stop_services);
/* Load our list of coldplugged services */
@@ -1115,7 +1116,7 @@ int main (int argc, char **argv)
einfon ("Device initiated services:");
STRLIST_FOREACH (coldplugged_services, service, i) {
printf (" %s", service);
- start_services = rc_strlist_add (start_services, service);
+ rc_strlist_add (&start_services, service);
}
printf ("\n");
}
@@ -1140,7 +1141,7 @@ int main (int argc, char **argv)
services = NULL;
STRLIST_FOREACH (coldplugged_services, service, i)
- start_services = rc_strlist_add (start_services, service);
+ rc_strlist_add (&start_services, service);
}
}
@@ -1149,7 +1150,8 @@ int main (int argc, char **argv)
if (going_down)
rc_set_runlevel (newlevel);
- types = rc_strlist_add (NULL, "needsme");
+ types = NULL;
+ rc_strlist_add (&types, "needsme");
/* Now stop the services that shouldn't be running */
STRLIST_FOREACH (stop_services, service, i) {
bool found = false;
@@ -1209,7 +1211,7 @@ int main (int argc, char **argv)
/* We got this far! Or last check is to see if any any service that
going to be started depends on us */
- stopdeps = rc_strlist_add (stopdeps, service);
+ rc_strlist_add (&stopdeps, service);
deporder = rc_get_depends (deptree, types, stopdeps,
runlevel, RC_DEP_STRICT);
rc_strlist_free (stopdeps);
@@ -1276,9 +1278,9 @@ int main (int argc, char **argv)
rc_mark_service (service, rc_service_coldplugged);
/* Order the services to start */
- types = rc_strlist_add (NULL, "ineed");
- types = rc_strlist_add (types, "iuse");
- types = rc_strlist_add (types, "iafter");
+ rc_strlist_add (&types, "ineed");
+ rc_strlist_add (&types, "iuse");
+ rc_strlist_add (&types, "iafter");
deporder = rc_get_depends (deptree, types, start_services,
runlevel, depoptions | RC_DEP_START);
rc_strlist_free (types);
diff --git a/src/rc.h b/src/rc.h
index 8f73fca9..9a8fec8f 100644
--- a/src/rc.h
+++ b/src/rc.h
@@ -197,12 +197,12 @@ char **rc_filter_env (void);
char **rc_config_env (char **env);
/* Handy functions for dealing with string arrays of char ** */
-char **rc_strlist_add (char **list, const char *item);
-char **rc_strlist_addu (char **list, const char *item);
-char **rc_strlist_addsort (char **list, const char *item);
-char **rc_strlist_addsortc (char **list, const char *item);
-char **rc_strlist_addsortu (char **list, const char *item);
-char **rc_strlist_delete (char **list, const char *item);
+char *rc_strlist_add (char ***list, const char *item);
+char *rc_strlist_addu (char ***list, const char *item);
+char *rc_strlist_addsort (char ***list, const char *item);
+char *rc_strlist_addsortc (char ***list, const char *item);
+char *rc_strlist_addsortu (char ***list, const char *item);
+int rc_strlist_delete (char ***list, const char *item);
char **rc_strlist_join (char **list1, char **list2);
void rc_strlist_reverse (char **list);
void rc_strlist_free (char **list);
diff --git a/src/runscript.c b/src/runscript.c
index 5a91b791..b7faac02 100644
--- a/src/runscript.c
+++ b/src/runscript.c
@@ -558,7 +558,7 @@ static void get_started_services ()
restart_services = rc_services_in_state (rc_service_started);
STRLIST_FOREACH (tmplist, svc, i)
- restart_services = rc_strlist_addsort (restart_services, svc);
+ rc_strlist_addsort (&restart_services, svc);
rc_strlist_free (tmplist);
tmplist = NULL;
@@ -610,9 +610,11 @@ static void svc_start (bool deps)
eerrorx ("failed to load deptree");
rc_strlist_free (types);
- types = rc_strlist_add (NULL, "broken");
+ types = NULL;
+ rc_strlist_add (&types, "broken");
rc_strlist_free (svclist);
- svclist = rc_strlist_add (NULL, applet);
+ svclist = NULL;
+ rc_strlist_add (&svclist, applet);
rc_strlist_free (services);
services = rc_get_depends (deptree, types, svclist, softlevel, 0);
if (services) {
@@ -628,12 +630,13 @@ static void svc_start (bool deps)
services = NULL;
rc_strlist_free (types);
- types = rc_strlist_add (NULL, "ineed");
+ types = NULL;
+ rc_strlist_add (&types, "ineed");
rc_strlist_free (need_services);
need_services = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
- types = rc_strlist_add (types, "iuse");
+ rc_strlist_add (&types, "iuse");
rc_strlist_free (use_services);
use_services = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
@@ -648,7 +651,7 @@ static void svc_start (bool deps)
}
/* Now wait for them to start */
- types = rc_strlist_add (types, "iafter");
+ rc_strlist_add (&types, "iafter");
services = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
@@ -683,7 +686,7 @@ static void svc_start (bool deps)
if (strcmp (svc, svc2) == 0) {
if (rc_service_state (svc, rc_service_inactive) ||
rc_service_state (svc, rc_service_wasinactive))
- tmplist = rc_strlist_add (tmplist, svc);
+ rc_strlist_add (&tmplist, svc);
else
eerrorx ("ERROR: cannot start %s as %s would not start",
applet, svc);
@@ -701,12 +704,14 @@ static void svc_start (bool deps)
unlink_mtime_test ();
rc_strlist_free (types);
- types = rc_strlist_add (NULL, "iprovide");
+ types = NULL;
+ rc_strlist_add (&types, "iprovide");
STRLIST_FOREACH (tmplist, svc, i) {
rc_schedule_start_service (svc, service);
rc_strlist_free (svclist);
- svclist = rc_strlist_add (NULL, svc);
+ svclist = NULL;
+ rc_strlist_add (&svclist, svc);
rc_strlist_free (providelist);
providelist = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
@@ -782,9 +787,11 @@ static void svc_start (bool deps)
/* Do the same for any services we provide */
rc_strlist_free (types);
- types = rc_strlist_add (NULL, "iprovide");
+ types = NULL;
+ rc_strlist_add (&types, "iprovide");
rc_strlist_free (svclist);
- svclist = rc_strlist_add (NULL, applet);
+ svclist = NULL;
+ rc_strlist_add (&svclist, applet);
rc_strlist_free (tmplist);
tmplist = rc_get_depends (deptree, types, svclist, softlevel, depoptions);
@@ -845,9 +852,11 @@ static void svc_stop (bool deps)
eerrorx ("failed to load deptree");
rc_strlist_free (types);
- types = rc_strlist_add (NULL, "needsme");
+ types = NULL;
+ rc_strlist_add (&types, "needsme");
rc_strlist_free (svclist);
- svclist = rc_strlist_add (NULL, applet);
+ svclist = NULL;
+ rc_strlist_add (&svclist, applet);
rc_strlist_free (tmplist);
tmplist = NULL;
rc_strlist_free (services);
@@ -865,7 +874,7 @@ static void svc_stop (bool deps)
pid_t pid = rc_stop_service (svc);
if (! rc_is_env ("RC_PARALLEL", "yes"))
rc_waitpid (pid);
- tmplist = rc_strlist_add (tmplist, svc);
+ rc_strlist_add (&tmplist, svc);
}
}
}
@@ -899,8 +908,8 @@ static void svc_stop (bool deps)
/* We now wait for other services that may use us and are stopping
This is important when a runlevel stops */
- types = rc_strlist_add (types, "usesme");
- types = rc_strlist_add (types, "ibefore");
+ rc_strlist_add (&types, "usesme");
+ rc_strlist_add (&types, "ibefore");
services = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
STRLIST_FOREACH (services, svc, i) {
@@ -1212,9 +1221,11 @@ int runscript (int argc, char **argv)
eerrorx ("failed to load deptree");
rc_strlist_free (types);
- types = rc_strlist_add (NULL, optarg);
+ types = NULL;
+ rc_strlist_add (&types, optarg);
rc_strlist_free (svclist);
- svclist = rc_strlist_add (NULL, applet);
+ svclist = NULL;
+ rc_strlist_add (&svclist, applet);
rc_strlist_free (services);
services = rc_get_depends (deptree, types, svclist,
softlevel, depoptions);
diff --git a/src/start-stop-daemon.c b/src/start-stop-daemon.c
index 51e4dee8..76158c65 100644
--- a/src/start-stop-daemon.c
+++ b/src/start-stop-daemon.c
@@ -880,10 +880,10 @@ int start_stop_daemon (int argc, char **argv)
len = sizeof (char *) * strlen (path) + 6;
newpath = rc_xmalloc (len);
snprintf (newpath, len, "PATH=%s", path);
- newenv = rc_strlist_add (newenv, newpath);
+ rc_strlist_add (&newenv, newpath);
free (newpath);
} else
- newenv = rc_strlist_add (newenv, env);
+ rc_strlist_add (&newenv, env);
}
umask (022);