Hi Michael,

Michael Biebl <bi...@debian.org> writes:
> a/ # of initscripts: 1192 (+3 symlinks)
> $ find . -type f | wc -l
> 1192
<Nitpick>
Slightly wrong, you are also matching non-executable files.
The actual number of init scripts is 1189 as determined by
$ find . -type f -perm 755 | wc -l
</Nitpick>

> f/ # of Usage lines using continuations:
> $ grep -vE "^\s*#.*"  */*/*  | grep '[Uu]sage.*\\$' | wc -l
> 10
Good catch. Of those, ifupdown-extra_0.22/init.d/networking-routes is a
false-positive but the other 9 are valid cases.

> Comments:
> 1/ I think it would be nice to check for [{|]reload[}|"] as delimiters,
> even if d/ currently doesn't turn up any additional hits. Just to be
> future-proof.
Done.

> 2/ f/ makes make think we should handle line continuations. This should
> probably be done like the existing code, using a STATE variable, i.e. we
> enter that state once we find ".*\\$" and leave it again as soon as this
> is no longer the case.
Also done. With the previous version of my patch:

$ systemctl show -p CanReload openarena-server.service
CanReload=no
$ systemctl show -p CanReload pulseaudio.service
CanReload=yes
$ systemctl show -p CanReload libvirt-guests.service
CanReload=no

With the latest (attached) version of my patch:

$ systemctl show -p CanReload openarena-server.service
CanReload=no
$ systemctl show -p CanReload pulseaudio.service      
CanReload=yes
$ systemctl show -p CanReload libvirt-guests.service  
CanReload=yes

--- systemd-44.orig/src/service.c	2012-03-12 21:49:16.000000000 +0100
+++ systemd-44/src/service.c	2012-10-15 00:25:38.357247732 +0200
@@ -494,7 +494,7 @@
         return c;
 }
 
-static int sysv_exec_commands(Service *s) {
+static int sysv_exec_commands(Service *s, const bool supports_reload) {
         ExecCommand *c;
 
         assert(s);
@@ -508,9 +508,11 @@
                 return -ENOMEM;
         exec_command_append_list(s->exec_command+SERVICE_EXEC_STOP, c);
 
-        if (!(c = exec_command_new(s->sysv_path, "reload")))
-                return -ENOMEM;
-        exec_command_append_list(s->exec_command+SERVICE_EXEC_RELOAD, c);
+        if (supports_reload) {
+                if (!(c = exec_command_new(s->sysv_path, "reload")))
+                        return -ENOMEM;
+                exec_command_append_list(s->exec_command+SERVICE_EXEC_RELOAD, c);
+        }
 
         return 0;
 }
@@ -524,10 +526,12 @@
                 NORMAL,
                 DESCRIPTION,
                 LSB,
-                LSB_DESCRIPTION
+                LSB_DESCRIPTION,
+                USAGE_CONTINUATION
         } state = NORMAL;
         char *short_description = NULL, *long_description = NULL, *chkconfig_description = NULL, *description;
         struct stat st;
+        bool supports_reload = false;
 
         assert(s);
         assert(path);
@@ -574,8 +578,29 @@
                 line++;
 
                 t = strstrip(l);
-                if (*t != '#')
+                if (*t != '#') {
+                        /* Try to figure out whether this init script supports
+                         * the reload operation. This heuristic looks for
+                         * "Usage: " lines which include the reload option. */
+                        if ( state == USAGE_CONTINUATION ||
+                            (state == NORMAL && strcasestr(t, "usage"))) {
+                                if (strcasestr(t, "{reload|") ||
+                                    strcasestr(t, "{reload}") ||
+                                    strcasestr(t, "{reload\"") ||
+                                    strcasestr(t, "|reload|") ||
+                                    strcasestr(t, "|reload}") ||
+                                    strcasestr(t, "|reload\"")) {
+                                        supports_reload = true;
+                                        state = NORMAL;
+                                } else if (t[strlen(t)-1] == '\\') {
+                                    state = USAGE_CONTINUATION;
+                                } else {
+                                    state = NORMAL;
+                                }
+                        }
+
                         continue;
+                }
 
                 if (state == NORMAL && streq(t, "### BEGIN INIT INFO")) {
                         state = LSB;
@@ -868,7 +893,7 @@
                 }
         }
 
-        if ((r = sysv_exec_commands(s)) < 0)
+        if ((r = sysv_exec_commands(s, supports_reload)) < 0)
                 goto finish;
         if (s->sysv_runlevels &&
             chars_intersect(RUNLEVELS_BOOT, s->sysv_runlevels) &&
-- 
Best regards,
Michael

Reply via email to