summaryrefslogtreecommitdiff
path: root/storeio/storeio.c
diff options
context:
space:
mode:
Diffstat (limited to 'storeio/storeio.c')
-rw-r--r--storeio/storeio.c114
1 files changed, 48 insertions, 66 deletions
diff --git a/storeio/storeio.c b/storeio/storeio.c
index 4c5e6c87..a2c8083a 100644
--- a/storeio/storeio.c
+++ b/storeio/storeio.c
@@ -1,6 +1,6 @@
/* A translator for doing I/O to stores
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Written by Miles Bader <miles@gnu.ai.mit.edu>
@@ -33,20 +33,6 @@
#include "open.h"
#include "dev.h"
-/* The port class of our file system control pointer. */
-struct port_class *fsys_port_class;
-/* The port class of the (only) root file port for the opened device. */
-struct port_class *root_port_class;
-
-/* A bucket to put all our ports in. */
-struct port_bucket *port_bucket;
-
-/* 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;
-
static struct argp_option options[] =
{
{"readonly", 'r', 0, 0, "Disallow writing"},
@@ -54,15 +40,12 @@ static struct argp_option options[] =
{"rdev", 'n', "ID", 0,
"The stat rdev number for this node; may be either a"
" single integer, or of the form MAJOR,MINOR"},
- {0, 0, 0, 0}
+ {0}
};
-static char *args_doc = 0;
-static char *doc = "Translator for devices and other stores";
+static const char doc[] = "Translator for devices and other stores";
-char *argp_program_version = STANDARD_HURD_VERSION (storeio);
+const char *argp_program_version = STANDARD_HURD_VERSION (storeio);
-/* ---------------------------------------------------------------- */
-
/* The open store. */
static struct dev *device = NULL;
/* And a lock to arbitrate changes to it. */
@@ -75,44 +58,52 @@ static int readonly = 0;
/* A unixy device number to return when the device is stat'd. */
static int rdev = 0;
-void main (int argc, char *argv[])
+/* Parse a single option. */
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
{
- error_t err;
- mach_port_t bootstrap;
- error_t parse_opt (int key, char *arg, struct argp_state *state)
+ switch (key)
{
- switch (key)
- {
- case 'r': readonly = 1; break;
- case 'w': readonly = 0; break;
- case 'n':
+ case 'r': readonly = 1; break;
+ case 'w': readonly = 0; break;
+
+ case 'n':
+ {
+ char *start = arg, *end;
+
+ rdev = strtoul (start, &end, 0);
+ if (*end == ',')
+ /* MAJOR,MINOR form */
{
- char *start = arg, *end;
-
- rdev = strtoul (start, &end, 0);
- if (*end == ',')
- /* MAJOR,MINOR form */
- {
- start = end;
- rdev = (rdev << 8) + strtoul (start, &end, 0);
- }
-
- if (end == start || *end != '\0')
- {
- argp_error (state, "%s: Invalid argument to --rdev", arg);
- return EINVAL;
- }
+ start = end;
+ rdev = (rdev << 8) + strtoul (start, &end, 0);
}
- break;
- case ARGP_KEY_INIT:
- state->child_inputs[0] = state->input; break;
- default:
- return ARGP_ERR_UNKNOWN;
- }
- return 0;
+
+ if (end == start || *end != '\0')
+ {
+ argp_error (state, "%s: Invalid argument to --rdev", arg);
+ return EINVAL;
+ }
+ }
+ break;
+
+ case ARGP_KEY_INIT:
+ state->child_inputs[0] = state->input; break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
}
- const struct argp_child kids[] = { {&store_argp}, {0} };
- const struct argp argp = { options, parse_opt, args_doc, doc, kids };
+ return 0;
+}
+
+static const struct argp_child argp_kids[] = { { &store_argp }, {0} };
+static const struct argp argp = { options, parse_opt, 0, doc, argp_kids };
+
+void main (int argc, char *argv[])
+{
+ error_t err;
+ mach_port_t bootstrap;
+ struct trivfs_control *fsys;
struct store_argp_params store_params = { default_type: "device" };
argp_parse (&argp, argc, argv, 0, 0, &store_params);
@@ -125,19 +116,9 @@ void main (int argc, char *argv[])
task_get_bootstrap_port (mach_task_self (), &bootstrap);
if (bootstrap == MACH_PORT_NULL)
error (2, 0, "Must be started as a translator");
-
- fsys_port_class = ports_create_class (trivfs_clean_cntl, 0);
- root_port_class = ports_create_class (trivfs_clean_protid, 0);
- port_bucket = ports_create_bucket ();
- trivfs_protid_portclasses[0] = root_port_class;
- trivfs_cntl_portclasses[0] = fsys_port_class;
/* Reply to our parent */
- err =
- trivfs_startup (bootstrap, 0,
- fsys_port_class, port_bucket,
- root_port_class, port_bucket,
- NULL);
+ err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0, &fsys);
if (err)
error (3, err, "trivfs_startup");
@@ -146,7 +127,7 @@ void main (int argc, char *argv[])
mutex_init (&device_lock);
/* Launch. */
- ports_manage_port_operations_multithread (port_bucket, trivfs_demuxer,
+ ports_manage_port_operations_multithread (fsys->pi.bucket, trivfs_demuxer,
30*1000, 5*60*1000, 0, 0);
exit (0);
@@ -271,6 +252,7 @@ trivfs_goaway (struct trivfs_control *fsys, int flags)
error_t err;
int force = (flags & FSYS_GOAWAY_FORCE);
int nosync = (flags & FSYS_GOAWAY_NOSYNC);
+ struct port_class *root_port_class = fsys->protid_class;
mutex_lock (&device_lock);