aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-11-14 13:39:34 +0000
committerRoy Marples <roy@marples.name>2007-11-14 13:39:34 +0000
commitccf79ceb475d94236acca378e079625ef511eda2 (patch)
treed5dc7a6048d50d2c23682421a87fa2cfa8e5ee0c /src
parentb439703b4d3198f0d1c2568b3f97576d39ed914f (diff)
Control of system defined env vars should not be done by us.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/env-update.c357
2 files changed, 2 insertions, 359 deletions
diff --git a/src/Makefile b/src/Makefile
index f633b1c1..571a48eb 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -56,7 +56,7 @@ LIBRCSO = librc.so.$(LIBRCSOVER)
LIBRCOBJS = librc.o librc-depend.o librc-daemon.o librc-misc.o librc-strlist.o
LDLIBS_LIBRC =
-RCOBJS = checkown.o env-update.o fstabinfo.o mountinfo.o \
+RCOBJS = checkown.o fstabinfo.o mountinfo.o \
rc-depend.o rc-logger.o rc-misc.o rc-plugin.o rc-status.o \
rc-update.o \
runscript.o start-stop-daemon.o rc.o
@@ -85,7 +85,7 @@ RC_SBINLINKS = mark_service_starting mark_service_started \
mark_service_coldplugged mark_service_failed \
rc-abort
BINLINKS = rc-status
-SBINLINKS = env-update rc-update runscript start-stop-daemon
+SBINLINKS = rc-update runscript start-stop-daemon
ALL_LINKS = $(BINLINKS) $(SBINLINKS) $(RC_BINLINKS) $(RC_SBINLINKS)
# We also define _BSD_SOURCE so both Linux and the BSDs get a few
diff --git a/src/env-update.c b/src/env-update.c
deleted file mode 100644
index 7fcd03ad..00000000
--- a/src/env-update.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- env-update
- Create /etc/profile.env (sh), /etc/csh.env from /etc/env.d
- Run ldconfig as required
-
- Copyright 2007 Gentoo Foundation
- Released under the GPLv2
-
-*/
-
-#define APPLET "env-update"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "builtins.h"
-#include "einfo.h"
-#include "rc.h"
-#include "rc-misc.h"
-#include "strlist.h"
-
-#define ENVDIR "/etc/env.d"
-#define PROFILE_ENV "/etc/profile.env"
-#define CSH_ENV "/etc/csh.env"
-#define LDSOCONF "/etc/ld.so.conf"
-
-#define NOTICE "# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.\n" \
- "# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES\n" \
- "# GO INTO %s NOT %s\n\n"
-
-#define LDNOTICE "# ld.so.conf autogenerated by env-update; make all\n" \
- "# changes to contents of /etc/env.d directory\n"
-
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
-#define LD_MESSAGE "Regenerating /var/run/ld-elf.so.hints"
-#define LD_SYSTEM "/sbin/ldconfig -elf -i '" LDSOCONF "'"
-#else
-#define LD_MESSAGE "Regenerating /etc/ld.so.cache"
-#define LD_SYSTEM "/sbin/ldconfig"
-#endif
-
-static const char *colon_separated[] = {
- "ADA_INCLUDE_PATH",
- "ADA_OBJECTS_PATH",
- "CLASSPATH",
- "INFOPATH",
- "KDEDIRS",
- "LDPATH",
- "MANPATH",
- "PATH",
- "PKG_CONFIG_PATH",
- "PRELINK_PATH",
- "PRELINK_PATH_MASK",
- "PYTHONPATH",
- "ROOTPATH",
- NULL
-};
-
-static const char *space_separated[] = {
- "CONFIG_PROTECT",
- "CONFIG_PROTECT_MASK",
- NULL,
-};
-
-static char *applet = NULL;
-
-#include "_usage.h"
-#define getoptstring "lL" getoptstring_COMMON
-static struct option longopts[] = {
- { "fork-ldconfig", 0, NULL, 'l'},
- { "no-ldconfig", 0, NULL, 'L'},
- longopts_COMMON
-};
-static const char * const longopts_help[] = {
- "Fork ldconfig into the background",
- "Skip execution of ldconfig",
- longopts_help_COMMON
-};
-#include "_usage.c"
-
-int env_update (int argc, char **argv)
-{
- DIR *dp;
- struct dirent *d;
- char **envs = NULL;
- char *env;
- int i = 0;
- int j;
- FILE *fp;
- bool ld = true;
- char *ldent;
- char **ldents = NULL;
- char **config = NULL;
- char *entry;
- char **mycolons = NULL;
- char **myspaces = NULL;
- int opt;
- bool ldconfig = true;
- bool fork_ldconfig = false;
- int nents = 0;
- char *path;
- char **entries = NULL;
- struct stat buf;
-
- applet = argv[0];
-
- while ((opt = getopt_long (argc, argv, getoptstring,
- longopts, (int *) 0)) != -1)
- {
- switch (opt) {
- case 'l':
- fork_ldconfig = true;
- break;
- case 'L':
- ldconfig = false;
- break;
-
- case_RC_COMMON_GETOPT
- }
- }
-
- if (! (dp = opendir (ENVDIR)))
- eerrorx ("%s: opendir `" ENVDIR "': %s", applet, strerror (errno));
-
- while ((d = readdir (dp))) {
- if (d->d_name[0] == '.')
- continue;
-
- path = rc_strcatpaths (ENVDIR, d->d_name, (char *) NULL);
- j = strlen (d->d_name);
- if (stat (path, &buf) == 0 && S_ISDIR (buf.st_mode) == 0 &&
- j > 2 &&
- 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))
- {
- entries = rc_config_load (path);
-
- STRLIST_FOREACH (entries, entry, j) {
- char *tmpent = 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);
- }
- free (path);
- }
- closedir (dp);
-
- if (! config)
- eerrorx ("%s: nothing to process", applet);
-
- STRLIST_FOREACH (config, entry, i) {
- char *tmpent = xstrdup (entry);
- char *value = tmpent;
- char *var = strsep (&value, "=");
- char *match;
- bool colon = false;
- bool space = false;
- bool replaced = false;
-
- for (j = 0; colon_separated[j]; j++)
- if (strcmp (colon_separated[j], var) == 0) {
- colon = true;
- break;
- }
-
- if (! colon)
- STRLIST_FOREACH (mycolons, match, j) {
- if (strcmp (match, var) == 0) {
- colon = true;
- break;
- } }
-
- if (! colon)
- for (j = 0; space_separated[j]; j++)
- if (strcmp (space_separated[j], var) == 0) {
- space = true;
- break;
- }
-
- if (! colon && ! space)
- STRLIST_FOREACH (myspaces, match, j)
- if (strcmp (match, var) == 0) {
- space = true;
- break;
- }
-
- /* Skip blank vars */
- if ((colon || space) &&
- (! value || strlen (value)) == 0)
- {
- free (tmpent);
- continue;
- }
-
- STRLIST_FOREACH (envs, env, j) {
- char *tmpenv = xstrdup (env);
- char *tmpvalue = tmpenv;
- char *tmpentry = strsep (&tmpvalue, "=");
-
- if (strcmp (tmpentry, var) == 0) {
- if (colon || space) {
- int len = strlen (envs[j - 1]) + strlen (entry) + 1;
- envs[j - 1] = xrealloc (envs[j - 1], len);
- snprintf (envs[j - 1] + strlen (envs[j - 1]), len,
- "%s%s", colon ? ":" : " ", value);
- } else {
- free (envs[j - 1]);
- envs[j - 1] = xstrdup (entry);
- }
- replaced = true;
- }
- free (tmpenv);
-
- if (replaced)
- break;
- }
-
- if (! replaced)
- rc_strlist_addsort (&envs, entry);
-
- free (tmpent);
- }
- rc_strlist_free (mycolons);
- rc_strlist_free (myspaces);
- rc_strlist_free (config);
-
- if ((fp = fopen (PROFILE_ENV, "w")) == NULL)
- eerrorx ("%s: fopen `%s': %s", applet, PROFILE_ENV, strerror (errno));
- fprintf (fp, NOTICE, "/etc/profile", PROFILE_ENV);
-
- STRLIST_FOREACH (envs, env, i) {
- char *tmpent = xstrdup (env);
- char *value = tmpent;
- char *var = strsep (&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);
-
- if ((fp = fopen (CSH_ENV, "w")) == NULL)
- eerrorx ("%s: fopen `%s': %s", applet, PROFILE_ENV, strerror (errno));
- fprintf (fp, NOTICE, "/etc/csh.cshrc", PROFILE_ENV);
-
- STRLIST_FOREACH (envs, env, i) {
- char *tmpent = xstrdup (env);
- char *value = tmpent;
- char *var = strsep (&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);
-
- ldent = rc_config_value (envs, "LDPATH");
-
- if (! ldent ||
- (argc > 1 && argv[1] && strcmp (argv[1], "--no-ldconfig") == 0))
- {
- rc_strlist_free (envs);
- return (EXIT_SUCCESS);
- }
-
- while ((env = strsep (&ldent, ":"))) {
- if (*env && rc_strlist_addu (&ldents, env))
- nents++;
- }
-
- if (ldconfig) {
- /* Update ld.so.conf only if different */
- if (exists (LDSOCONF)) {
- char **lines = rc_config_list (LDSOCONF);
- char *line;
- ld = false;
-
- STRLIST_FOREACH (lines, line, i)
- if (i > nents || strcmp (line, ldents[i - 1]) != 0)
- {
- ld = true;
- break;
- }
- rc_strlist_free (lines);
- if (i - 1 != nents)
- ld = true;
- }
-
- if (ld) {
- int retval = 0;
- pid_t pid = 0;
-
- if ((fp = fopen (LDSOCONF, "w")) == NULL)
- eerrorx ("%s: fopen `%s': %s", applet, LDSOCONF,
- strerror (errno));
- fprintf (fp, LDNOTICE);
- STRLIST_FOREACH (ldents, ldent, i)
- fprintf (fp, "%s\n", ldent);
- fclose (fp);
-
- ebegin (LD_MESSAGE);
- if (fork_ldconfig) {
- if ((pid = fork ()) == -1)
- eerror ("%s: failed to fork: %s", applet,
- strerror (errno));
- else if (pid == 0) {
- /* Become a proper daemon for a little bit */
- int fd = open ("/dev/null", O_RDWR);
- setsid ();
- dup2 (fd, fileno (stdin));
- dup2 (fd, fileno (stdout));
- dup2 (fd, fileno (stderr));
- }
- }
-
- if (pid == 0)
- retval = system (LD_SYSTEM);
- eend (retval, NULL);
- }
- }
-
- rc_strlist_free (ldents);
- rc_strlist_free (envs);
- return(EXIT_SUCCESS);
-}