Author: dchagin
Date: Sun May 24 17:46:04 2015
New Revision: 283473
URL: https://svnweb.freebsd.org/changeset/base/283473

Log:
  Add support for /proc/<pid>/auxv.

Modified:
  head/sys/compat/linprocfs/linprocfs.c

Modified: head/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- head/sys/compat/linprocfs/linprocfs.c       Sun May 24 17:44:42 2015        
(r283472)
+++ head/sys/compat/linprocfs/linprocfs.c       Sun May 24 17:46:04 2015        
(r283473)
@@ -1386,6 +1386,52 @@ linprocfs_douuid(PFS_FILL_ARGS)
        return(0);
 }
 
+/*
+ * Filler function for proc/pid/auxv
+ */
+static int
+linprocfs_doauxv(PFS_FILL_ARGS)
+{
+       struct sbuf *asb;
+       off_t buflen, resid;
+       int error;
+
+       /*
+        * Mimic linux behavior and pass only processes with usermode
+        * address space as valid. Return zero silently otherwise.
+        */
+       if (p->p_vmspace == &vmspace0)
+               return (0);
+
+       if (uio->uio_resid == 0)
+               return (0);
+       if (uio->uio_offset < 0 || uio->uio_resid < 0)
+               return (EINVAL);
+
+       asb = sbuf_new_auto();
+       if (asb == NULL)
+               return (ENOMEM);
+       error = proc_getauxv(td, p, asb);
+       if (error == 0)
+               error = sbuf_finish(asb);
+
+       resid = sbuf_len(asb) - uio->uio_offset;
+       if (resid > uio->uio_resid)
+               buflen = uio->uio_resid;
+       else
+               buflen = resid;
+       if (buflen > IOSIZE_MAX)
+               return (EINVAL);
+       if (buflen > MAXPHYS)
+               buflen = MAXPHYS;
+       if (resid <= 0)
+               return (0);
+
+       if (error == 0)
+               error = uiomove(sbuf_data(asb) + uio->uio_offset, buflen, uio);
+       sbuf_delete(asb);
+       return (error);
+}
 
 /*
  * Constructor
@@ -1461,6 +1507,8 @@ linprocfs_init(PFS_INIT_ARGS)
            NULL, NULL, NULL, PFS_RD);
        pfs_create_link(dir, "fd", &linprocfs_dofdescfs,
            NULL, NULL, NULL, 0);
+       pfs_create_file(dir, "auxv", &linprocfs_doauxv,
+           NULL, &procfs_candebug, NULL, PFS_RD|PFS_RAWRD);
 
        /* /proc/scsi/... */
        dir = pfs_create_dir(root, "scsi", NULL, NULL, NULL, 0);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to