From 4eeac1c26065d78a0c52c9764777094f3d8ab30d Mon Sep 17 00:00:00 2001 From: CyberLeo Date: Mon, 20 Dec 2010 11:24:34 -0600 Subject: [PATCH] [CDN-Patch] sys/fs/procfs: extend procfs to support proc/self, proc/pid/cwd, proc/pid/exe --- sys/fs/procfs/procfs.c | 47 ++++++++++++++++++++++++++++++++++++++++++ sys/fs/procfs/procfs.h | 2 ++ 2 files changed, 49 insertions(+) diff --git a/sys/fs/procfs/procfs.c b/sys/fs/procfs/procfs.c index 8b69eb1a..a0bf3567 100644 --- a/sys/fs/procfs/procfs.c +++ b/sys/fs/procfs/procfs.c @@ -60,6 +60,44 @@ #include #include +#include +#include + +/* + * Filler function for proc/pid/cwd + * Copied verbatim from src/sys/compat/linprocfs/linprocfs.c,v 1.119 + */ +int +procfs_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 + * Copied verbatim from src/sys/compat/linprocfs/linprocfs.c,v 1.119 + */ +int +procfs_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/self @@ -158,6 +196,8 @@ procfs_init(PFS_INIT_ARGS) pfs_create_link(root, "curproc", procfs_docurproc, NULL, NULL, NULL, 0); + pfs_create_link(root, "self", procfs_docurproc, + NULL, NULL, NULL, 0); dir = pfs_create_dir(root, "pid", procfs_attr, NULL, NULL, PFS_PROCDEP); @@ -192,6 +232,13 @@ procfs_init(PFS_INIT_ARGS) pfs_create_link(dir, "file", procfs_doprocfile, NULL, procfs_notsystem, NULL, 0); + pfs_create_link(dir, "exe", procfs_doprocfile, + NULL, procfs_notsystem, NULL, 0); + + pfs_create_link(dir, "cwd", &procfs_doproccwd, + NULL, NULL, NULL, 0); + pfs_create_link(dir, "root", &procfs_doprocroot, + NULL, NULL, NULL, 0); return (0); } diff --git a/sys/fs/procfs/procfs.h b/sys/fs/procfs/procfs.h index 25982245..b90e4152 100644 --- a/sys/fs/procfs/procfs.h +++ b/sys/fs/procfs/procfs.h @@ -38,6 +38,8 @@ #ifdef _KERNEL +int procfs_doproccwd(PFS_FILL_ARGS); +int procfs_doprocroot(PFS_FILL_ARGS); int procfs_docurproc(PFS_FILL_ARGS); int procfs_doosrel(PFS_FILL_ARGS); int procfs_doproccmdline(PFS_FILL_ARGS); -- 2.45.0