tags 738759 + patch
thanks
Hi!
Please find attach a proposed patch for the issue. I hope we can get
around at work to test it properly within the next few days, but from
what I can tell this should be a good approach.
Enjoy,
Rhonda
--
Fühlst du dich mutlos, fass endlich Mut, los |
Fühlst du dich hilflos, geh raus und hilf, los | Wir sind Helden
Fühlst du dich machtlos, geh raus und mach, los | 23.55: Alles auf Anfang
Fühlst du dich haltlos, such Halt und lass los |
>From e211b7ba4fdce03d66b9edc097349c4d17d94063 Mon Sep 17 00:00:00 2001
From: Gerfried Fuchs <[email protected]>
Date: Fri, 14 Feb 2014 08:03:25 +0100
Subject: [PATCH] only scan the rcX.d once for reading all kill or all start
links (closes: #738759)
---
debian/changelog | 5 ++
debian/src/sysv-rc/etc/init.d/rc | 138 ++++++++++++++++++++++-----------------
2 files changed, 84 insertions(+), 59 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index ac3f0a0..0bff2a4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,13 @@
sysvinit (2.88dsf-52) UNRELEASED; urgency=low
+ [ Petter Reinholdtsen ]
* Replace debian/watch with file available from
http://qa.debian.org/cgi-bin/watchfile.cgi?package=sysvinit .
+ [ Gerfried Fuchs ]
+ * only scan the rcX.d once for reading all kill or all start links
+ (closes: #738759)
+
-- Petter Reinholdtsen <[email protected]> Thu, 13 Feb 2014 13:23:35 +0100
sysvinit (2.88dsf-51) unstable; urgency=low
diff --git a/debian/src/sysv-rc/etc/init.d/rc b/debian/src/sysv-rc/etc/init.d/rc
index 4e95302..7767778 100644
--- a/debian/src/sysv-rc/etc/init.d/rc
+++ b/debian/src/sysv-rc/etc/init.d/rc
@@ -124,6 +124,65 @@ case "$CONCURRENCY" in
;;
esac
+# helper scripts
+kill_test_add() {
+ script=$1
+ # Check if the script is there.
+ [ ! -f $script ] && return ""
+
+ #
+ # Find stop script in previous runlevel but
+ # no start script there.
+ #
+ suffix=${script#/etc/rc$runlevel.d/K[0-9][0-9]}
+ previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
+ previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
+ #
+ # If there is a stop script in the previous level
+ # and _no_ start script there, we don't
+ # have to re-stop the service.
+ #
+ [ -f $previous_stop ] && [ ! -f $previous_start ] && return ""
+
+ # Stop the service.
+ return $script
+}
+start_test_add() {
+ script=$1
+ [ ! -f $script ] && return ""
+
+ suffix=${script#/etc/rc$runlevel.d/S[0-9][0-9]}
+ if [ "$previous" != N ]
+ then
+ #
+ # Find start script in previous runlevel and
+ # stop script in this runlevel.
+ #
+ stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
+ previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
+ #
+ # If there is a start script in the previous level
+ # and _no_ stop script in this level, we don't
+ # have to re-start the service.
+ #
+ if [ start = "$ACTION" ] ; then
+ [ -f $previous_start ] && [ ! -f $stop ] && return ""
+ else
+ # Workaround for the special
+ # handling of runlevels 0 and 6.
+ previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
+ #
+ # If there is a stop script in the previous level
+ # and _no_ start script there, we don't
+ # have to re-stop the service.
+ #
+ [ -f $previous_stop ] && [ ! -f $previous_start ] && return ""
+ fi
+
+ fi
+ return $script
+}
+
# Is there an rc directory for this new runlevel?
if [ -d /etc/rc$runlevel.d ]
then
@@ -150,41 +209,28 @@ then
then
# Run all scripts with the same level in parallel
CURLEVEL=""
+ SCRIPTS=""
for s in /etc/rc$runlevel.d/K*
do
# Extract order value from symlink
level=${s#/etc/rc$runlevel.d/K}
level=${level%%[a-zA-Z]*}
+ if [ -z "$CURLEVEL" ]
+ then
+ CURLEVEL=$level
+ fi
if [ "$level" = "$CURLEVEL" ]
then
+ SCRIPTS="$SCRIPTS $(kill_test_add $s)"
continue
fi
- CURLEVEL=$level
- SCRIPTS=""
- for i in /etc/rc$runlevel.d/K$level*
- do
- # Check if the script is there.
- [ ! -f $i ] && continue
-
- #
- # Find stop script in previous runlevel but
- # no start script there.
- #
- suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9]}
- previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
- previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
- #
- # If there is a stop script in the previous level
- # and _no_ start script there, we don't
- # have to re-stop the service.
- #
- [ -f $previous_stop ] && [ ! -f $previous_start ] && continue
+ SCRIPTS="$SCRIPTS $(kill_test_add $s)"
- # Stop the service.
- SCRIPTS="$SCRIPTS $i"
- done
startup stop $SCRIPTS
+ CURLEVEL=$level
+ SCRIPTS=""
done
+ startup stop $SCRIPTS
fi
if [ makefile = "$CONCURRENCY" ]
@@ -199,54 +245,28 @@ then
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
CURLEVEL=""
+ SCRIPTS=""
for s in /etc/rc$runlevel.d/S*
do
# Extract order value from symlink
level=${s#/etc/rc$runlevel.d/S}
level=${level%%[a-zA-Z]*}
+ if [ -z "$CURLEVEL" ]
+ then
+ CURLEVEL=$level
+ fi
if [ "$level" = "$CURLEVEL" ]
then
+ SCRIPTS="$SCRIPTS $(start_test_add $s)"
continue
fi
- CURLEVEL=$level
- SCRIPTS=""
- for i in /etc/rc$runlevel.d/S$level*
- do
- [ ! -f $i ] && continue
-
- suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
- if [ "$previous" != N ]
- then
- #
- # Find start script in previous runlevel and
- # stop script in this runlevel.
- #
- stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
- previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
- #
- # If there is a start script in the previous level
- # and _no_ stop script in this level, we don't
- # have to re-start the service.
- #
- if [ start = "$ACTION" ] ; then
- [ -f $previous_start ] && [ ! -f $stop ] && continue
- else
- # Workaround for the special
- # handling of runlevels 0 and 6.
- previous_stop=/etc/rc$previous.d/K[0-9][0-9]$suffix
- #
- # If there is a stop script in the previous level
- # and _no_ start script there, we don't
- # have to re-stop the service.
- #
- [ -f $previous_stop ] && [ ! -f $previous_start ] && continue
- fi
+ SCRIPTS="$SCRIPTS $(start_test_add $s)"
- fi
- SCRIPTS="$SCRIPTS $i"
- done
startup $ACTION $SCRIPTS
+ CURLEVEL=$level
+ SCRIPTS=""
done
+ startup $ACTION $SCRIPTS
fi
fi
--
1.8.5.3
_______________________________________________
Pkg-sysvinit-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-sysvinit-devel