summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sh/functions.sh')
-rw-r--r--sh/functions.sh157
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 :