summaryrefslogtreecommitdiffstats
path: root/sys/fs/pseudofs/pseudofs.h
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2001-04-07 19:51:12 +0000
committerdes <des@FreeBSD.org>2001-04-07 19:51:12 +0000
commitee97bef8dd89a184a3515d56baff6c1a781f1ba6 (patch)
tree05e8f2351e2792762e92f202ccb77647d13a5e37 /sys/fs/pseudofs/pseudofs.h
parenta14b691e19c0cf1fa72557fdb74ec97158b014d1 (diff)
downloadFreeBSD-src-ee97bef8dd89a184a3515d56baff6c1a781f1ba6.zip
FreeBSD-src-ee97bef8dd89a184a3515d56baff6c1a781f1ba6.tar.gz
Let pseudofs into the warmth of the FreeBSD CVS repo.
It's not finished yet (I still have to find a way to implement process- dependent nodes without consuming too much memory, and the permission system needs tightening up), but it's becoming hard to work on without a repo (I've accidentally almost nuked it once already), and it works (except for the lack of process-dependent nodes, that is). I was supposed to commit this a week ago, but timed out waiting for jkh to reply to some questions I had. Pass him a spoonful of bad karma :)
Diffstat (limited to 'sys/fs/pseudofs/pseudofs.h')
-rw-r--r--sys/fs/pseudofs/pseudofs.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h
new file mode 100644
index 0000000..928d2db
--- /dev/null
+++ b/sys/fs/pseudofs/pseudofs.h
@@ -0,0 +1,181 @@
+/*-
+ * Copyright (c) 2001 Dag-Erling Coïdan Smørgrav
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PSEUDOFS_H_INCLUDED
+#define _PSEUDOFS_H_INCLUDED
+
+/*
+ * Limits and constants
+ */
+#define PFS_NAMELEN 24
+#define PFS_DELEN (8 + PFS_NAMELEN)
+
+typedef enum {
+ pfstype_none = 0,
+ pfstype_root,
+ pfstype_dir,
+ pfstype_this,
+ pfstype_parent,
+ pfstype_file,
+ pfstype_symlink,
+ pfstype_procdep
+} pfs_type_t;
+
+/* Flags */
+#define PFS_DYNAMIC 1
+
+/*
+ * Data structures
+ */
+struct pfs_info;
+struct pfs_node;
+struct pfs_bitmap;
+
+typedef int (*pfs_fill_t)(struct pfs_node *, struct proc *, struct sbuf *);
+
+struct pfs_bitmap; /* opaque */
+
+/*
+ * pfs_info: describes a pseudofs instance
+ */
+struct pfs_info {
+ char pi_name[MFSNAMELEN];
+ struct pfs_node *pi_root;
+ /* members below this line aren't initialized */
+ /* currently, the mutex is only used to protect the bitmap */
+ struct mtx pi_mutex;
+ struct pfs_bitmap *pi_bitmap;
+};
+
+/*
+ * pfs_node: describes a node (file or directory) within a pseudofs
+ */
+struct pfs_node {
+ char pn_name[PFS_NAMELEN];
+ pfs_type_t pn_type;
+ int pn_flags;
+ uid_t pn_uid;
+ gid_t pn_gid;
+ mode_t pn_mode;
+ union {
+ void *_pn_data;
+ pfs_fill_t _pn_func;
+ struct pfs_node *_pn_nodes;
+ } u1;
+#define pn_data u1._pn_data
+#define pn_func u1._pn_func
+#define pn_nodes u1._pn_nodes
+ /* members below this line aren't initialized */
+ struct pfs_node *pn_parent;
+ union {
+ u_int32_t _pn_fileno;
+ struct pfs_node *_pn_shadow;
+ } u2;
+#define pn_fileno u2._pn_fileno
+#define pn_shadow u2._pn_shadow
+};
+
+#define PFS_NODE(name, type, flags, uid, gid, mode, data) \
+ { (name), (type), (flags), (uid), (gid), (mode), { (data) } }
+#define PFS_DIR(name, flags, uid, gid, mode, nodes) \
+ PFS_NODE(name, pfstype_dir, flags, uid, gid, mode, nodes)
+#define PFS_ROOT(nodes) \
+ PFS_NODE("/", pfstype_root, 0, 0, 0, 0555, nodes)
+#define PFS_THIS \
+ PFS_NODE(".", pfstype_this, 0, 0, 0, 0, NULL)
+#define PFS_PARENT \
+ PFS_NODE("..", pfstype_parent, 0, 0, 0, 0, NULL)
+#define PFS_FILE(name, flags, uid, gid, mode, func) \
+ PFS_NODE(name, pfstype_file, flags, uid, gid, mode, func)
+#define PFS_SYMLINK(name, flags, uid, gid, mode, func) \
+ PFS_NODE(name, pfstype_symlink, flags, uid, gid, mode, func)
+#define PFS_LASTNODE \
+ PFS_NODE("", pfstype_none, 0, 0, 0, 0, NULL)
+
+/*
+ * VFS interface
+ */
+int pfs_mount (struct pfs_info *pi,
+ struct mount *mp, char *path, caddr_t data,
+ struct nameidata *ndp, struct proc *p);
+int pfs_unmount (struct mount *mp, int mntflags,
+ struct proc *p);
+int pfs_root (struct mount *mp, struct vnode **vpp);
+int pfs_statfs (struct mount *mp, struct statfs *sbp,
+ struct proc *p);
+int pfs_init (struct pfs_info *pi, struct vfsconf *vfc);
+int pfs_uninit (struct pfs_info *pi, struct vfsconf *vfc);
+
+/*
+ * Now for some initialization magic...
+ */
+#define PSEUDOFS(name, root) \
+ \
+static struct pfs_info name##_info = { \
+ #name, \
+ &(root) \
+}; \
+ \
+static int \
+_##name##_mount(struct mount *mp, char *path, caddr_t data, \
+ struct nameidata *ndp, struct proc *p) { \
+ return pfs_mount(&name##_info, mp, path, data, ndp, p); \
+} \
+ \
+static int \
+_##name##_init(struct vfsconf *vfc) { \
+ return pfs_init(&name##_info, vfc); \
+} \
+ \
+static int \
+_##name##_uninit(struct vfsconf *vfc) { \
+ return pfs_uninit(&name##_info, vfc); \
+} \
+ \
+static struct vfsops testfs_vfsops = { \
+ _##name##_mount, \
+ vfs_stdstart, \
+ pfs_unmount, \
+ pfs_root, \
+ vfs_stdquotactl, \
+ pfs_statfs, \
+ vfs_stdsync, \
+ vfs_stdvget, \
+ vfs_stdfhtovp, \
+ vfs_stdcheckexp, \
+ vfs_stdvptofh, \
+ _##name##_init, \
+ _##name##_uninit, \
+ vfs_stdextattrctl, \
+}; \
+VFS_SET(name##_vfsops, name, VFCF_SYNTHETIC); \
+MODULE_DEPEND(name, pseudofs, 1, 1, 1);
+
+#endif
OpenPOWER on IntegriCloud