Penviron,
Pmaps,
Pstatm,
+ Pmounts,
} pfstype;
/*
#endif
int linprocfs_domeminfo (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int linprocfs_docpuinfo (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
+int linprocfs_domounts (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int linprocfs_dostat (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int linprocfs_douptime (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
int linprocfs_doversion (struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio);
#include <sys/vnode.h>
#include <sys/lock.h>
#include <sys/sbuf.h>
+#include <sys/mount.h>
#include <vm/vm.h>
#include <vm/pmap.h>
return(count);
}
+static int
+linprocfs_domounts_callback(struct mount *mp, void *data)
+{
+ struct statfs *st;
+ struct sbuf *sb = (struct sbuf *)data;
+ char *to, *from, *fs;
+
+ st = &mp->mnt_stat;
+
+ from = st->f_mntfromname;
+ to = st->f_mntonname;
+ fs = st->f_fstypename;
+
+ if (!strcmp(st->f_fstypename, "linprocfs"))
+ fs = "proc";
+ else if (!strcmp(st->f_fstypename, "ext2fs"))
+ fs = "ext2";
+ else if (!strcmp(st->f_fstypename, "msdos"))
+ fs = "vfat";
+ else if (!strcmp(st->f_fstypename, "msdosfs"))
+ fs = "vfat";
+
+ sbuf_printf(sb, "%s %s %s %s", from, to, fs,
+ st->f_flags & MNT_RDONLY ? "ro" : "rw");
+
+#define OPT_ADD(name, flag) if (st->f_flags & (flag)) sbuf_printf(sb, "," name)
+ OPT_ADD("sync", MNT_SYNCHRONOUS);
+ OPT_ADD("noexec", MNT_NOEXEC);
+ OPT_ADD("nosuid", MNT_NOSUID);
+ OPT_ADD("nodev", MNT_NODEV);
+ OPT_ADD("async", MNT_ASYNC);
+ OPT_ADD("suiddir", MNT_SUIDDIR);
+ OPT_ADD("nosymfollow", MNT_NOSYMFOLLOW);
+ OPT_ADD("noatime", MNT_NOATIME);
+#undef OPT_ADD
+
+ sbuf_printf(sb, " 0 0\n");
+
+ return 0;
+}
+
+int
+linprocfs_domounts(struct proc *curp, struct proc *p, struct pfsnode *pfs,
+ struct uio *uio)
+{
+ struct sbuf *sb;
+ int error;
+
+ sb = sbuf_new_auto();
+
+ error = mountlist_scan(linprocfs_domounts_callback, sb, MNTSCAN_FORWARD);
+
+ sbuf_finish(sb);
+ if (error == 0)
+ error = uiomove_frombuf(sbuf_data(sb), sbuf_len(sb), uio);
+ sbuf_delete(sb);
+ return (error);
+}
+
int
linprocfs_dostat(struct proc *curp, struct proc *p, struct pfsnode *pfs,
struct uio *uio)
case Pmeminfo:
case Pcpuinfo:
+ case Pmounts:
case Pstat:
case Puptime:
case Pversion:
error = linprocfs_allocvp(dvp->v_mount, vpp, 0, Pcpuinfo);
goto out;
}
+ if (CNEQ(cnp, "mounts", 6)) {
+ error = linprocfs_allocvp(dvp->v_mount, vpp, 0, Pmounts);
+ goto out;
+ }
if (CNEQ(cnp, "stat", 4)) {
error = linprocfs_allocvp(dvp->v_mount, vpp, 0, Pstat);
goto out;
info.uio = uio;
info.cred = ap->a_cred;
- while (info.pcnt < 11) {
+ while (info.pcnt < 12) {
res = linprocfs_readdir_root_callback(NULL, &info);
if (res < 0)
break;
d_name = "sys";
d_type = DT_DIR;
break;
+ case 11:
+ d_ino = PROCFS_FILENO(0, Pmounts);
+ d_namlen = 6;
+ d_name = "mounts";
+ d_type = DT_DIR;
+ break;
#if 0
case 11:
d_ino = PROCFS_FILENO(0, Pdevices);