All kidding aside, I couldn't stop laughing.  Not sure if I should have been 
crying, though.  :)  Now, my script-fu is not Jack-Black-panda strong, but 
AFAICT it's horribly broken.  I'd be happy to be educated otherwise, though.

Here's the current statusproc() function:

################################################################################
# statusproc()                                                                 #
# Usage: statusproc [-p pidfile] pathname                                      #
#                                                                              #
# Purpose: This function prints the status of a particular daemon to stdout    #
#                                                                              #
# Inputs: -p pidfile, use the specified pidfile instead of pidof               #
#         pathname, path to the specified program                              #
#                                                                              #
# Note: Output to stdout.  Not logged.                                         #
#                                                                              #
# Return values:                                                               #
#       0 - Status printed                                                     #
#       1 - Input error. The daemon to check was not specified.                #
################################################################################
statusproc()
{
   if [ "${#}" = "0" ]; then
      echo "Usage: statusproc {program}"
      exit 1
   fi

    local pidfile
    local pidlist

    # Process arguments
    while true; do
      case "${1}" in

          -p)
              pidfile="${2}"
              shift 2
              ;;
      esac
   done

   if [ -z "${pidfile}" ]; then
      pidlist=`pidofproc -p "${pidfile}" $@`
   else
      pidlist=`pidofproc $@`
   fi

   # Trim trailing blanks
   pidlist=`echo "${pidlist}" | sed -r 's/ +$//'`

   base="${1##*/}"

   if [ -n "${pidlist}" ]; then
      echo -e "${INFO}${base} is running with Process" \
         "ID(s) ${pidlist}.${NORMAL}"
   else
      if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
         echo -e "${WARNING}${1} is not running but" \
            "/var/run/${base}.pid exists.${NORMAL}"
      else
         if [ -z "${pidlist}" -a -n "${pidfile}" ]; then
            echo -e "${WARNING}${1} is not running" \
               "but ${pidfile} exists.${NORMAL}"
         else
            echo -e "${INFO}${1} is not running.${NORMAL}"
         fi
      fi
   fi
}
################################################################################

This is sort of an epic travesty. :D  First, it starts with a nice 
infinite-loop 'while true' to process the arguments, with no breaks that I can 
see.  For me, this just hangs.

Then, there's an inverted check...If the ${pidfile} is optional, why is it 
being used in the [ -z ] check?  Finally, aside from the infinite-loop, there's 
no way to capture the <path-to-proc> argument, whether or not -p is used.  You 
can tell someone wanted to shift and use $1, but how does that work in the 
event -p comes after?  Sure, it's not *allowed* usage, but...bad usage probably 
shouldn't hang the script.

I assume...Because vanilla-LFS doesn't include any daemons, this code was never 
exercised.  But, BLFS comes with plenty, many of which call this function their 
"status" invocations.  Which, at least for me, just hangs.

Here's a patch that works.  And, I've included--for a surprisingly low price of 
$19.99 if you call in the next 15 minutes!--a handy function called 
is_dir_empty(), which...when called, returns 0 (zero) for an empty directory.  
It's a nice thing to have for scripts that have conditional elements based on 
whether or not files are present in a directory; I didn't see an analog in the 
current script.

        Q




--- lfs-bootscripts-20111017/lfs/lib/services/init-functions-ORIG       
2011-10-21 20:30:16.000000000 -0700
+++ lfs-bootscripts-20111017/lfs/lib/services/init-functions    2012-02-18 
13:46:12.093976105 -0800
@@ -487,26 +487,31 @@
     local pidlist
 
     # Process arguments
-    while true; do
+    local args
+    while [ $# -ne 0 ] ; do
       case "${1}" in
-
           -p)
+              args="${args} ${1}"
               pidfile="${2}"
               shift 2
               ;;
+           *)
+              args="${args} ${1}"
+              shift 1
+              ;;
       esac
    done
 
    if [ -z "${pidfile}" ]; then
-      pidlist=`pidofproc -p "${pidfile}" $@`
+      pidlist=`pidofproc $args`
    else
-      pidlist=`pidofproc $@`
+      pidlist=`pidofproc -p "${pidfile}" $@`
    fi
 
    # Trim trailing blanks
    pidlist=`echo "${pidlist}" | sed -r 's/ +$//'`
 
-   base="${1##*/}"
+   base="${args##*/}"
 
    if [ -n "${pidlist}" ]; then
       echo -e "${INFO}${base} is running with Process" \
@@ -742,4 +747,26 @@
    return 0
 }
 
+################################################################################
+# is_dir_empty()                                                               
#
+#                                                                              
#
+# Purpose: Checks if a directory has no entries (files, subdirs, etc)          
#
+#                                                                              
#
+# Inputs: Accepts a single string which represents a path                      
#
+#                                                                              
#
+# Return values:                                                               
#
+#       0 - No entries                                                         
#
+#       1 - Enries present                                                     
#
+#     254 - Invalid directory path given                                       
#
+#     255 - No argument given                                                  
#
+#                                                                              
#
+################################################################################
+is_dir_empty()
+{
+   local dir=$1
+   if [ -z $dir ] ; then echo "$dir unspecified ; aborting" ; return 255 ; fi
+   if [ ! -d $dir ] ; then echo "$dir is not a directory; aborting" ; return 
254 ; fi
+   if [ 0 -eq $(/bin/ls -1 $dir/* 2> /dev/null | wc -l) ] ; then return 0 ; 
else return 1 ; fi
+}
+
 # End /lib/lsb/init-functions

-- 
http://linuxfromscratch.org/mailman/listinfo/lfs-support
FAQ: http://www.linuxfromscratch.org/lfs/faq.html
Unsubscribe: See the above information page

Reply via email to