rpms/lsof/devel lsof_4.81-threads.patch, NONE, 1.1 .cvsignore, 1.14, 1.15 lsof.spec, 1.42, 1.43 sources, 1.15, 1.16 upstream2downstream.sh, 1.2, 1.3 lsof_4.80-threads.patch, 1.1, NONE

Karel Zak kzak at fedoraproject.org
Tue Dec 2 12:17:15 UTC 2008


Author: kzak

Update of /cvs/pkgs/rpms/lsof/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv5591

Modified Files:
	.cvsignore lsof.spec sources upstream2downstream.sh 
Added Files:
	lsof_4.81-threads.patch 
Removed Files:
	lsof_4.80-threads.patch 
Log Message:
* Tue Dec  2 2008 Karel Zak <kzak at redhat.com> 4.81-1
- upgrade to 4.81
  - lsof_4.80-threads.patch - rebased


lsof_4.81-threads.patch:

--- NEW FILE lsof_4.81-threads.patch ---
diff -up lsof_4.81-rh/dialects/linux/dproc.c.kzak lsof_4.81-rh/dialects/linux/dproc.c
--- lsof_4.81-rh/dialects/linux/dproc.c.kzak	2008-10-21 18:17:25.000000000 +0200
+++ lsof_4.81-rh/dialects/linux/dproc.c	2008-12-02 10:54:54.000000000 +0100
@@ -89,7 +89,8 @@ _PROTOTYPE(static void process_proc_map,
 _PROTOTYPE(static int process_id,(char *idp, int idpl, char *cmd, UID_ARG uid,
 				  int pid, int ppid, int pgid));
 _PROTOTYPE(static int statEx,(char *p, struct stat *s, int *ss));
- 
+_PROTOTYPE(static int get_other_thread,(int pid, char **tid));
+
 
 #if	defined(HASSELINUX)
 _PROTOTYPE(static int cmp_cntx_eq,(char *pcntx, char *ucntx));
@@ -159,6 +160,7 @@ gather_proc_info()
 	struct dirent *dp;
 	struct stat sb;
 	int lwp, n, nl, pgid, pid, ppid, rv, tx;
+	char *tid = NULL;
 	static char *lwppath = (char *)NULL;
 	static int lwppathl = 0;
 	static char *path = (char *)NULL;
@@ -252,6 +254,13 @@ gather_proc_info()
 	while ((dp = readdir(ps))) {
 	    if (nm2id(dp->d_name, &pid, &n))
 		continue;
+
+	    tid = NULL;
+	    if (get_other_thread(pid, &tid) < 0)
+		continue;
+	    if (tid)
+		n += sizeof("task/") + strlen(tid);
+
 	/*
 	 * Build path to PID's directory.
 	 */
@@ -265,7 +274,14 @@ gather_proc_info()
 		    Exit(1);
 		}
 	    }
-	    (void) snpf(pidpath + pidx, pidpathl - pidx, "%s/", dp->d_name);
+	    if (tid) {
+		/* /proc/<pid> is useless (zombie), we have to use /proc/<pid>/task/<tid>
+		 * where is still running thread
+		 */
+		(void) snpf(pidpath + pidx, pidpathl - pidx, "%s/task/%s/", dp->d_name, tid);
+		free(tid);
+	    } else
+		(void) snpf(pidpath + pidx, pidpathl - pidx, "%s/", dp->d_name);
 	    n += (pidx + 1);
 	/*
 	 * Process the PID's stat info.
@@ -1007,6 +1023,64 @@ process_id(idp, idpl, cmd, uid, pid, ppi
 	return(0);
 }
 
+/* fill tid if the initial thread is zombie,
+ * but other thread still alive
+ *
+ * returns -1=error, 0=nothing, 1=ok
+ */
+static int
+get_other_thread(pid, tid)
+	int pid;
+	char **tid;
+{
+	char path[MAXPATHLEN];
+	DIR *tdp;
+	struct dirent *td;
+	char pstate;
+	FILE *f;
+	int _pid;
+	int re = 0, x;
+
+	snpf(path, sizeof(path), "%s/%d/stat", PROCFS, pid);
+	if (!(f = fopen(path, "r")))
+		return -1;
+	x = fscanf(f, "%d %*s %c", &_pid, &pstate);
+	fclose(f);
+	if (x!=2)
+		return -1;
+	if (_pid != pid)
+		return -1;		/* corrupted /proc? */
+	if (pstate!='Z')
+		return 0;		/* ignore normal proceses */
+
+	snpf(path, sizeof(path), "%s/%d/task", PROCFS, pid);
+
+	/* open /proc/<pid>/task */
+	if (!(tdp = opendir(path)))
+		return 0;		/* kernel < 2.6.x */
+
+	/* look for first alive thread */
+	while ((td = readdir(tdp))) {
+		if (strcmp(td->d_name, ".")==0 || strcmp(td->d_name, "..")==0)
+			continue;
+
+		/* /proc/<pid>/task/<tid>/stat */
+		snpf(path, sizeof(path), "%s/%d/task/%s/stat", PROCFS, pid, td->d_name);
+		if (!(f = fopen(path, "r")))
+			continue;
+		x = fscanf(f, "%*d %*s %c", &pstate);
+		fclose(f);
+		if (x!=1)
+			continue;
+		if (pstate!='Z') {
+			re = 1;
+			*tid = strdup(td->d_name);
+			break;
+		}
+	}
+	closedir(tdp);
+	return re;
+}
 
 /*
  * process_proc_map() - process the memory map of a process
@@ -1250,12 +1324,6 @@ read_id_stat(ty, p, id, cmd, ppid, pgid)
 	    return(1);
 	}
 /*
- * Convert the first field to an integer; its conversion must match the
- * ID argument.
- */
-	if (!fp[0] || (atoi(fp[0]) != id))
-	    return(1);
-/*
  * Get the command name from the second field.  Strip a starting '(' and
  * an ending ')'.  Allocate space to hold the result and return the space
  * pointer.


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/lsof/devel/.cvsignore,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- .cvsignore	19 May 2008 23:50:03 -0000	1.14
+++ .cvsignore	2 Dec 2008 12:16:44 -0000	1.15
@@ -1 +1 @@
-lsof_4.80-rh.tar.bz2
+lsof_4.81-rh.tar.bz2


Index: lsof.spec
===================================================================
RCS file: /cvs/pkgs/rpms/lsof/devel/lsof.spec,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- lsof.spec	7 Aug 2008 17:50:34 -0000	1.42
+++ lsof.spec	2 Dec 2008 12:16:44 -0000	1.43
@@ -1,7 +1,7 @@
 Summary: A utility which lists open files on a Linux/UNIX system
 Name: lsof
-Version: 4.80
-Release: 2%{?dist}
+Version: 4.81
+Release: 1%{?dist}
 License: zlib
 Group: Development/Debuggers
 
@@ -11,7 +11,7 @@
 # The script you can found in CVS or download from:
 # http://cvs.fedoraproject.org/viewcvs/rpms/lsof/devel/upstream2downstream.sh
 #
-%define lsofrh lsof_4.80-rh
+%define lsofrh lsof_4.81-rh
 Source0: %{lsofrh}.tar.bz2
 URL: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
 
@@ -19,7 +19,8 @@
 
 BuildRequires: libselinux-devel
 
-Patch1: lsof_4.80-threads.patch
+# 184338 - allow lsof access nptl threads
+Patch1: lsof_4.81-threads.patch
 
 %description
 Lsof stands for LiSt Open Files, and it does just that: it lists
@@ -28,7 +29,6 @@
 
 %prep
 %setup -q -n %{lsofrh}
-# 184338 - allow lsof access nptl threads
 %patch1 -p1
 
 %build
@@ -53,6 +53,10 @@
 %{_mandir}/man*/*
 
 %changelog
+* Tue Dec  2 2008 Karel Zak <kzak at redhat.com> 4.81-1
+- upgrade to 4.81
+  - lsof_4.80-threads.patch - rebased
+
 * Thu Aug  7 2008 Tom "spot" Callaway <tcallawa at redhat.com> 4.80-2
 - fix license tag
 


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/lsof/devel/sources,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- sources	19 May 2008 23:50:03 -0000	1.15
+++ sources	2 Dec 2008 12:16:44 -0000	1.16
@@ -1 +1 @@
-f5db1a8e2cb8337ed043ca68178955e6  lsof_4.80-rh.tar.bz2
+b5ef18418760dd304b223a4acb3e14d7  lsof_4.81-rh.tar.bz2


Index: upstream2downstream.sh
===================================================================
RCS file: /cvs/pkgs/rpms/lsof/devel/upstream2downstream.sh,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- upstream2downstream.sh	19 May 2008 23:50:03 -0000	1.2
+++ upstream2downstream.sh	2 Dec 2008 12:16:44 -0000	1.3
@@ -1,8 +1,8 @@
 #!/bin/bash
 #
-# This script removes non-linux dialects from upstream source package before release.
-# There is a problem with copyrights for some UN*Xes ... also .. this script merges all
-# to the one normal tarball and rename all to lsof_X.XX-rh.
+# This script removes non-linux dialects from upstream source package before
+# release.  There is a problem with copyrights for some UN*Xes ... also .. this
+# script merges all to the one normal tarball and rename all to lsof_X.XX-rh.
 #
 # Usage:  ./upstream2downstream  <usptream-tarball>
 #


--- lsof_4.80-threads.patch DELETED ---




More information about the fedora-extras-commits mailing list