summaryrefslogtreecommitdiff
path: root/sys/src/cmd/hjfs/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/cmd/hjfs/main.c')
-rw-r--r--sys/src/cmd/hjfs/main.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/sys/src/cmd/hjfs/main.c b/sys/src/cmd/hjfs/main.c
new file mode 100644
index 000000000..de41f64eb
--- /dev/null
+++ b/sys/src/cmd/hjfs/main.c
@@ -0,0 +1,125 @@
+#include <u.h>
+#include <libc.h>
+#include <libsec.h>
+#include <thread.h>
+#include "dat.h"
+#include "fns.h"
+
+char Eio[] = "i/o error";
+char Enotadir[] = "not a directory";
+char Enoent[] = "not found";
+char Einval[] = "invalid operation";
+char Eperm[] = "permission denied";
+char Eexists[] = "file exists";
+char Elocked[] = "file locked";
+
+void*
+emalloc(int c)
+{
+ void *v;
+
+ v = mallocz(c, 1);
+ if(v == 0)
+ sysfatal("malloc: %r");
+ setmalloctag(v, getcallerpc(&c));
+ return v;
+}
+
+ThrData *
+getthrdata(void)
+{
+ ThrData **v;
+
+ v = (ThrData **) threaddata();
+ if(*v == nil){
+ *v = emalloc(sizeof(**v));
+ (*v)->resp = chancreate(sizeof(void *), 0);
+ }
+ return *v;
+}
+
+Fs *fsmain;
+
+int
+dprint(char *fmt, ...)
+{
+ va_list va;
+ int rc;
+
+ va_start(va, fmt);
+ rc = vfprint(2, fmt, va);
+ va_end(va);
+ return rc;
+}
+
+static void
+syncproc(void *)
+{
+ for(;;){
+ sync(0);
+ sleep(SYNCINTERVAL);
+ }
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: %s [-rsS] [-m mem] [-n service] -f dev\n", argv0);
+ exits("usage");
+}
+
+void
+threadmain(int argc, char **argv)
+{
+ Dev *d;
+ char *file, *service;
+ int doream, flags, stdio, nbuf;
+
+ doream = 0;
+ stdio = 0;
+ flags = FSNOAUTH;
+ service = "fs";
+ file = nil;
+ nbuf = 10;
+ ARGBEGIN {
+ case 'A': flags &= ~FSNOAUTH; break;
+ case 'r': doream++; break;
+ case 'S': flags |= FSNOPERM | FSCHOWN; break;
+ case 's': stdio++; break;
+ case 'f': file = strdup(EARGF(usage())); break;
+ case 'n': service = strdup(EARGF(usage())); break;
+ case 'm':
+ nbuf = muldiv(atoi(EARGF(usage())), 1048576, sizeof(Buf));
+ if(nbuf < 10)
+ nbuf = 10;
+ break;
+ default: usage();
+ } ARGEND;
+ rfork(RFNOTEG);
+ bufinit(nbuf);
+ if(file == nil)
+ sysfatal("no default file");
+ if(argc != 0)
+ usage();
+ d = newdev(file);
+ if(d == nil)
+ sysfatal("newdev: %r");
+ fsmain = initfs(d, doream, flags);
+ if(fsmain == nil)
+ sysfatal("fsinit: %r");
+ initcons(service);
+ proccreate(syncproc, nil, mainstacksize);
+ start9p(service, stdio);
+ threadexits(nil);
+}
+
+void
+shutdown(void)
+{
+ wlock(fsmain);
+ sync(1);
+ dprint("hjfs: ending\n");
+ sleep(1000);
+ sync(1);
+ threadexitsall(nil);
+}