svn commit: r204825 - head/sys/compat/linprocfs
Ed Schouten
ed at FreeBSD.org
Sun Mar 7 10:43:46 UTC 2010
Author: ed
Date: Sun Mar 7 10:43:45 2010
New Revision: 204825
URL: http://svn.freebsd.org/changeset/base/204825
Log:
Make /proc/self/fd `work'.
On Linux, /proc/<pid>/fd is comparable to fdescfs, where it allows you
to inspect the file descriptors used by each process. Glibc's ttyname()
works by performing a readlink() on these nodes, since all nodes in this
directory are symlinks.
It is a bit hard to implement this in linprocfs right now, so I am not
going to bother. Add a way to make ttyname(3) work, by adding a
/proc/<pid>/fd symlink, which points to /dev/fd only if the calling
process matches. When fdescfs is mounted, this will cause the
readlink() in ttyname() to fail, causing it to fall back on manually
finding a matching node in /dev.
Discussed on: emulation@
Modified:
head/sys/compat/linprocfs/linprocfs.c
Modified: head/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- head/sys/compat/linprocfs/linprocfs.c Sun Mar 7 10:08:00 2010 (r204824)
+++ head/sys/compat/linprocfs/linprocfs.c Sun Mar 7 10:43:45 2010 (r204825)
@@ -1245,6 +1245,20 @@ linprocfs_domodules(PFS_FILL_ARGS)
#endif
/*
+ * Filler function for proc/pid/fd
+ */
+static int
+linprocfs_dofdescfs(PFS_FILL_ARGS)
+{
+
+ if (p == curproc)
+ sbuf_printf(sb, "/dev/fd");
+ else
+ sbuf_printf(sb, "unknown");
+ return (0);
+}
+
+/*
* Constructor
*/
static int
@@ -1312,6 +1326,8 @@ linprocfs_init(PFS_INIT_ARGS)
NULL, NULL, NULL, PFS_RD);
pfs_create_file(dir, "status", &linprocfs_doprocstatus,
NULL, NULL, NULL, PFS_RD);
+ pfs_create_link(dir, "fd", &linprocfs_dofdescfs,
+ NULL, NULL, NULL, 0);
/* /proc/scsi/... */
dir = pfs_create_dir(root, "scsi", NULL, NULL, NULL, 0);
More information about the svn-src-head
mailing list