tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: procfs files vs symlink
On Fri, 14 Jan 2022, Robert Elz wrote:
If your patch makes any difference to the way ls /proc/self/fd
works, that is just a fluke (relates to the way ls happens to
sequence its operations) and in no way any kind of general fix.
It does not, and wasn't meant to. I noticed that d_type was being
set to VREG and attached a patch for that to my reply.
If procfs is not setting d_type correctly, that should be fixed.
I think this does it:
---START---
--- sys/miscfs/procfs/procfs_vnops.c.orig 2022-01-12 03:57:25.944841288 +0000
+++ sys/miscfs/procfs/procfs_vnops.c 2022-01-14 06:12:33.154215255 +0000
@@ -162,12 +162,12 @@
{ DT_DIR, N("fd"), PFSfd, NULL },
{ DT_DIR, N("task"), PFStask, procfs_validfile_linux },
{ DT_LNK, N("cwd"), PFScwd, NULL },
- { DT_LNK, N("emul"), PFSemul, NULL },
+ { DT_REG, N("emul"), PFSemul, NULL },
{ DT_LNK, N("root"), PFSchroot, NULL },
{ DT_REG, N("auxv"), PFSauxv, procfs_validauxv },
{ DT_REG, N("cmdline"), PFScmdline, NULL },
{ DT_REG, N("environ"), PFSenviron, NULL },
- { DT_REG, N("exe"), PFSexe, procfs_validfile },
+ { DT_LNK, N("exe"), PFSexe, procfs_validfile },
{ DT_REG, N("file"), PFSfile, procfs_validfile },
{ DT_REG, N("fpregs"), PFSfpregs, procfs_validfpregs },
{ DT_REG, N("limit"), PFSlimit, NULL },
@@ -223,6 +223,7 @@
int procfs_pathconf(void *);
int procfs_getpages(void *);
+static uint8_t fttodt(file_t *fp);
static int atoi(const char *, size_t);
/*
@@ -1410,7 +1411,7 @@
d.d_fileno = PROCFS_FILENO(pfs->pfs_pid, PFSfd, i - 2);
d.d_namlen = snprintf(d.d_name, sizeof(d.d_name),
"%lld", (long long)(i - 2));
- d.d_type = VREG;
+ d.d_type = fttodt(fp);
if ((error = uiomove(&d, UIO_MX, uio)) != 0)
break;
if (cookies)
@@ -1731,6 +1732,34 @@
return (EFAULT);
}
+/**
+ * convert DTYPE_XXX to corresponding DT_XXX
+ * matching what procfs_loadvnode() does.
+ */
+static uint8_t
+fttodt(file_t *fp)
+{
+ switch (fp->f_type) {
+ case DTYPE_VNODE:
+ switch (fp->f_vnode->v_type) {
+ case VREG: return DT_REG;
+ case VDIR: return DT_LNK; /* symlink */
+ case VBLK: return DT_BLK;
+ case VCHR: return DT_CHR;
+ case VLNK: return DT_LNK;
+ case VSOCK: return DT_SOCK;
+ case VFIFO: return DT_FIFO;
+ default: return DT_UNKNOWN;
+ }
+ case DTYPE_PIPE: return DT_FIFO;
+ case DTYPE_SOCKET: return DT_SOCK;
+ case DTYPE_KQUEUE: /*FALLTHROUGH*/
+ case DTYPE_MISC: /*FALLTHROUGH*/
+ case DTYPE_SEM: return DT_LNK; /* symlinks */
+ default: return DT_UNKNOWN;
+ }
+}
+
/*
* convert decimal ascii to int
*/
---END---
Thx,
-RVP
Home |
Main Index |
Thread Index |
Old Index