blob: 58e3f406a5b2dfd1b44197ca81911b43159a5323 [file] [log] [blame]
#!/bin/bash
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: /var/cvsroot/gentoo-src/portage/bin/env-update.sh,v 1.2 2004/10/04 13:56:50 vapier Exp $
############################################
############################################
# ENVIRONMENT SETUP
############################################
if [[ ${EUID} -ne 0 ]] ; then
echo "$0: must be root."
exit 1
fi
# Make sure our environment is sane
if [[ ! -z "${MAKELINKS}" ]] ; then
export MAKELINKS=0
else
export MAKELINKS=1
fi
export ROOT="${ROOT:=/}"
[[ ${ROOT} == */ ]] || export ROOT="${ROOT}/"
export ENVDIR="${ROOT}etc/env.d"
mkdir -p ${ENVDIR}
chmod 755 ${ENVDIR}
specials="
KDEDIRS PATH CLASSPATH LDPATH MANPATH INFODIR INFOPATH ROOTPATH
CONFIG_PROTECT CONFIG_PROTECT_MASK PRELINK_PATH PYTHONPATH
PRELINK_PATH_MASK ADA_INCLUDE_PATH ADA_OBJECTS_PATH"
colon_separated="
ADA_INCLUDE_PATH ADA_OBJECTS_PATH LDPATH PATH MANPATH ROOTPATH
PRELINK_PATH PRELINK_PATH_MASK PYTHON_PATH"
export LDSOCONF="${ROOT}etc/ld.so.conf"
export PRELINKCONF="${ROOT}etc/prelink.conf"
defaultprelinkpaths=":/bin:/sbin:/usr/bin:/usr/sbin:/lib:/usr/lib"
export PROFILEENV="${ROOT}etc/profile.env"
export CSHENV="${ROOT}etc/csh.env"
# make sure we aren't tricked with previous 'my_envd_' variables
unset $(set | grep '^my_envd_' | cut -d= -f1)
############################################
############################################
# ENV.D PARSING
############################################
do_has() {
local x
local me="$1"
shift
for x in "$@" ; do
[[ ${x} == ${me} ]] && return 0
done
return 1
}
has() {
local ret
local ifs="${IFS}"
unset IFS
do_has $1 ${!2}
ret=$?
export IFS="${ifs}"
return ${ret}
}
is_special() {
has $1 specials
}
is_colon_separated() {
has $1 colon_separated
}
for envd in $(ls ${ENVDIR} | sort) ; do
# make sure file is a vaild env'd entry and not a backup file
num="${envd:0:2}"
if [[ ! -z ${num//[0-9]} ]] ; then
continue
elif [[ ${envd} == *~ || ${envd} == *.bak ]] ; then
continue
fi
# use bash to make sure the file is valid
envd="${ENVDIR}/${envd}"
if ! (source "${envd}") ; then
echo "!!! Error parsing ${envd}!"
exit 1
fi
# parse env.d entries
cnfvars="$(grep '^[[:alpha:]_][[:alnum:]_]*=' "${envd}")"
export IFS=$'\n'
for cnfv in ${cnfvars} ; do
var="${cnfv/=*}"
val="${cnfv:${#var}+1}"
if [ "${val:0:1}" == "\"" ] ; then
val="${val:1:${#val}-2}"
fi
myvar="my_envd_${var}"
if is_special ${var} ; then
if [[ ! -z "${!myvar}" ]] ; then
if is_colon_separated ${var} ; then
sep=":"
else
sep=" "
fi
else
sep=""
fi
export ${myvar}="${!myvar}${sep}${val}"
else
export ${myvar}="${val}"
fi
done
unset IFS
done
############################################
############################################
# LD.SO.CONF HANDLING
############################################
# create a : sep list from ld.so.conf
export OLD_LDPATH=""
if [ -s "${LDSOCONF}" ] ; then
while read line ; do
if [[ "${line:0:1}" == "#" ]] ; then
continue
fi
export OLD_LDPATH="${OLD_LDPATH}:${line}"
done < ${LDSOCONF}
export OLD_LDPATH="${OLD_LDPATH:1}"
fi
# has the ldpath changed ? if so, recreate
if [[ "${OLD_LDPATH}" != "${my_envd_LDPATH}" ]] ; then
cat << EOF > ${LDSOCONF}
# ld.so.conf autogenerated by env-update; make all changes to
# contents of /etc/env.d directory
${my_envd_LDPATH//:/
}
EOF
fi
############################################
############################################
# HANDLE PRELINK PATHS
############################################
if prelink --version >& /dev/null ; then
# we assume LDPATH and PATH aren't empty ... if they were, we got other problems
envdprelinkcheckpaths="${my_envd_LDPATH}:${my_envd_PATH}"
if [[ ! -z "${my_envd_PRELINK_PATH}" ]] ; then
envdprelinkcheckpaths="${envdprelinkcheckpaths}:${my_envd_PRELINK_PATH}"
fi
if [[ ! -z "${my_envd_PRELINK_PATH_MASK}" ]] ; then
export prelink_mask=":${PRELINK_PATH_MASK}:"
envdprelinkpaths=""
export IFS=":"
for dir in ${envdprelinkcheckpaths} ; do
if [[ ${dir:0-1} == / ]] ; then
noslashdir="${dir:0:${#dir}-1}"
else
dir="${dir}/"
noslashdir="${dir}"
fi
if [[ ${prelink_mask/:${dir}:/} == ${prelink_mask} \
&& ${prelink_mask/:${noslashdir}:/} == ${prelink_mask} ]] ; then
envdprelinkpaths="${envdprelinkpaths}:${dir}"
fi
done
unset IFS
else
envdprelinkpaths=":${envdprelinkcheckpaths}"
fi
cat << EOF > ${PRELINKCONF}
# prelink.conf autogenerated by env-update; make all changes to
# contents of /etc/env.d directory
${defaultprelinkpaths//:/
-l }
${envdprelinkpaths//:/
-h }
EOF
fi
unset my_envd_LDPATH
############################################
############################################
# RUN EXTERNAL PROGRAMS NOW
############################################
echo ">>> Regenerating ${ROOT}etc/ld.so.cache..."
if [[ ${MAKELINKS} -eq 0 ]] ; then
(cd / ; /sbin/ldconfig -X -r ${ROOT} >& /dev/null)
else
(cd / ; /sbin/ldconfig -r ${ROOT} >& /dev/null)
fi
cat << EOF > ${PROFILEENV}
# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.
# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES
# GO INTO /etc/profile NOT /etc/profile.env
$(set | grep '^my_envd_' | sed -e 's:^my_envd_:export :')
EOF
cat << EOF > ${CSHENV}
# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.
# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES
# GO INTO /etc/csh.cshrc NOT /etc/csh.env
$(set | grep '^my_envd_' | sed -e 's:^my_envd_\([[:alpha:]_][[:alnum:]_]*\)=:setenv \1 :')
EOF