--- /dev/null
+.TH VBFS 8
+.SH NAME
+vbfs \- VirtualBox Shared Folder File System server
+.SH SYNOPSIS
+\fBmount \-t vbfs \fR[\fB\-r\fR] \fB\-o
+\fBshare=\fIsharename\fR[\fB,\fIoptions\fR] \fBnone \fImountpoint
+.SH DESCRIPTION
+The \fBvbfs\fR server allows one to mount a VirtualBox shared folder as a file
+system. This makes it possible to access selected portions of the VirtualBox
+host file system when MINIX is run as a VirtualBox guest.
+.PP
+The above mount command will mount the vbfs file system onto the directory
+\fImountpoint\fR. The \fB\-r\fR mount option makes the file system read-only;
+note that shared folders may independently have been configured as read-only
+on the VMware host. The \fIoptions\fR field is a string consisting of
+comma-delimited \fIkey\fR or \fIkey\fB=\fIvalue\fR options.
+The vbfs server can mount only one shared folder at a time, and therefore,
+specifying a \fBshare\fR name is required.
+The other options are optional. The following options are supported.
+.TP 4
+\fBshare=\fIname\fR
+This required option specifies the share name to mount. It is currently not
+possible to list the available share names from within MINIX3.
+.TP
+\fBprefix=\fIpath\fR
+This option sets a path prefix that will be prepended to all file system
+operations on the host system. The default is the empty path, exposing the
+entire share. Leading and trailing slashes are ignored.
+.TP
+\fBuid=\fInumber\fR
+This sets the user ID used for all the files and directories in the file
+system, allowing a non-root user to be the owner. The value must be specified
+as a decimal number.
+The default is root (the number \fB0\fR).
+.TP
+\fBgid=\fInumber\fR
+Likewise, sets the group ID for all files and directories.
+The default is operator (the number \fB0\fR).
+.TP
+\fBfmask=\fInumber\fR
+This option sets the file permission mask of regular files. It is specified as
+an octal number. For example, a value of \fB600\fR makes all files readable and
+writable by the owning user (see the "\fBuid\fR" option).
+The default is \fB755\fR.
+.TP
+\fBdmask=\fInumber\fR
+Likewise, sets the file permission mask of directories.
+The default is also \fB755\fR.
+.SH EXAMPLES
+.TP 20
+.B mount \-t vbfs -o share=myshare none /usr/myshare
+# Mount the "\fImyshare\fR" shared folder on \fI/usr/myshare\fR
+.TP 20
+.B mount \-t vbfs \-o share=shared,prefix=foo/bar,uid=20,fmask=644 none /mnt
+# Mount the "\fIfoo/bar\fR" subtree from the "\fIshared\fR" shared folder on
+\fI/mnt\fR
+.SH LIMITATIONS
+VBFS has been designed to provide a convenient means to exchange files between
+the guest and the host system, not as a complete file system implementation.
+As such, it comes with many limitations. Some of these are VBFS implementation
+shortcomings; some are the result of behavioral differences between the host
+file system and the guest's expectations; some are the result of a mismatch
+between MINIX's VFS/FS protocol and the requirements from VBFS; and finally,
+some are the result of the user's ability to change the file system on the
+host system at any time.
+.SH "SEE ALSO"
+.BR mount (1),
+.BR hgfs (8)
+.SH AUTHOR
+David van Moolenbroek <david@minix3.org>
--- /dev/null
+/* This file contains the implementation of the VBFS file system server. */
+/*
+ * The architecture of VBFS can be sketched as follows:
+ *
+ * +-------------+
+ * | VBFS | This file
+ * +-------------+
+ * |
+ * +-------------+
+ * | libsffs | Shared Folder File System library
+ * +-------------+
+ * |
+ * +-------------+
+ * | libvboxfs | VirtualBox File System library
+ * +-------------+
+ * |
+ * +-------------+
+ * | libsys/vbox | VBOX driver interfacing library
+ * +-------------+
+ * -------- | -------- (process boundary)
+ * +-------------+
+ * | VBOX driver | VirtualBox backdoor driver
+ * +-------------+
+ * ======== | ======== (system boundary)
+ * +-------------+
+ * | VirtualBox | The host system
+ * +-------------+
+ *
+ * The interfaces between the layers are defined in the following header files:
+ * minix/sffs.h: shared between VBFS, libsffs, and libvboxfs
+ * minix/vboxfs.h: shared between VBFS and libvboxfs
+ * minix/vbox.h: shared between libvboxfs and libsys/vbox
+ * minix/vboxtype.h: shared between libvboxfs, libsys/vbox, and VBOX
+ * minix/vboxif.h: shared between libsys/vbox and VBOX
+ */
+
+#include <minix/drivers.h>
+#include <minix/sffs.h>
+#include <minix/vboxfs.h>
+#include <minix/optset.h>
+
+static char share[PATH_MAX];
+static struct sffs_params params;
+
+static struct optset optset_table[] = {
+ { "share", OPT_STRING, share, sizeof(share) },
+ { "prefix", OPT_STRING, params.p_prefix, sizeof(params.p_prefix) },
+ { "uid", OPT_INT, ¶ms.p_uid, 10 },
+ { "gid", OPT_INT, ¶ms.p_gid, 10 },
+ { "fmask", OPT_INT, ¶ms.p_file_mask, 8 },
+ { "dmask", OPT_INT, ¶ms.p_dir_mask, 8 },
+ { NULL, 0, NULL, 0 }
+};
+
+/*
+ * Initialize this file server. Called at startup time.
+ */
+static int
+init(int UNUSED(type), sef_init_info_t *UNUSED(info))
+{
+ const struct sffs_table *table;
+ int i, r, roflag;
+
+ /* Set defaults. */
+ share[0] = 0;
+ params.p_prefix[0] = 0;
+ params.p_uid = 0;
+ params.p_gid = 0;
+ params.p_file_mask = 0755;
+ params.p_dir_mask = 0755;
+ params.p_case_insens = FALSE;
+
+ /* We must have been given an options string. Parse the options. */
+ for (i = 1; i < env_argc - 1; i++)
+ if (!strcmp(env_argv[i], "-o"))
+ optset_parse(optset_table, env_argv[++i]);
+
+ /* A share name is required. */
+ if (!share[0]) {
+ printf("VBFS: no shared folder share name specified\n");
+
+ return EINVAL;
+ }
+
+ /* Initialize the VBOXFS library. If this fails, exit immediately. */
+ r = vboxfs_init(share, &table, ¶ms.p_case_insens, &roflag);
+
+ if (r != OK) {
+ if (r == ENOENT)
+ printf("VBFS: the given share does not exist\n");
+ else
+ printf("VBFS: unable to initialize VBOXFS (%d)\n", r);
+
+ return r;
+ }
+
+ /* Now initialize the SFFS library. */
+ if ((r = sffs_init("VBFS", table, ¶ms)) != OK) {
+ vboxfs_cleanup();
+
+ return r;
+ }
+
+ return OK;
+}
+
+/*
+ * Local SEF initialization.
+ */
+static void
+sef_local_startup(void)
+{
+
+ /* Register initialization callback. */
+ sef_setcb_init_fresh(init);
+
+ /* Register signal callback. SFFS handles this. */
+ sef_setcb_signal_handler(sffs_signal);
+
+ sef_startup();
+}
+
+/*
+ * The main function of this file server.
+ */
+int
+main(int argc, char **argv)
+{
+
+ /* Start up. */
+ env_setargs(argc, argv);
+ sef_local_startup();
+
+ /* Let SFFS do the actual work. */
+ sffs_loop();
+
+ /* Clean up. */
+ vboxfs_cleanup();
+
+ return EXIT_SUCCESS;
+}