fix invalid options while invoking reboot on lsb image
cover fix invalid options while invoking reboot on lsb image
Invoke reboot is not easy to trace the result, invoke status also could verify this issue.
Test Case:
*On host: build core-image-lsb
*On target:
~# . /etc/init.d/functions
~# status sshd
sshd (pid 670) is running...
//Hongxu
The following changes since commit 3dee534f1e25109e0bdb681de0746c336f4b8840:
lib/oeqa: fix dependecy check (2013-07-16 10:04:17 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib hongxu/fix-pidof
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=hongxu/fix-pidof
Hongxu Jia (2):
sysvinit: pidof add -m option for lsbinitscripts
lsbinitscripts: remove x permission on functions
.../sysvinit-2.88dsf/pidof-add-m-option.patch | 189 +++++++++++++++++++++ meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb | 1 + meta/recipes-extended/lsb/lsbinitscripts_9.48.bb | 2 +- 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 meta/recipes-core/sysvinit/sysvinit-2.88dsf/pidof-add-m-option.patch
Signature · 1 line
1.8.1.2
PATCH 1/2 sysvinit: pidof add -m option for lsbinitscripts
When reboot the system on lsb image, some kill processes would print the following message:
...
pidof: invalid options on command line!
...
The killproc in lsbinitscripts invokes pidof with option -m, but the pidof in sysvinit package doesn't support this.
Backport from fedora to add -m option on pidof could fix this issue.
[YOCTO #4896]
--- .../sysvinit-2.88dsf/pidof-add-m-option.patch | 189 +++++++++++++++++++++ meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb | 1 + 2 files changed, 190 insertions(+) create mode 100644 meta/recipes-core/sysvinit/sysvinit-2.88dsf/pidof-add-m-option.patch
meta/recipes-core/sysvinit/sysvinit-2.88dsf/pidof-add-m-option.patch new file +189 -0
@@ -0,0 +1,189 @@ +pidof: add -m option + +When used with -o, will also omit any processes that have the same +argv[0] and argv[1] as any explicitly omitted process ids. This can be +used to avoid multiple shell scripts concurrently calling pidof returning +each other's pids. + +https://bugzilla.redhat.com/show_bug.cgi?id=883856 + +Upstream-Status: backport +Imported patch from: https://bugzilla.redhat.com/attachment.cgi?id=658166 + +Signed-off-by: Hongxu Jia <[email protected]> +--- + man/pidof.8 | 6 ++++++ + src/killall5.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 65 insertions(+), 3 deletions(-) + +diff --git a/man/pidof.8 b/man/pidof.8 +--- a/man/pidof.8 ++++ b/man/pidof.8 +@@ -24,6 +24,7 @@ pidof -- find the process ID of a running program. + .RB [ \-c ] + .RB [ \-n ] + .RB [ \-x ] ++.RB [ \-m ] + .RB [ \-o + .IR omitpid[,omitpid..] ] + .RB [ \-o +@@ -63,6 +64,11 @@ shells running the named scripts. + Tells \fIpidof\fP to omit processes with that process id. The special + pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP + program, in other words the calling shell or shell script. ++.IP -m ++When used with -o, will also omit any processes that have the same ++argv[0] and argv[1] as any explicitly omitted process ids. This can be ++used to avoid multiple shell scripts concurrently calling pidof returning ++each other's pids. + .SH "EXIT STATUS" + .TP + .B 0 +diff --git a/src/killall5.c b/src/killall5.c +index 5937d98..e73885e 100644 +--- a/src/killall5.c ++++ b/src/killall5.c +@@ -118,6 +118,7 @@ typedef struct _s_nfs + + /* List of processes. */ + PROC *plist; ++PROC *olist; + + /* List of processes to omit. */ + OMIT *omit; +@@ -345,6 +346,20 @@ static void clear_mnt(void) + } + } + ++static void clear_omit(void) ++{ ++ OMIT *o; ++ PROC *p; ++ for (o = omit; o; o = omit) { ++ omit = omit->next; ++ free(o); ++ } ++ for (p = olist; p; p = olist) { ++ olist = olist->next; ++ free(p); ++ } ++} ++ + /* + * Check if path is ia shadow off a NFS partition. + */ +@@ -452,6 +467,7 @@ int readproc(int do_stat) + DIR *dir; + FILE *fp; + PROC *p, *n; ++ OMIT *o, *m; + struct dirent *d; + struct stat st; + char path[PATH_MAX+1]; +@@ -624,6 +640,17 @@ int readproc(int do_stat) + p->next = plist; + plist = p; + p->pid = pid; ++ /* Could be smarter, but it's a small list. */ ++ m = omit; ++ for (o = omit; m; o = m) { ++ m = o->next; ++ if (o->pid == p->pid) { ++ n = (PROC*)xmalloc(sizeof(PROC)); ++ *n = *p; ++ n->next = olist; ++ olist = n; ++ } ++ } + } + closedir(dir); + +@@ -813,6 +840,26 @@ PIDQ_HEAD *pidof(char *prog) + return q; + } + ++int matches(PROC *o, PROC *p) ++{ ++ int ret = 0; ++ char *oargv1, *pargv1; ++ if ((o->argv0 && p->argv0 && !strcmp(o->argv0,p->argv0))) { ++ if (o->argv1 && p->argv1) { ++ if ((oargv1 = canonicalize_file_name(o->argv1)) == NULL) ++ oargv1 = strdup(o->argv1); ++ if ((pargv1 = canonicalize_file_name(p->argv1)) == NULL) ++ pargv1 = strdup(p->argv1); ++ if (! strcmp(oargv1, pargv1)) { ++ ret = 1; ++ } ++ free(oargv1); ++ free(pargv1); ++ } ++ } ++ return ret; ++} ++ + /* Give usage message and exit. */ + void usage(void) + { +@@ -845,6 +892,7 @@ void nsyslog(int pri, char *fmt, ...) + #define PIDOF_SINGLE 0x01 + #define PIDOF_OMIT 0x02 + #define PIDOF_NETFS 0x04 ++#define PIDOF_OMIT_OMIT_MATCHES 0x08 + + /* + * Pidof functionality. +@@ -861,6 +909,7 @@ int main_pidof(int argc, char **argv) + struct stat st; + char tmp[512]; + ++ olist = (PROC*)0; + omit = (OMIT*)0; + nlist = (NFS*)0; + opterr = 0; +@@ -868,7 +917,7 @@ int main_pidof(int argc, char **argv) + if ((token = getenv("PIDOF_NETFS")) && (strcmp(token,"no") != 0)) + flags |= PIDOF_NETFS; + +- while ((opt = getopt(argc,argv,"hco:sxn")) != EOF) switch (opt) { ++ while ((opt = getopt(argc,argv,"hcmo:sxn")) != EOF) switch (opt) { + case '?': + nsyslog(LOG_ERR,"invalid options on command line!\n"); + closelog(); +@@ -907,6 +956,9 @@ int main_pidof(int argc, char **argv) + case 'x': + scripts_too++; + break; ++ case 'm': ++ flags |= PIDOF_OMIT_OMIT_MATCHES; ++ break; + case 'n': + flags |= PIDOF_NETFS; + break; +@@ -938,10 +990,13 @@ int main_pidof(int argc, char **argv) + pid_t spid = 0; + while ((p = get_next_from_pid_q(q))) { + if ((flags & PIDOF_OMIT) && omit) { +- OMIT * optr; +- for (optr = omit; optr; optr = optr->next) { ++ PROC * optr; ++ for (optr = olist; optr; optr = optr->next) { + if (optr->pid == p->pid) + break; ++ if (flags & PIDOF_OMIT_OMIT_MATCHES) ++ if (matches(optr, p)) ++ break; + } + + /* +@@ -977,6 +1032,7 @@ int main_pidof(int argc, char **argv) + if (!first) + printf("\n"); + ++ clear_omit(); + clear_mnt(); + + closelog(); +-- +1.8.1.2 +
meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb +1 -0
@@ -12,6 +12,7 @@ RDEPENDS_${PN} = "${PN}-inittab" SRC_URI = "http://download.savannah.gnu.org/releases-noredirect/sysvinit/sysvinit-${PV}.tar.bz2 \ file://install.patch \ file://crypt-lib.patch \ + file://pidof-add-m-option.patch \ file://need \ file://provide \ file://rcS-default \
Signature · 1 line
1.8.1.2
PATCH 2/2 lsbinitscripts: remove x permission on functions
In reply to Hongxu JiaIt doesn't need to set x permission for this file
--- meta/recipes-extended/lsb/lsbinitscripts_9.48.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
meta/recipes-extended/lsb/lsbinitscripts_9.48.bb +1 -1
@@ -26,5 +26,5 @@ do_compile[noexec] = "1" do_install(){ install -d ${D}${sysconfdir}/init.d/ - install -m 0755 ${S}/rc.d/init.d/functions ${D}${sysconfdir}/init.d/functions + install -m 0644 ${S}/rc.d/init.d/functions ${D}${sysconfdir}/init.d/functions }
Signature · 1 line
1.8.1.2