aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rwxr-xr-xinit.d/bootmisc2
-rw-r--r--src/env-update.c40
-rw-r--r--src/librc-misc.c12
4 files changed, 44 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index d7e92d3a..c7e01342 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,10 @@
# ChangeLog for Gentoo System Intialization ("rc") scripts
# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPLv2
+ 09 Jul 2007; Roy Marples <uberlord@gentoo.org>:
+
+ Add an option to fork ldconfig in env-update, #182794
+
06 Jul 2007; Roy Marples <uberlord@gentoo.org>:
Add and delete IPv6 addresses and routes correctly on FreeBSD, #184430
diff --git a/init.d/bootmisc b/init.d/bootmisc
index d35f6d00..6004a01c 100755
--- a/init.d/bootmisc
+++ b/init.d/bootmisc
@@ -42,7 +42,7 @@ start() {
ebegin "Updating environment"
# As runscript prefixes our path with /$LIBDIR/rcscripts/bin, our
# version instead of the portage version should be found first.
- env-update
+ env-update --fork-ldconfig
eend $?
# Take care of random stuff [ /var/lock | /var/run | pam ]
diff --git a/src/env-update.c b/src/env-update.c
index 463cdf45..49a07718 100644
--- a/src/env-update.c
+++ b/src/env-update.c
@@ -64,6 +64,7 @@ static char *applet = NULL;
#include "_usage.h"
#define getoptstring "L" getoptstring_COMMON
static struct option longopts[] = {
+ { "fork-ldconfig", 0, NULL, 'l'},
{ "no-ldconfig", 0, NULL, 'L'},
longopts_COMMON
{ NULL, 0, NULL, 0}
@@ -89,6 +90,7 @@ int main (int argc, char **argv)
char **myspaces = NULL;
int opt;
bool ldconfig = true;
+ bool fork_ldconfig = false;
applet = argv[0];
@@ -96,6 +98,9 @@ int main (int argc, char **argv)
longopts, (int *) 0)) != -1)
{
switch (opt) {
+ case 'l':
+ fork_ldconfig = true;
+ break;
case 'L':
ldconfig = false;
break;
@@ -219,8 +224,12 @@ int main (int argc, char **argv)
char *tmpent = rc_xstrdup (env);
char *value = tmpent;
char *var = strsep (&value, "=");
- if (strcmp (var, "LDPATH") != 0)
- fprintf (fp, "export %s='%s'\n", var, value);
+ if (strcmp (var, "LDPATH") != 0) {
+ if (*value == '$')
+ fprintf (fp, "export %s=%s\n", var, value);
+ else
+ fprintf (fp, "export %s='%s'\n", var, value);
+ }
free (tmpent);
}
fclose (fp);
@@ -233,8 +242,12 @@ int main (int argc, char **argv)
char *tmpent = rc_xstrdup (env);
char *value = tmpent;
char *var = strsep (&value, "=");
- if (strcmp (var, "LDPATH") != 0)
- fprintf (fp, "setenv %s '%s'\n", var, value);
+ if (strcmp (var, "LDPATH") != 0) {
+ if (*value == '$')
+ fprintf (fp, "setenv %s %s\n", var, value);
+ else
+ fprintf (fp, "setenv %s '%s'\n", var, value);
+ }
free (tmpent);
}
fclose (fp);
@@ -275,6 +288,7 @@ int main (int argc, char **argv)
if (ld) {
int retval = 0;
+ pid_t pid = getpid ();
if ((fp = fopen (LDSOCONF, "w")) == NULL)
eerrorx ("%s: fopen `%s': %s", applet, LDSOCONF,
@@ -284,14 +298,22 @@ int main (int argc, char **argv)
fprintf (fp, "%s\n", ldent);
fclose (fp);
+ if (fork_ldconfig) {
+ if ((pid = fork ()) == -1)
+ eerror ("%s: failed to fork: %s", applet,
+ strerror (errno));
+ }
+
+ if (pid) {
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
- ebegin ("Regenerating /var/run/ld-elf.so.hints");
- retval = system ("/sbin/ldconfig -elf -i '" LDSOCONF "'");
+ ebegin ("Regenerating /var/run/ld-elf.so.hints");
+ retval = system ("/sbin/ldconfig -elf -i '" LDSOCONF "'");
#else
- ebegin ("Regenerating /etc/ld.so.cache");
- retval = system ("/sbin/ldconfig");
+ ebegin ("Regenerating /etc/ld.so.cache");
+ retval = system ("/sbin/ldconfig");
#endif
- eend (retval, NULL);
+ eend (retval, NULL);
+ }
}
}
diff --git a/src/librc-misc.c b/src/librc-misc.c
index f527ef11..6436e0b4 100644
--- a/src/librc-misc.c
+++ b/src/librc-misc.c
@@ -336,10 +336,14 @@ char **rc_get_config (char **list, const char *file)
entry = rc_xstrdup (token);
- do {
- /* Bash variables are usually quoted */
- token = strsep (&p, "\"\'");
- } while ((token) && (strlen (token) == 0));
+ /* Preserve shell coloring */
+ if (*p == '$')
+ token = p;
+ else
+ do {
+ /* Bash variables are usually quoted */
+ token = strsep (&p, "\"\'");
+ } while ((token) && (strlen (token) == 0));
/* Drop a newline if that's all we have */
i = strlen (token) - 1;