diff options
-rw-r--r-- | pflocal/pflocal.c | 114 |
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))) +{ +} |