135 lines
3.8 KiB
Text
135 lines
3.8 KiB
Text
$NetBSD: patch-ah,v 1.4 2009/08/11 20:53:06 apb Exp $
|
|
|
|
--- dialects/n+obsd/dproc.c.orig 2005-05-11 14:54:00.000000000 +0200
|
|
+++ dialects/n+obsd/dproc.c
|
|
@@ -37,6 +37,33 @@ static char *rcsid = "$Id: dproc.c,v 1.1
|
|
|
|
#include "lsof.h"
|
|
|
|
+#if __NetBSD_Version__ >= 499006200
|
|
+ /*
|
|
+ * In NetBSD-4.99.62, struct fdfile was added, struct filedesc::fd_ofiles
|
|
+ * changed type from struct file ** to struct fdfile **, and
|
|
+ * fd_ofileflags disappeared from struct filedesc, being
|
|
+ * replaced by fields in struct fdfile.
|
|
+ */
|
|
+# define HAVE_STRUCT_FDFILE 1
|
|
+# define FILESTRUCT struct fdfile
|
|
+#else
|
|
+# undef HAVE_STRUCT_FDFILE
|
|
+# define FILESTRUCT struct file
|
|
+#endif
|
|
+#if __NetBSD_Version__ >= 599001400
|
|
+ /*
|
|
+ * Between NetBSD-5.99.13 and 5.99.14, struct fdtab was added, and
|
|
+ * struct filedesc::fd_ofiles and fd_nfiles were replaced by
|
|
+ * struct filedesc::fd_dt (a pointer to struct fdtab).
|
|
+ */
|
|
+# define HAVE_STRUCT_FDTAB 1
|
|
+# define NFILES(fd,dt) ((dt).dt_nfiles)
|
|
+# define OFILES(fd,dt) ((dt).dt_ff)
|
|
+#else
|
|
+# undef HAVE_STRUCT_FDTAB
|
|
+# define NFILES(fd,dt) ((fd).fd_nfiles)
|
|
+# define OFILES(fd,dt) ((fd).fd_ofiles)
|
|
+#endif
|
|
|
|
_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
|
|
_PROTOTYPE(static void get_kernel_access,(void));
|
|
@@ -152,7 +179,7 @@ gather_proc_info()
|
|
struct filedesc fd;
|
|
int i, nf;
|
|
MALLOC_S nb;
|
|
- static struct file **ofb = NULL;
|
|
+ static FILESTRUCT **ofb = NULL;
|
|
static int ofbb = 0;
|
|
short pss, sf;
|
|
int px;
|
|
@@ -179,6 +206,10 @@ gather_proc_info()
|
|
struct kinfo_proc *p;
|
|
#endif /* defined(HASKVMGETPROC2) */
|
|
|
|
+#if HAVE_STRUCT_FDTAB
|
|
+ struct fdtab dt;
|
|
+#endif /* HAVE_STRUCT_FDTAB */
|
|
+
|
|
/*
|
|
* Read the process table.
|
|
*/
|
|
@@ -218,7 +249,14 @@ gather_proc_info()
|
|
if (!p->P_FD
|
|
|| kread((KA_T)p->P_FD, (char *)&fd, sizeof(fd)))
|
|
continue;
|
|
- if (!fd.fd_refcnt || fd.fd_lastfile > fd.fd_nfiles)
|
|
+ if (!fd.fd_refcnt)
|
|
+ continue;
|
|
+#if HAVE_STRUCT_FDTAB
|
|
+ if (!fd.fd_dt
|
|
+ || kread((KA_T)fd.fd_dt, (char *)&dt, sizeof(dt)))
|
|
+ continue;
|
|
+#endif /* ! HAVE_STRUCT_FDTAB */
|
|
+ if (fd.fd_lastfile > NFILES(fd,dt))
|
|
continue;
|
|
|
|
#if defined(HASCWDINFO)
|
|
@@ -278,14 +316,14 @@ gather_proc_info()
|
|
/*
|
|
* Read open file structure pointers.
|
|
*/
|
|
- if (!fd.fd_ofiles || (nf = fd.fd_nfiles) <= 0)
|
|
+ if (!OFILES(fd,dt) || (nf = NFILES(fd,dt)) <= 0)
|
|
continue;
|
|
- nb = (MALLOC_S)(sizeof(struct file *) * nf);
|
|
+ nb = (MALLOC_S)(sizeof(FILESTRUCT *) * nf);
|
|
if (nb > ofbb) {
|
|
if (!ofb)
|
|
- ofb = (struct file **)malloc(nb);
|
|
+ ofb = (FILESTRUCT **)malloc(nb);
|
|
else
|
|
- ofb = (struct file **)realloc((MALLOC_P *)ofb, nb);
|
|
+ ofb = (FILESTRUCT **)realloc((MALLOC_P *)ofb, nb);
|
|
if (!ofb) {
|
|
(void) fprintf(stderr, "%s: PID %d, no file * space\n",
|
|
Pn, p->P_PID);
|
|
@@ -293,7 +331,7 @@ gather_proc_info()
|
|
}
|
|
ofbb = nb;
|
|
}
|
|
- if (kread((KA_T)fd.fd_ofiles, (char *)ofb, nb))
|
|
+ if (kread((KA_T)OFILES(fd,dt), (char *)ofb, nb))
|
|
continue;
|
|
|
|
#if defined(HASFSTRUCT)
|
|
@@ -311,8 +349,10 @@ gather_proc_info()
|
|
}
|
|
pofb = nb;
|
|
}
|
|
+#if ! HAVE_STRUCT_FDFILE
|
|
if (!fd.fd_ofileflags || kread((KA_T)fd.fd_ofileflags, pof, nb))
|
|
zeromem(pof, nb);
|
|
+#endif /* ! HAVE_STRUCT_FDFILE */
|
|
}
|
|
#endif /* defined(HASFSTRUCT) */
|
|
|
|
@@ -321,8 +361,20 @@ gather_proc_info()
|
|
*/
|
|
for (i = 0; i < nf; i++) {
|
|
if (ofb[i]) {
|
|
+#if HAVE_STRUCT_FDFILE
|
|
+ struct fdfile fdf;
|
|
+ if (kread((KA_T)ofb[i], (char *)&fdf, sizeof(fdf)))
|
|
+ continue;
|
|
+ Cfp = fdf.ff_file;
|
|
+ if (Cfp == NULL)
|
|
+ continue;
|
|
+ if (pof)
|
|
+ pof[i] = fdf.ff_exclose;
|
|
+#else /* ! HAVE_STRUCT_FDFILE */
|
|
+ Cfp = ofb[i];
|
|
+#endif /* ! HAVE_STRUCT_FDFILE */
|
|
alloc_lfile(NULL, i);
|
|
- process_file((KA_T)(Cfp = ofb[i]));
|
|
+ process_file((KA_T)Cfp);
|
|
if (Lf->sf) {
|
|
|
|
#if defined(HASFSTRUCT)
|