summaryrefslogtreecommitdiff
path: root/pflocal
diff options
context:
space:
mode:
Diffstat (limited to 'pflocal')
-rw-r--r--pflocal/pflocal.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/pflocal/pflocal.c b/pflocal/pflocal.c
index c99172c0..e4e99871 100644
--- a/pflocal/pflocal.c
+++ b/pflocal/pflocal.c
@@ -22,6 +22,9 @@
#include "pflocal.h"
+/* Where our ports are... */
+struct port_bucket *pflocal_port_bucket;
+
/* Trivfs hooks */
int trivfs_fstype = FSTYPE_MISC;
int trivfs_fsid = 0;
@@ -29,3 +32,114 @@ int trivfs_support_read = 0;
int trivfs_support_write = 0;
int trivfs_support_exec = 0;
int trivfs_allow_open = 0;
+
+/* Trivfs noise. */
+struct port_class *trivfs_protid_portclasses[1];
+struct port_class *trivfs_cntl_portclasses[1];
+int trivfs_protid_nportclasses = 1;
+int trivfs_cntl_nportclasses = 1;
+
+/* ---------------------------------------------------------------- */
+
+#define USAGE "Usage: %s\n"
+
+static void
+usage(int status)
+{
+ if (status != 0)
+ fprintf(stderr, "Try `%s --help' for more information.\n",
+ program_invocation_name);
+ else
+ {
+ printf(USAGE, program_invocation_name);
+ }
+
+ exit(status);
+}
+
+#define SHORT_OPTIONS "&"
+
+static struct option options[] =
+{
+ {"help", no_argument, 0, '&'},
+ {0, 0, 0, 0}
+};
+
+/* ---------------------------------------------------------------- */
+
+void main(int argc, char *argv[])
+{
+ int opt;
+ error_t err;
+ mach_port_t bootstrap;
+
+ while ((opt = getopt_long(argc, argv, SHORT_OPTIONS, options, 0)) != EOF)
+ switch (opt)
+ {
+ case '&': usage(0);
+ default: usage(1);
+ }
+
+ if (argv[optind] != NULL)
+ {
+ fprintf(stderr, USAGE, program_invocation_name);
+ usage(1);
+ }
+
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap == MACH_PORT_NULL)
+ error(2, 0, "Must be started as a translator");
+
+ pflocal_port_bucket = ports_create_bucket ();
+
+ trivfs_cntl_portclasses[0] = ports_create_class (trivfs_clean_cntl, 0);
+ trivfs_protid_portclasses[0] = ports_create_class (trivfs_clean_protid, 0);
+
+ /* Reply to our parent */
+ err =
+ trivfs_startup(bootstrap,
+ trivfs_cntl_portclasses[0], pflocal_port_bucket,
+ trivfs_protid_portclasses[0], pflocal_port_bucket,
+ NULL);
+ if (err)
+ error(3, err, "Contacting parent");
+
+ /* Open the device only when necessary. */
+ device = NULL;
+ mutex_init(&device_lock);
+
+ /* Launch. */
+ ports_manage_port_operations_multithread (pflocal_port_bucket,
+ trivfs_demuxer,
+ 30*1000, 5*60*1000, 0, 0);
+
+ exit(0);
+}
+
+error_t
+trivfs_goaway (int flags, mach_port_t realnode,
+ struct port_class *fsys_port_class,
+ struct port_class *file_port_class)
+{
+ error_t err;
+
+ /* Stop all I/O. */
+ ports_inhibit_bucket_rpcs (pflocal_port_bucket);
+
+ /* Now see if there are any old sockets lying around. */
+ err = sock_goaway (flags);
+
+ /* Exit if not, or if we must. */
+ if (err == 0 || flags & FSYS_GOAWAY_FORCE)
+ exit (0);
+
+ /* We won't go away, so start things going again... */
+ ports_resume_bucket_rpcs (pflocal_port_bucket);
+
+ return err;
+}
+
+void
+thread_cancel (thread_t foo __attribute__ ((unused)))
+{
+}