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@
This commit is contained in:
Ed Schouten 2010-03-07 10:43:45 +00:00
parent 11a06432c3
commit ec492b4973
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=204825

View File

@ -1244,6 +1244,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
*/
@ -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);