check4progs: Change testing from ‘which’ to iterating over $PATH [Closes: issue1284]
[grml-etc-core.git] / etc / grml / script-functions
index bc30ca5..4d6bcea 100644 (file)
@@ -3,7 +3,6 @@
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Sam Sep 16 13:08:16 CEST 2006 [mika]
 ################################################################################
 
 # {{{ set default PATH
@@ -14,7 +13,7 @@ setpath(){
 
 # {{{ check for root-permissions
 check4root(){
-  if [ "$UID" != 0 ] ; then
+  if [ "$(id -u 2>/dev/null)" != 0 ] ; then
     echo 1>&2 "Error: please run this script with uid 0 (root)." ; return 1
   fi
 }
@@ -22,7 +21,7 @@ check4root(){
 
 # {{{ check for user permissions
 check4user(){
-  if [ "$UID" == 0 ] ; then
+  if [ "$(id -u 2>/dev/null)" = 0 ] ; then
     echo 1>&2 "Error: please do not run this script with uid 0 (root)." ; return 1
   fi
 }
@@ -49,15 +48,60 @@ setdialog(){
 # }}}
 
 # {{{ check for availability of program(s)
-check4progs(){
-  local RC=''
-  for arg in $* ; do
-    type -p $arg >/dev/null 2>&1 || RC="$arg"
-  done
-  if [ -n "$RC" ] ; then
-     echo "$RC not installed"
-     return 1
-  fi
+# usage example:
+#       check4progs [-s,-q,--quiet,--silent] arg [arg .... argn]
+#
+# with option given either of:
+#       -s,-q,--quiet,--silent
+#
+# check for available progs but produce no output
+check4progs() {
+    [ -n "${ZSH_VERSION}" ] && emulate -L sh
+    local RTN=0
+    local oldifs="${IFS}"
+    local ARG d found
+    local VERBOSE=1
+
+    case ${1} in
+        -q | -s | --quiet | --silent)
+            VERBOSE=0
+            shift 1
+            ;;
+
+        *)
+            ;;
+    esac
+
+    while [ $# -gt 0 ]
+    do
+        ARG="$1"
+        shift
+
+        found=0
+        IFS=:
+        for d in $PATH
+        do
+            if [ -x "${d}/${ARG}" ]
+            then
+                found=1
+                break
+            fi
+        done
+        IFS="${oldifs}"
+
+        # check for availability
+        if [ ${found} -eq 0 ]
+        then
+            if [ ${VERBOSE} -eq 1 ]
+            then
+                printf "%s: binary not found\n" "${ARG}" >&2
+            fi
+            RTN=1
+        fi
+    done
+
+    # return non zero, if at least one prog is missing!
+    return $RTN
 }
 # }}}
 
@@ -77,8 +121,9 @@ stringinstring(){
 
 # {{{ reread boot command line; echo last parameter's argument or return false.
 getbootparam(){
-  stringinstring " $1=" /proc/cmdline || return 1
-  result="${/proc/cmdline##*$1=}"
+  CMDLINE=$(cat /proc/cmdline)
+  stringinstring " $1=" "$CMDLINE" || return 1
+  result="${CMDLINE##*$1=}"
   result="${result%%[   ]*}"
   echo "$result"
   return 0
@@ -87,7 +132,7 @@ getbootparam(){
 
 # {{{ check boot commandline for specified option
 checkbootparam(){
-  stringinstring " $1" /proc/cmdline
+  stringinfile " $1" /proc/cmdline
   return "$?"
 }
 # }}}
@@ -141,5 +186,47 @@ mount_sys(){
 }
 # }}}
 
+# char *reverse_list(list) {{{
+#
+#   Returns the reversed order of list
+#
+reverse_list() {
+  local ret
+  ret=''
+  while [ "$#" -gt 0 ] ; do
+    if [ -z "${ret}" ] ; then
+      ret="$1"
+    else
+      ret="$1 ${ret}"
+    fi
+    shift
+  done
+  printf '%s' "${ret}"
+}
+#}}}
+
+# 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
+  local ref="$1"
+  shift
+
+  for x in "$@" ; do
+    [ "${x}" -nt "${ref}" ] && return 0
+
+    if [ -d "${x}" ] ; then
+      is_older_than "${ref}" "${x}"/* && return 0
+    fi
+  done
+
+  return 1
+}
+#}}}
+
 ## END OF FILE #################################################################
-# vim:foldmethod=marker tw=80 ai expandtab shiftwidth=2 tabstop=2
+# vim:foldmethod=marker tw=80 ai expandtab shiftwidth=2 tabstop=8 ft=sh