#!/bin/bash
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

############################################
############################################
# 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
