summaryrefslogtreecommitdiffstats
path: root/sys/compat/linprocfs
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2003-09-09 08:19:06 +0000
committerdes <des@FreeBSD.org>2003-09-09 08:19:06 +0000
commitea3cbbe49dfe5db0dc5fe3e71fcd3cf404fd5abc (patch)
treee6d7ff33ab2cba1934a7cf4f693fce742df508c8 /sys/compat/linprocfs
parent778353602fcfa91d957aaec62efedcf71fbb9f77 (diff)
downloadFreeBSD-src-ea3cbbe49dfe5db0dc5fe3e71fcd3cf404fd5abc.zip
FreeBSD-src-ea3cbbe49dfe5db0dc5fe3e71fcd3cf404fd5abc.tar.gz
Add cwd, root and statm (modeled on a 2.4.20 kernel). De-obfuscate
linprocfs_init() a little and remove some gratuitous whitespace.
Diffstat (limited to 'sys/compat/linprocfs')
-rw-r--r--sys/compat/linprocfs/linprocfs.c113
1 files changed, 96 insertions, 17 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index 89d60cb..f0c34e1 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/blist.h>
#include <sys/conf.h>
#include <sys/exec.h>
+#include <sys/filedesc.h>
#include <sys/jail.h>
#include <sys/kernel.h>
#include <sys/linker.h>
@@ -547,6 +548,37 @@ linprocfs_doprocstat(PFS_FILL_ARGS)
}
/*
+ * Filler function for proc/pid/statm
+ */
+static int
+linprocfs_doprocstatm(PFS_FILL_ARGS)
+{
+ struct kinfo_proc kp;
+ segsz_t lsize;
+
+ PROC_LOCK(p);
+ fill_kinfo_proc(p, &kp);
+ PROC_UNLOCK(p);
+
+ /*
+ * See comments in linprocfs_doprocstatus() regarding the
+ * computation of lsize.
+ */
+ /* size resident share trs drs lrs dt */
+ sbuf_printf(sb, "%ju ", B2P((uintmax_t)kp.ki_size));
+ sbuf_printf(sb, "%ju ", (uintmax_t)kp.ki_rssize);
+ sbuf_printf(sb, "%ju ", (uintmax_t)0); /* XXX */
+ sbuf_printf(sb, "%ju ", (uintmax_t)kp.ki_tsize);
+ sbuf_printf(sb, "%ju ", (uintmax_t)(kp.ki_dsize + kp.ki_ssize));
+ lsize = B2P(kp.ki_size) - kp.ki_dsize -
+ kp.ki_ssize - kp.ki_tsize - 1;
+ sbuf_printf(sb, "%ju ", (uintmax_t)lsize);
+ sbuf_printf(sb, "%ju\n", (uintmax_t)0); /* XXX */
+
+ return (0);
+}
+
+/*
* Filler function for proc/pid/status
*/
static int
@@ -682,6 +714,41 @@ linprocfs_doprocstatus(PFS_FILL_ARGS)
return (0);
}
+
+/*
+ * Filler function for proc/pid/cwd
+ */
+static int
+linprocfs_doproccwd(PFS_FILL_ARGS)
+{
+ char *fullpath = "unknown";
+ char *freepath = NULL;
+
+ vn_fullpath(td, p->p_fd->fd_cdir, &fullpath, &freepath);
+ sbuf_printf(sb, "%s", fullpath);
+ if (freepath)
+ free(freepath, M_TEMP);
+ return (0);
+}
+
+/*
+ * Filler function for proc/pid/root
+ */
+static int
+linprocfs_doprocroot(PFS_FILL_ARGS)
+{
+ struct vnode *rvp;
+ char *fullpath = "unknown";
+ char *freepath = NULL;
+
+ rvp = jailed(p->p_ucred) ? p->p_fd->fd_jdir : p->p_fd->fd_rdir;
+ vn_fullpath(td, rvp, &fullpath, &freepath);
+ sbuf_printf(sb, "%s", fullpath);
+ if (freepath)
+ free(freepath, M_TEMP);
+ return (0);
+}
+
/*
* Filler function for proc/pid/cmdline
*/
@@ -835,47 +902,59 @@ linprocfs_init(PFS_INIT_ARGS)
root = pi->pi_root;
-#define PFS_CREATE_FILE(name) \
- pfs_create_file(root, #name, &linprocfs_do##name, NULL, NULL, PFS_RD)
- PFS_CREATE_FILE(cmdline);
- PFS_CREATE_FILE(cpuinfo);
+ /* /proc/* */
+ pfs_create_file(root, "cmdline", &linprocfs_docmdline,
+ NULL, NULL, PFS_RD);
+ pfs_create_file(root, "cpuinfo", &linprocfs_docpuinfo,
+ NULL, NULL, PFS_RD);
#if 0
- PFS_CREATE_FILE(devices);
+ pfs_create_file(root, "devices", &linprocfs_dodevices,
+ NULL, NULL, PFS_RD);
#endif
- PFS_CREATE_FILE(loadavg);
- PFS_CREATE_FILE(meminfo);
+ pfs_create_file(root, "loadavg", &linprocfs_doloadavg,
+ NULL, NULL, PFS_RD);
+ pfs_create_file(root, "meminfo", &linprocfs_domeminfo,
+ NULL, NULL, PFS_RD);
#if 0
- PFS_CREATE_FILE(modules);
+ pfs_create_file(root, "modules", &linprocfs_domodules,
+ NULL, NULL, PFS_RD);
#endif
- PFS_CREATE_FILE(mtab);
- PFS_CREATE_FILE(stat);
- PFS_CREATE_FILE(uptime);
- PFS_CREATE_FILE(version);
-#undef PFS_CREATE_FILE
+ pfs_create_file(root, "mtab", &linprocfs_domtab,
+ NULL, NULL, PFS_RD);
pfs_create_link(root, "self", &procfs_docurproc,
NULL, NULL, 0);
+ pfs_create_file(root, "stat", &linprocfs_dostat,
+ NULL, NULL, PFS_RD);
+ pfs_create_file(root, "uptime", &linprocfs_douptime,
+ NULL, NULL, PFS_RD);
+ pfs_create_file(root, "version", &linprocfs_doversion,
+ NULL, NULL, PFS_RD);
+ /* /proc/net/* */
dir = pfs_create_dir(root, "net", NULL, NULL, 0);
pfs_create_file(dir, "dev", &linprocfs_donetdev,
NULL, NULL, PFS_RD);
+ /* /proc/<pid>/* */
dir = pfs_create_dir(root, "pid", NULL, NULL, PFS_PROCDEP);
pfs_create_file(dir, "cmdline", &linprocfs_doproccmdline,
NULL, NULL, PFS_RD);
-
+ pfs_create_link(dir, "cwd", &linprocfs_doproccwd,
+ NULL, NULL, 0);
pfs_create_file(dir, "environ", &linprocfs_doprocenviron,
NULL, NULL, PFS_RD);
-
pfs_create_link(dir, "exe", &procfs_doprocfile,
NULL, &procfs_notsystem, 0);
-
pfs_create_file(dir, "maps", &linprocfs_doprocmaps,
NULL, NULL, PFS_RD);
-
pfs_create_file(dir, "mem", &procfs_doprocmem,
&procfs_attr, &procfs_candebug, PFS_RDWR|PFS_RAW);
+ pfs_create_link(dir, "root", &linprocfs_doprocroot,
+ NULL, NULL, 0);
pfs_create_file(dir, "stat", &linprocfs_doprocstat,
NULL, NULL, PFS_RD);
+ pfs_create_file(dir, "statm", &linprocfs_doprocstatm,
+ NULL, NULL, PFS_RD);
pfs_create_file(dir, "status", &linprocfs_doprocstatus,
NULL, NULL, PFS_RD);
OpenPOWER on IntegriCloud