summaryrefslogtreecommitdiff
path: root/dialects/darwin/kmem/dfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'dialects/darwin/kmem/dfile.c')
-rw-r--r--dialects/darwin/kmem/dfile.c390
1 files changed, 390 insertions, 0 deletions
diff --git a/dialects/darwin/kmem/dfile.c b/dialects/darwin/kmem/dfile.c
new file mode 100644
index 0000000..e1b23a7
--- /dev/null
+++ b/dialects/darwin/kmem/dfile.c
@@ -0,0 +1,390 @@
+/*
+ * dfile.c - Darwin file processing functions for /dev/kmem-based lsof
+ */
+
+
+/*
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907. All rights reserved.
+ *
+ * Written by Victor A. Abell
+ *
+ * This software is not subject to any license of the American Telephone
+ * and Telegraph Company or the Regents of the University of California.
+ *
+ * Permission is granted to anyone to use this software for any purpose on
+ * any computer system, and to alter it and redistribute it freely, subject
+ * to the following restrictions:
+ *
+ * 1. Neither the authors nor Purdue University are responsible for any
+ * consequences of the use of this software.
+ *
+ * 2. The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission. Credit to the authors and Purdue
+ * University must appear in documentation and sources.
+ *
+ * 3. Altered versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 4. This notice may not be removed or altered.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id$";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if DARWINV>=800
+#define file fileglob
+#define f_flag fg_flag
+#define f_type fg_type
+#define f_count fg_count
+#define f_ops fg_ops
+#define f_offset fg_offset
+#define f_data fg_data
+#endif /* DARWINV>=800 */
+
+#if defined(HASPSXSEM)
+#define PSEMNAMLEN 31 /* from kern/posix_sem.c */
+#endif /* defined(HASPSXSEM) */
+
+#if defined(HASPSXSHM)
+#define PSHMNAMLEN 31 /* from kern/posix_shm.c */
+#endif /* defined(HASPSXSHM) */
+
+
+/*
+ * Local structure definitions
+ */
+
+#if defined(HASPSXSEM)
+struct pseminfo { /* from kern/posix_sem.c */
+ unsigned int psem_flags;
+ unsigned int psem_usecount;
+ mode_t psem_mode;
+ uid_t psem_uid;
+ gid_t psem_gid;
+ char psem_name[PSEMNAMLEN + 1];
+ void *psem_semobject;
+ struct proc *sem_proc;
+};
+
+struct psemnode {
+ struct pseminfo *pinfo;
+};
+#endif /* defined(HASPSXSEM) */
+
+#if defined(HASPSXSHM) /* from kern/posix_shm.c */
+struct pshminfo {
+ unsigned int pshm_flags;
+ unsigned int pshm_usecount;
+ off_t pshm_length;
+ mode_t pshm_mode;
+ uid_t pshm_uid;
+ gid_t pshm_gid;
+ char pshm_name[PSHMNAMLEN + 1];
+ void *pshm_memobject;
+};
+
+struct pshmnode {
+ off_t mapp_addr;
+
+# if DARWINV<800
+ size_t map_size;
+# else /* DARWINV>=800 */
+ user_size_t map_size;
+# endif /* DARWINV>=800 */
+
+ struct pshminfo *pinfo;
+};
+#endif /* defined(HASPSXSHM) */
+
+
+#if DARWINV>=800
+/*
+ * print_v_path() - print vnode's path
+ */
+
+int
+print_v_path(lf)
+ struct lfile *lf;
+{
+ if (lf->V_path) {
+ safestrprt(lf->V_path, stdout, 0);
+ return(1);
+ }
+ return(0);
+}
+#endif /* DARWINV>=800 */
+
+
+#if defined(HASKQUEUE)
+/*
+ * process_kqueue() -- process kqueue file
+ */
+
+void
+process_kqueue(ka)
+ KA_T ka; /* kqueue file structure address */
+{
+ struct kqueue kq; /* kqueue structure */
+
+ (void) snpf(Lf->type, sizeof(Lf->type), "KQUEUE");
+ enter_dev_ch(print_kptr(ka, (char *)NULL, 0));
+ if (!ka || kread(ka, (char *)&kq, sizeof(kq)))
+ return;
+ (void) snpf(Namech, Namechl, "count=%d, state=%#x", kq.kq_count,
+ kq.kq_state);
+ enter_nm(Namech);
+}
+#endif /* defined(HASKQUEUE) */
+
+
+#if DARWINV>=800
+/*
+ * process_pipe() - process a file structure whose type is DTYPE_PIPE
+ */
+
+void
+process_pipe(pa)
+ KA_T pa; /* pipe structure address */
+{
+ (void) snpf(Lf->type, sizeof(Lf->type), "PIPE");
+ enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+ Namech[0] = '\0';
+}
+#endif /* DARWINV>=800 */
+
+
+#if defined(HASPSXSEM)
+/*
+ * process_psxsem() -- process POSIX semaphore file
+ */
+
+void
+process_psxsem(pa)
+ KA_T pa; /* psxsem file structure address */
+{
+ struct pseminfo pi;
+ struct psemnode pn;
+
+ (void) snpf(Lf->type, sizeof(Lf->type), "PSXSEM");
+ enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+ if (!Fsize)
+ Lf->off_def = 1;
+ if (pa && !kread(pa, (char *)&pn, sizeof(pn))) {
+ if (pn.pinfo && !kread((KA_T)pn.pinfo, (char *)&pi, sizeof(pi))) {
+ if (pi.psem_name[0]) {
+ pi.psem_name[PSEMNAMLEN] = '\0';
+ (void) snpf(Namech, Namechl, "%s", pi.psem_name);
+ enter_nm(Namech);
+ }
+ }
+ }
+}
+#endif /* defined(HASPSXSEM) */
+
+
+#if defined(HASPSXSHM)
+/*
+ * process_psxshm() -- process POSIX shared memory file
+ */
+
+void
+process_psxshm(pa)
+ KA_T pa; /* psxshm file structure address */
+{
+ struct pshminfo pi;
+ struct pshmnode pn;
+ int pns = 0;
+
+ (void) snpf(Lf->type, sizeof(Lf->type), "PSXSHM");
+ enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+ if (pa && !kread(pa, (char *)&pn, sizeof(pn))) {
+ pns = 1;
+ if (pn.pinfo && !kread((KA_T)pn.pinfo, (char *)&pi, sizeof(pi))) {
+ if (pi.pshm_name[0]) {
+ pi.pshm_name[PSEMNAMLEN] = '\0';
+ (void) snpf(Namech, Namechl, "%s", pi.pshm_name);
+ enter_nm(Namech);
+ } else if (pi.pshm_memobject) {
+ (void) snpf(Namech, Namechl, "obj=%s",
+ print_kptr((KA_T)pi.pshm_memobject, (char *)NULL, 0));
+ enter_nm(Namech);
+ }
+ }
+ }
+ if (Foffset)
+ Lf->off_def = 1;
+ else if (pns) {
+ Lf->sz = (SZOFFTYPE)pn.map_size;
+ Lf->sz_def = 1;
+ }
+}
+#endif /* defined(HASPSXSHM) */
+
+
+/*
+ * process_file() - process file
+ */
+
+/*
+ * The caller may define:
+ *
+ * FILEPTR as the name of the location to store a pointer
+ * to the current file struct -- e.g.,
+ *
+ * struct file *foobar;
+ * #define FILEPTR foobar
+ */
+
+void
+process_file(fp)
+ KA_T fp; /* kernel file structure address */
+{
+
+#if DARWINV<800
+ struct file f;
+#else /* DARWINV>=800 */
+ struct fileglob f;
+ struct fileproc fileproc;
+#endif /* DARWINV>=800 */
+
+ int flag;
+
+#if defined(FILEPTR)
+/*
+ * Save file structure address for process_node().
+ */
+ FILEPTR = &f;
+#endif /* defined(FILEPTR) */
+
+/*
+ * Read file structure.
+ */
+
+#if DARWINV<800
+ if (kread((KA_T)fp, (char *)&f, sizeof(f))) {
+ (void) snpf(Namech, Namechl, "can't read file struct from %s",
+ print_kptr(fp, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+#else /* DARWINV>=800 */
+ if (kread((KA_T)fp, (char *)&fileproc, sizeof(fileproc))) {
+ (void) snpf(Namech, Namechl, "can't read fileproc struct from %s",
+ print_kptr(fp, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+ if (kread((KA_T)fileproc.f_fglob, (char *)&f, sizeof(f))) {
+ (void) snpf(Namech, Namechl, "can't read fileglob struct from %s",
+ print_kptr((KA_T)fileproc.f_fglob, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+#endif /* DARWINV>=800 */
+
+ Lf->off = (SZOFFTYPE)f.f_offset;
+ if (f.f_count) {
+
+ /*
+ * Construct access code.
+ */
+ if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+ Lf->access = 'r';
+ else if (flag == FWRITE)
+ Lf->access = 'w';
+ else if (flag == (FREAD | FWRITE))
+ Lf->access = 'u';
+
+#if defined(HASFSTRUCT)
+ /*
+ * Save file structure values.
+ */
+ if (Fsv & FSV_CT) {
+ Lf->fct = (long)f.f_count;
+ Lf->fsv |= FSV_CT;
+ }
+ if (Fsv & FSV_FA) {
+ Lf->fsa = fp;
+ Lf->fsv |= FSV_FA;
+ }
+ if (Fsv & FSV_FG) {
+ Lf->ffg = (long)f.f_flag;
+ Lf->fsv |= FSV_FG;
+ }
+ if (Fsv & FSV_NI) {
+ Lf->fna = (KA_T)f.f_data;
+ Lf->fsv |= FSV_NI;
+ }
+#endif /* defined(HASFSTRUCT) */
+
+ /*
+ * Process structure by its type.
+ */
+ switch (f.f_type) {
+
+
+#if defined(DTYPE_PIPE)
+ case DTYPE_PIPE:
+# if defined(HASPIPEFN)
+ if (!Selinet)
+ HASPIPEFN((KA_T)f.f_data);
+# endif /* defined(HASPIPEFN) */
+ return;
+#endif /* defined(DTYPE_PIPE) */
+
+ case DTYPE_VNODE:
+ if (!Selinet)
+ process_node((KA_T)f.f_data);
+ return;
+ case DTYPE_SOCKET:
+ process_socket((KA_T)f.f_data);
+ return;
+
+#if defined(HASKQUEUE)
+ case DTYPE_KQUEUE:
+ process_kqueue((KA_T)f.f_data);
+ return;
+#endif /* defined(HASKQUEUE) */
+
+#if defined(HASPSXSEM)
+ case DTYPE_PSXSEM:
+ process_psxsem((KA_T)f.f_data);
+ return;
+#endif /* defined(HASPSXSEM) */
+
+#if defined(HASPSXSHM)
+ case DTYPE_PSXSHM:
+ process_psxshm((KA_T)f.f_data);
+ return;
+#endif /* defined(HASPSXSHM) */
+
+#if defined(HASPRIVFILETYPE)
+ case PRIVFILETYPE:
+ HASPRIVFILETYPE((KA_T)f.f_data);
+ return;
+#endif /* defined(HASPRIVFILETYPE) */
+
+ default:
+ if (f.f_type || f.f_ops) {
+ (void) snpf(Namech, Namechl,
+ "%s file struct, ty=%#x, op=%p",
+ print_kptr(fp, (char *)NULL, 0), f.f_type, f.f_ops);
+ enter_nm(Namech);
+ return;
+ }
+ }
+ }
+ enter_nm("no more information");
+}