rpms/sysvinit/devel sysvinit-2.87-pidof.patch, NONE, 1.1 sysvinit.spec, 1.75, 1.76 sysvinit-2.86-pidof.patch, 1.1, NONE

Bill Nottingham notting at fedoraproject.org
Mon Jul 27 18:19:10 UTC 2009


Author: notting

Update of /cvs/extras/rpms/sysvinit/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv20991

Modified Files:
	sysvinit.spec 
Added Files:
	sysvinit-2.87-pidof.patch 
Removed Files:
	sysvinit-2.86-pidof.patch 
Log Message:
Rediff.


sysvinit-2.87-pidof.patch:
 killall5.c |   30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

--- NEW FILE sysvinit-2.87-pidof.patch ---
diff -up sysvinit-2.87dsf/src/killall5.c.pidof sysvinit-2.87dsf/src/killall5.c
--- sysvinit-2.87dsf/src/killall5.c.pidof	2009-07-12 10:59:06.000000000 -0400
+++ sysvinit-2.87dsf/src/killall5.c	2009-07-27 14:10:02.000000000 -0400
@@ -54,9 +54,8 @@ typedef struct proc {
 	char *argv0base;	/* `basename argv[1]`		  */
 	char *argv1;		/* Name as found out from argv[1] */
 	char *argv1base;	/* `basename argv[1]`		  */
+	char *pathname;		/* full path to executable	  */
 	char *statname;		/* the statname without braces    */
-	ino_t ino;		/* Inode number			  */
-	dev_t dev;		/* Device it is on		  */
 	pid_t pid;		/* Process ID.			  */
 	int sid;		/* Session ID.			  */
 	int kernel;		/* Kernel thread or zombie.	  */
@@ -176,7 +175,6 @@ int readproc(int do_stat)
 	FILE		*fp;
 	PROC		*p, *n;
 	struct dirent	*d;
-	struct stat	st;
 	char		path[256];
 	char		buf[256];
 	char		*s, *q;
@@ -199,6 +197,8 @@ int readproc(int do_stat)
 		n = p->next;
 		if (p->argv0) free(p->argv0);
 		if (p->argv1) free(p->argv1);
+		if (p->pathname) free(p->pathname);
+		if (p->statname) free(p->statname);
 		free(p);
 	}
 	plist = NULL;
@@ -256,6 +256,7 @@ int readproc(int do_stat)
 				p->sid = 0;
 				nsyslog(LOG_ERR, "can't read sid from %s\n",
 					path);
+				if (p->statname) free(p->statname);
 				free(p);
 				continue;
 			}
@@ -308,15 +309,19 @@ int readproc(int do_stat)
 
 		} else {
 			/* Process disappeared.. */
+			if (p->statname) free(p->statname);
 			free(p);
 			continue;
 		}
 
 		/* Try to stat the executable. */
 		snprintf(path, sizeof(path), "/proc/%s/exe", d->d_name);
-		if (do_stat && stat(path, &st) == 0) {
-			p->dev = st.st_dev;
-			p->ino = st.st_ino;
+		p->pathname = (char *)xmalloc(PATH_MAX);
+		memset(p->pathname,'\0',PATH_MAX);
+		if (readlink(path, p->pathname, PATH_MAX) == -1) {
+			p->pathname = NULL;
+		} else {
+			p->pathname[PATH_MAX-1] = '\0';
 		}
 
 		/* Link it into the list. */
@@ -380,7 +385,7 @@ PIDQ_HEAD *pidof(char *prog)
 {
 	PROC		*p;
 	PIDQ_HEAD	*q;
-	struct stat	st;
+	char		*real_path;
 	char		*s;
 	int		dostat = 0;
 	int		foundone = 0;
@@ -402,13 +406,13 @@ PIDQ_HEAD *pidof(char *prog)
 	q = init_pid_q(q);
 
 	/* Try to stat the executable. */
-	if (prog[0] == '/' && stat(prog, &st) == 0)
+	if (prog[0] == '/' && (real_path = canonicalize_file_name(prog)))
 		dostat++;
 
-	/* First try to find a match based on dev/ino pair. */
+	/* First try to find a match based on pathname. */
 	if (dostat) {
 		for (p = plist; p; p = p->next) {
-			if (p->dev == st.st_dev && p->ino == st.st_ino) {
+			if (p->pathname && strcmp(real_path, p->pathname) == 0) {
 				add_pid_to_q(q, p);
 				foundone++;
 			}
@@ -439,6 +443,9 @@ PIDQ_HEAD *pidof(char *prog)
 			|| (p->argv0 && s != prog && strcmp(p->argv0, s) == 0)
 			|| (p->argv0base && strcmp(p->argv0base, prog) == 0);
 
+		if (prog[0] == '/' && p->pathname && strcmp(prog, p->pathname))
+			ok = 0;
+
 		/* For scripts, compare argv[1] as well. */
 		if (
 			scripts_too && p->statname && p->argv1base
@@ -447,7 +454,7 @@ PIDQ_HEAD *pidof(char *prog)
 			ok |=
 				(p->argv1 && strcmp(p->argv1, prog) == 0)
 				|| (p->argv1 && s != prog && strcmp(p->argv1, s) == 0)
-				|| (p->argv1base && strcmp(p->argv1base, prog) == 0);
+				|| ((prog[0] != '/') && p->argv1base && strcmp(p->argv1base, prog) == 0);
 		}
 
 		/*


Index: sysvinit.spec
===================================================================
RCS file: /cvs/extras/rpms/sysvinit/devel/sysvinit.spec,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -p -r1.75 -r1.76
--- sysvinit.spec	27 Jul 2009 18:00:26 -0000	1.75
+++ sysvinit.spec	27 Jul 2009 18:19:09 -0000	1.76
@@ -12,7 +12,7 @@ Patch3: sysvinit-2.86-loginshell.patch
 Patch4: sysvinit-2.86-inittab.patch
 Patch5: sysvinit-2.86-single.patch
 Patch6: sysvinit-2.86-quiet.patch
-Patch10: sysvinit-2.86-pidof.patch
+Patch10: sysvinit-2.87-pidof.patch
 Patch11: sysvinit-2.86-pidof-man.patch
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Requires: pam >= 0.66-5


--- sysvinit-2.86-pidof.patch DELETED ---




More information about the fedora-extras-commits mailing list