diff options
Diffstat (limited to 'sh/functions.sh')
-rw-r--r-- | sh/functions.sh | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/sh/functions.sh b/sh/functions.sh new file mode 100644 index 00000000..d1327ad5 --- /dev/null +++ b/sh/functions.sh @@ -0,0 +1,157 @@ +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# Please keep this useable by every shell in portage + +RC_GOT_FUNCTIONS="yes" + +eindent() { + if [ -n "${RC_EBUFFER}" ] ; then + "${RC_LIBDIR}"/bin/eindent + else + RC_EINDENT=$((${RC_EINDENT:-0} + 2)) + [ "${RC_EINDENT}" -gt 40 ] && RC_EINDENT=40 + export RC_EINDENT + fi +} + +eoutdent() { + if [ -n "${RC_EBUFFER}" ] ; then + "${RC_LIBDIR}"/bin/eoutdent + else + RC_EINDENT=$((${RC_EINDENT:-0} - 2)) + [ "${RC_EINDENT}" -lt 0 ] && RC_EINDENT=0 + fi + return 0 +} + +# void esyslog(char* priority, char* tag, char* message) +# +# use the system logger to log a message +# +esyslog() { + local pri= tag= + + if [ -x /usr/bin/logger ] ; then + pri="$1" + tag="$2" + + shift 2 + [ -z "$*" ] && return 0 + + /usr/bin/logger -p "${pri}" -t "${tag}" -- "$*" + fi + + return 0 +} + +# Safer way to list the contents of a directory, +# as it do not have the "empty dir bug". +# +# char *dolisting(param) +# +# print a list of the directory contents +# +# NOTE: quote the params if they contain globs. +# also, error checking is not that extensive ... +# +dolisting() { + local x= y= mylist= mypath="$*" + + # Here we use file globbing instead of ls to save on forking + for x in ${mypath} ; do + [ ! -e "${x}" ] && continue + + if [ -L "${x}" -o -f "${x}" ] ; then + mylist="${mylist} "${x} + elif [ -d "${x}" ] ; then + [ "${x%/}" != "${x}" ] && x=${x%/} + + for y in "${x}"/* ; do + [ -e "${y}" ] && mylist="${mylist} ${y}" + done + fi + done + + echo "${mylist# *}" +} + +# bool is_older_than(reference, files/dirs to check) +# +# return 0 if any of the files/dirs are newer than +# the reference file +# +# EXAMPLE: if is_older_than a.out *.o ; then ... +is_older_than() { + local x= ref="$1" + shift + + for x in "$@" ; do + [ -e "${x}" ] || continue + # We need to check the mtime if it's a directory too as the + # contents may have changed. + [ "${x}" -nt "${ref}" ] && return 0 + [ -d "${x}" ] && is_older_than "${ref}" "${x}"/* && return 0 + done + + return 1 +} + +uniqify() { + local result= + while [ -n "$1" ] ; do + case " ${result} " in + *" $1 "*) ;; + *) result="${result} $1" ;; + esac + shift + done + echo "${result# *}" +} + +KV_to_int() { + [ -z $1 ] && return 1 + + local KV_MAJOR=${1%%.*} + local x=${1#*.} + local KV_MINOR=${x%%.*} + x=${1#*.*.} + local KV_MICRO=${x%%-*} + local KV_int=$((${KV_MAJOR} * 65536 + ${KV_MINOR} * 256 + ${KV_MICRO} )) + + # We make version 2.2.0 the minimum version we will handle as + # a sanity check ... if its less, we fail ... + [ "${KV_int}" -lt 131584 ] && return 1 + + echo "${KV_int}" +} + +# Setup a basic $PATH. Just add system default to existing. +# This should solve both /sbin and /usr/sbin not present when +# doing 'su -c foo', or for something like: PATH= rcscript start +case "${PATH}" in + /lib/rcscripts/bin:/bin:/sbin:/usr/bin:/usr/sbin) ;; + /lib/rcscripts/bin:/bin:/sbin:/usr/bin:/usr/sbin:*) ;; + *) export PATH="/lib/rcscripts/bin:/bin:/sbin:/usr/bin:/usr/sbin:${PATH}" ;; +esac + +for arg in "$@" ; do + case "${arg}" in + --nocolor|--nocolour) + export RC_NOCOLOR="yes" + ;; + esac +done + +if [ "${RC_NOCOLOR}" != "yes" -a -z "${GOOD}" ] ; then + if color_terminal ; then + GOOD=$'\e[32;01m' + WARN=$'\e[33;01m' + BAD=$'\e[31;01m' + HILITE=$'\e[36;01m' + BRACKET=$'\e[34;01m' + NORMAL=$'\e[0m' + fi +fi + +# vim: set ts=4 : |