[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