rcrun(8): Properly handle scripts that provide more than one keyword.
authorSascha Wildner <saw@online.de>
Fri, 14 Feb 2014 21:15:14 +0000 (22:15 +0100)
committerSascha Wildner <saw@online.de>
Fri, 14 Feb 2014 21:15:48 +0000 (22:15 +0100)
The loop that checks if all dependencies of the target are running
didn't take into account that there could be more than one PROVIDE
keyword in one script. It treated all PROVIDEs which were not named
like the target as not yet running dependencies and failed.

To fix, loop through the PROVIDEs twice, the first time to skip all
the PROVIDEs of the script if the target is one of them.

All this is due to the output of "rcorder -o ..." having the script
that provides the target which we want to run as its last element,
so document that with a comment.

Reported-by: joris
sbin/rcrun/rcrun.sh

index d875f1a..485f4bf 100644 (file)
@@ -47,6 +47,9 @@ buildrclist()
            rcfiles="$rcfiles `find $d -type f`"
        fi
     done
+    # The last element of this list is the script that provides the target
+    # we want to run.
+    #
     rclist=`rcorder -o $1 $rcfiles`
 }
 
@@ -68,10 +71,18 @@ dostart()
            buildrclist $tgt
            for dep in $rclist; do
                need=1
-               for dep_prvd in `rcorder -p $dep`; do
+               dep_prvd_list=`rcorder -p $dep`
+               # Because the dependency could actually provide more than one
+               # keyword, iterate it twice, first looking for a match in any
+               # of its PROVIDEs.
+               #
+               for dep_prvd in $dep_prvd_list; do
                    if [ $dep_prvd = $tgt ]; then
                        need=0
-                   else
+                   fi
+               done
+               if [ $need = 1 ]; then
+                   for dep_prvd in $dep_prvd_list; do
                        state=`varsym -s -q rcng_$dep_prvd`
                        case X$state in
                        Xrunning*|Xconfigured*|Xirrelevant*|Xdisabled*)
@@ -81,8 +92,8 @@ dostart()
                            _return=1
                            ;;
                        esac
-                   fi
-               done
+                   done
+               fi
            done
            # $dep contains the last dependency, which we run
            #