[sysvinit/f14/master] Add a new option to pidof for use in solving #632321.
Bill Nottingham
notting at fedoraproject.org
Thu Sep 9 21:15:21 UTC 2010
commit 2f923574c50b0337376dd9ccd256e66a026e8402
Author: Bill Nottingham <notting at redhat.com>
Date: Thu Sep 9 17:13:43 2010 -0400
Add a new option to pidof for use in solving #632321.
sysvinit-2.87-omit.patch | 179 ++++++++++++++++++++++++++++++++++++++++++++++
sysvinit.spec | 8 ++-
2 files changed, 186 insertions(+), 1 deletions(-)
---
diff --git a/sysvinit-2.87-omit.patch b/sysvinit-2.87-omit.patch
new file mode 100644
index 0000000..f76fcf8
--- /dev/null
+++ b/sysvinit-2.87-omit.patch
@@ -0,0 +1,179 @@
+diff -up sysvinit-2.87dsf/man/pidof.8.omit sysvinit-2.87dsf/man/pidof.8
+--- sysvinit-2.87dsf/man/pidof.8.omit 2010-09-09 17:08:32.000000000 -0400
++++ sysvinit-2.87dsf/man/pidof.8 2010-09-09 17:10:36.262473016 -0400
+@@ -6,6 +6,7 @@ pidof -- find the process ID of a runnin
+ .RB [ \-s ]
+ .RB [ \-c ]
+ .RB [ \-x ]
++.RB [ \-m ]
+ .RB [ \-o
+ .IR omitpid ]
+ .RB [ \-o
+@@ -36,6 +37,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 -up sysvinit-2.87dsf/src/killall5.c.omit sysvinit-2.87dsf/src/killall5.c
+--- sysvinit-2.87dsf/src/killall5.c.omit 2010-09-09 17:08:32.713473016 -0400
++++ sysvinit-2.87dsf/src/killall5.c 2010-09-09 17:08:32.785473016 -0400
+@@ -44,6 +44,7 @@
+
+ char *Version = "@(#)killall5 2.86 31-Jul-2004 miquels at cistron.nl";
+
++#define OMITSZ 16
+ #define STATNAMELEN 15
+ #define DO_STAT 1
+ #define NO_STAT 0
+@@ -77,6 +78,8 @@ typedef struct {
+
+ /* List of processes. */
+ PROC *plist;
++PROC olist[OMITSZ];
++pid_t opid[OMITSZ];
+
+ /* Did we stop all processes ? */
+ int sent_sigstop;
+@@ -328,6 +331,12 @@ int readproc(int do_stat)
+ p->next = plist;
+ plist = p;
+ p->pid = pid;
++ /* Could be smarter, but it's a small list. */
++ for (f = 0 ; f < OMITSZ ; f++) {
++ if (opid[f] == p->pid) {
++ olist[f] = *p;
++ }
++ }
+ }
+ closedir(dir);
+
+@@ -474,6 +483,15 @@ PIDQ_HEAD *pidof(char *prog)
+ return q;
+ }
+
++int matches(PROC *o, PROC *p)
++{
++ if ((o->argv0 && p->argv0 && !strcmp(o->argv0,p->argv0)) &&
++ (o->argv1 && p->argv1 && !strcmp(canonicalize_file_name(o->argv1),canonicalize_file_name(p->argv1)))) {
++ return 1;
++ }
++ return 0;
++}
++
+ /* Give usage message and exit. */
+ void usage(void)
+ {
+@@ -505,8 +523,7 @@ void nsyslog(int pri, char *fmt, ...)
+
+ #define PIDOF_SINGLE 0x01
+ #define PIDOF_OMIT 0x02
+-
+-#define PIDOF_OMITSZ 5
++#define PIDOF_OMIT_OMIT_MATCHES 0x04
+
+ /*
+ * Pidof functionality.
+@@ -515,7 +532,7 @@ int main_pidof(int argc, char **argv)
+ {
+ PIDQ_HEAD *q;
+ PROC *p;
+- pid_t opid[PIDOF_OMITSZ], spid;
++ pid_t spid;
+ int f;
+ int first = 1;
+ int i, oind, opt, flags = 0;
+@@ -523,11 +540,11 @@ int main_pidof(int argc, char **argv)
+ struct stat st;
+ char tmp[512];
+
+- for (oind = PIDOF_OMITSZ-1; oind > 0; oind--)
++ for (oind = OMITSZ-1; oind > 0; oind--)
+ opid[oind] = 0;
+ opterr = 0;
+
+- while ((opt = getopt(argc,argv,"hco:sx")) != EOF) switch (opt) {
++ while ((opt = getopt(argc,argv,"hcmo:sx")) != EOF) switch (opt) {
+ case '?':
+ nsyslog(LOG_ERR,"invalid options on command line!\n");
+ closelog();
+@@ -536,9 +553,9 @@ int main_pidof(int argc, char **argv)
+ if (geteuid() == 0) chroot_check = 1;
+ break;
+ case 'o':
+- if (oind >= PIDOF_OMITSZ -1) {
++ if (oind >= OMITSZ -1) {
+ nsyslog(LOG_ERR,"omit pid buffer size %d "
+- "exceeded!\n", PIDOF_OMITSZ);
++ "exceeded!\n", OMITSZ);
+ closelog();
+ exit(1);
+ }
+@@ -560,6 +577,9 @@ int main_pidof(int argc, char **argv)
+ case 'x':
+ scripts_too++;
+ break;
++ case 'm':
++ flags |= PIDOF_OMIT_OMIT_MATCHES;
++ break;
+ default:
+ /* Nothing */
+ break;
+@@ -584,9 +604,13 @@ int main_pidof(int argc, char **argv)
+ spid = 0;
+ while ((p = get_next_from_pid_q(q))) {
+ if (flags & PIDOF_OMIT) {
+- for (i = 0; i < oind; i++)
++ for (i = 0; i < oind && opid[i] ; i++) {
+ if (opid[i] == p->pid)
+ break;
++ if (flags & PIDOF_OMIT_OMIT_MATCHES)
++ if (matches(&olist[i], p))
++ break;
++ }
+ /*
+ * On a match, continue with
+ * the for loop above.
+@@ -625,14 +649,12 @@ int main_pidof(int argc, char **argv)
+
+
+
+-#define KILLALL_OMITSZ 16
+
+ /* Main for either killall or pidof. */
+ int main(int argc, char **argv)
+ {
+ PROC *p;
+ int pid, sid = -1;
+- pid_t opid[KILLALL_OMITSZ];
+ int i, oind, omit = 0;
+ int sig = SIGKILL;
+
+@@ -653,7 +675,7 @@ int main(int argc, char **argv)
+ return main_pidof(argc, argv);
+
+ /* Right, so we are "killall". */
+- for (oind = KILLALL_OMITSZ-1; oind > 0; oind--)
++ for (oind = OMITSZ-1; oind > 0; oind--)
+ opid[oind] = 0;
+
+ if (argc > 1) {
+@@ -661,10 +683,10 @@ int main(int argc, char **argv)
+ if (argv[i][0] == '-') (argv[i])++;
+ if (argv[i][0] == 'o') {
+ if (++i >= argc) usage();
+- if (oind >= KILLALL_OMITSZ -1) {
++ if (oind >= OMITSZ -1) {
+ nsyslog(LOG_ERR,"omit pid buffer size "
+ "%d exceeded!\n",
+- KILLALL_OMITSZ);
++ OMITSZ);
+ closelog();
+ exit(1);
+ }
diff --git a/sysvinit.spec b/sysvinit.spec
index 798b5bc..2c3642c 100644
--- a/sysvinit.spec
+++ b/sysvinit.spec
@@ -1,7 +1,7 @@
Summary: Programs which control basic system processes
Name: sysvinit
Version: 2.87
-Release: 4.dsf%{?dist}
+Release: 5.dsf%{?dist}
License: GPLv2+
Group: System Environment/Base
Source: http://download.savannah.gnu.org/releases/sysvinit/sysvinit-%{version}dsf.tar.gz
@@ -17,6 +17,7 @@ Patch11: sysvinit-2.86-pidof-man.patch
Patch12: sysvinit-2.87-sulogin.patch
Patch13: sysvinit-2.87-wide.patch
Patch14: sysvinit-2.87-ipv6.patch
+Patch15: sysvinit-2.87-omit.patch
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Requires: pam >= 0.66-5
Requires: filesystem >= 2.2.4-1
@@ -67,6 +68,8 @@ management.
%patch13 -p1 -b .wide
# Change accepted ipv6 addresses (#573346)
%patch14 -p1 -b .ipv6
+# Add option to pidof to exclude similar processes to omitted processes (#632321)
+%patch15 -p1 -b .omit
%build
make %{?_smp_mflags} CC="%{__cc}" CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE" LDFLAGS="" LCRYPT="-lcrypt" -C src
@@ -139,6 +142,9 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man8/sulogin*
%changelog
+* Thu Sep 09 2010 Bill Nottingham <notting at redhat.com> 2.87-5.dsf
+- Add -m option to pidof to omit processes that match existing omitted pids (#632321)
+
* Tue Apr 06 2010 Petr Lautrbach <plautrba at redhat.com> 2.87-4.dsf
- Changed IPv4 vs IPv6 heuristic in last command (#573346)
More information about the scm-commits
mailing list