From d9fc4acc572c6647a4f27b838d35d27d805d190e Mon Sep 17 00:00:00 2001 From: Jason Stubbs Date: Sun, 28 Aug 2005 08:37:44 +0000 Subject: Migration (without history) of the current stable line to subversion. svn path=/main/branches/2.0/; revision=1941 --- bin/env-update.sh | 221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100755 bin/env-update.sh (limited to 'bin/env-update.sh') diff --git a/bin/env-update.sh b/bin/env-update.sh new file mode 100755 index 00000000..5edc2da6 --- /dev/null +++ b/bin/env-update.sh @@ -0,0 +1,221 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /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 + +[[ ${ROOT} == / ]] && /sbin/depscan.sh -- cgit v1.2.3-65-gdbad