Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Mar 2010 10:43:45 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r204825 - head/sys/compat/linprocfs
Message-ID:  <201003071043.o27Ahjtn023635@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003071043.o27Ahjtn023635>