Date: Wed, 11 Jun 2008 13:18:54 GMT From: Ighighi <ighighi@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/124487: Extending the PROCFS (/proc) filesystem: patch + rationale Message-ID: <200806111318.m5BDIsn7039150@www.freebsd.org> Resent-Message-ID: <200806111320.m5BDK8U2039720@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 124487 >Category: kern >Synopsis: Extending the PROCFS (/proc) filesystem: patch + rationale >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Jun 11 13:20:08 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Ighighi >Release: 6.3-STABLE >Organization: >Environment: FreeBSD 6.3-STABLE #0: Wed Jun 4 15:18:20 VET 2008i >Description: (This is something I've been running successfully since 2006 with FreeBSD 6.2-PRERELEASE (RELENG_6) but kept to myself out of fear that purists will feel offended ;) This patch extends the FreeBSD /proc filesystem (procfs) by adding support for some entries that are present on other systems: Linux, Solaris and even NetBSD (/proc/self & /proc/<pid>/exe) The entries in question are: /proc/self -- Pointer to /proc/<pid> (FreeBSD uses /proc/curproc) /proc/<pid>/exe -- FreeBSD uses /proc/<pid>/file /proc/<pid>/cwd -- Pointer to the current working directory. /proc/<pid>/root -- Pointer to the root directory. I think it's convenient to add those because a lot of software originally developed in the above systems above will integrate more easily, including software in ports as you will see: >How-To-Repeat: I did a strings-scan on /usr/local that yielded the following (edited): /usr/local/bin/upx: /proc/self/exe /usr/local/bin/gdf: /proc/self /usr/local/bin/gcp: /proc/self /usr/local/bin/gchgrp: /proc/self /usr/local/bin/gmv: /proc/self /usr/local/bin/pterm: /proc/self/exe /usr/local/bin/putty: /proc/self/exe /usr/local/bin/puttytel: /proc/self/exe /usr/local/bin/goldfind: /proc/self /usr/local/bin/gfind: /proc/self /usr/local/bin/gchown: /proc/self /usr/local/bin/gchmod: /proc/self /usr/local/bin/ginstall: /proc/self /usr/local/bin/grm: /proc/self /usr/local/bin/gdu: /proc/self /usr/local/bin/supertux: /proc/self/exe /usr/local/bin/supertux: Couldn't read /proc/self/exe, using default path: /usr/local/share/supertux /usr/local/bin/gtar: /proc/self /usr/local/Adobe/Acrobat7.0/ENU/Reader/intellinux/lib/librt3d.so: /proc/self/exe /usr/local/intel_cc_80/bin/icpi: /proc/self/exe /usr/local/intel_cc_80/bin/icpi: A/proc/self/cwd The above files were installed by the following ports: /usr/local/bin/upx: upx-3.02 /usr/local/bin/gdf: coreutils-6.9_2 /usr/local/bin/gcp: coreutils-6.9_2 /usr/local/bin/gchgrp: coreutils-6.9_2 /usr/local/bin/gmv: coreutils-6.9_2 /usr/local/bin/pterm: putty-0.60 /usr/local/bin/putty: putty-0.60 /usr/local/bin/puttytel: putty-0.60 /usr/local/bin/goldfind: findutils-4.4.0_1 /usr/local/bin/gfind: findutils-4.4.0_1 /usr/local/bin/gchown: coreutils-6.9_2 /usr/local/bin/gchmod: coreutils-6.9_2 /usr/local/bin/ginstall: coreutils-6.9_2 /usr/local/bin/grm: coreutils-6.9_2 /usr/local/bin/gdu: coreutils-6.9_2 /usr/local/bin/supertux: supertux-0.1.3_3 /usr/local/bin/supertux: supertux-0.1.3_3 /usr/local/bin/gtar: gtar-1.20 /usr/local/Adobe/Acrobat7.0/ENU/Reader/intellinux/lib/librt3d.so: acroread7-7.0.9_3,1 /usr/local/intel_cc_80/bin/icpi: icc-8.1.038_1 /usr/local/intel_cc_80/bin/icpi: icc-8.1.038_1 >Fix: The attached patch is against -CURRENT. The patch to RELENG_6 is available to anyone on demand. This patch is a trivial one... /proc/self & /proc/<pid>/exe exist in FreeBSD but with different names. The code for /proc/<pid>/cwd & /proc/<pid>/root was copied verbatim from src/sys/compat/linprocfs/linprocfs.c,v 1.119 2008/03/31 12:01:18 kib. Patch attached with submission follows: # # (!c) 2006-2008 by Ighighi # # This patch extends the FreeBSD /proc filesystem (procfs) by adding # support for some entries that are present on other systems: Linux, # Solaris and even NetBSD: /proc/self & /proc/<pid>/exe # # Currently, these entries are: # + /proc/self -- Pointer to /proc/<pid> (FreeBSD uses /proc/curproc) # + /proc/<pid>/exe -- FreeBSD uses /proc/<pid>/file # + /proc/<pid>/cwd -- Pointer to the current working directory. # + /proc/<pid>/root -- Pointer to the root directory. # # Notes: # + /proc/self & /proc/<pid>/exe exist in FreeBSD but with different names. # # + The code for /proc/<pid>/cwd & /proc/<pid>/root was copied verbatim from # src/sys/compat/linprocfs/linprocfs.c,v 1.119 2008/03/31 12:01:18 kib. # # + As you can see, there's no new code so this patch is a trivial one. # # To apply this patch, run: # patch -d /usr < /path/to/procfs.patch # # Rebuild the kernel if PSEUDOFS was compiled statically (as is the case # with GENERIC). If compiled as a module, unmount every procfs/linprocfs # filesystems and unload all kernel modules that depend on procfs(5) and # linprocfs(5): # /sbin/umount -v -a -t linprocfs,procfs # /sbin/kldunload -v linprocfs # /sbin/kldunload -v procfs # # To install the module, run: # cd /usr/src/sys/modules/procfs # make clean && make && make install # At this stage you may either reboot the system or resume operation with: # /sbin/mount -v -a -t linprocfs,procfs # --- src/sys/fs/procfs/procfs.c.orig 2008-01-13 10:14:05.000000000 -0430 +++ src/sys/fs/procfs/procfs.c 2008-06-11 06:15:40.840606357 -0430 @@ -61,6 +61,45 @@ #include <fs/pseudofs/pseudofs.h> #include <fs/procfs/procfs.h> +#include <sys/filedesc.h> +#include <sys/jail.h> + +/* + * 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 */ @@ -161,6 +200,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); @@ -193,6 +234,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); } --- src/sys/fs/procfs/procfs.h.orig 2005-01-06 14:10:40.000000000 -0400 +++ src/sys/fs/procfs/procfs.h 2008-06-11 06:13:52.896643927 -0430 @@ -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_doproccmdline(PFS_FILL_ARGS); int procfs_doprocctl(PFS_FILL_ARGS); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200806111318.m5BDIsn7039150>