From: Stefan Schantl Date: Fri, 2 Mar 2012 15:23:56 +0000 (+0100) Subject: lsof: Update to 4.85. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b050c7744e69e025eb7c4820e8d43b24613254b;p=ipfire-3.x.git lsof: Update to 4.85. --- diff --git a/lsof/lsof.nm b/lsof/lsof.nm index 356e418c2..b10421cbf 100644 --- a/lsof/lsof.nm +++ b/lsof/lsof.nm @@ -4,8 +4,8 @@ ############################################################################### name = lsof -version = 4.82 -release = 3 +version = 4.85 +release = 1 groups = Development/Debuggers url = ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ diff --git a/lsof/patches/lsof_4.81-threads.patch b/lsof/patches/lsof_4.81-threads.patch deleted file mode 100644 index 399819fdd..000000000 --- a/lsof/patches/lsof_4.81-threads.patch +++ /dev/null @@ -1,129 +0,0 @@ -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/ is useless (zombie), we have to use /proc//task/ -+ * 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//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//task//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.