diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/env-update.c | 40 | ||||
-rw-r--r-- | src/librc-misc.c | 12 |
2 files changed, 39 insertions, 13 deletions
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; |