summaryrefslogtreecommitdiff
path: root/sys/src/cmd/srvfs.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/srvfs.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/srvfs.c')
-rwxr-xr-xsys/src/cmd/srvfs.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/sys/src/cmd/srvfs.c b/sys/src/cmd/srvfs.c
new file mode 100755
index 000000000..d5c028150
--- /dev/null
+++ b/sys/src/cmd/srvfs.c
@@ -0,0 +1,94 @@
+#include <u.h>
+#include <libc.h>
+
+static void
+usage(void)
+{
+ fprint(2, "usage: %s [-dR] [-p perm] [-P patternfile] [-e exportfs] srvname path\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+ char *ename, *arglist[16], **argp;
+ int n, fd, pipefd[2];
+ char buf[64];
+ int perm = 0600;
+
+ argp = arglist;
+ ename = "/bin/exportfs";
+ *argp++ = "exportfs";
+ ARGBEGIN{
+ default:
+ usage();
+ case 'd':
+ *argp++ = "-d";
+ break;
+ case 'e':
+ ename = EARGF(usage());
+ break;
+ case 'p':
+ perm = strtol(EARGF(usage()), 0, 8);
+ break;
+ case 'P':
+ *argp++ = "-P";
+ *argp++ = EARGF(usage());
+ break;
+ case 'R':
+ *argp++ = "-R";
+ break;
+ }ARGEND
+ *argp = 0;
+ if(argc != 2)
+ usage();
+
+ if(pipe(pipefd) < 0){
+ fprint(2, "can't pipe: %r\n");
+ exits("pipe");
+ }
+
+ switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){
+ case -1:
+ fprint(2, "can't rfork: %r\n");
+ exits("rfork");
+ case 0:
+ dup(pipefd[0], 0);
+ dup(pipefd[0], 1);
+ close(pipefd[0]);
+ close(pipefd[1]);
+ exec(ename, arglist);
+ fprint(2, "can't exec exportfs: %r\n");
+ exits("exec");
+ default:
+ break;
+ }
+ close(pipefd[0]);
+ if(fprint(pipefd[1], "%s", argv[1]) < 0){
+ fprint(2, "can't write pipe: %r\n");
+ exits("write");
+ }
+ n = read(pipefd[1], buf, sizeof buf-1);
+ if(n < 0){
+ fprint(2, "can't read pipe: %r\n");
+ exits("read");
+ }
+ buf[n] = 0;
+ if(n != 2 || strcmp(buf, "OK") != 0){
+ fprint(2, "not OK (%d): %s\n", n, buf);
+ exits("OK");
+ }
+ if(argv[0][0] == '/')
+ strecpy(buf, buf+sizeof buf, argv[0]);
+ else
+ snprint(buf, sizeof buf, "/srv/%s", argv[0]);
+ fd = create(buf, OWRITE, perm);
+ if(fd < 0){
+ fprint(2, "can't create %s: %r\n", buf);
+ exits("create");
+ }
+ fprint(fd, "%d", pipefd[1]);
+ close(fd);
+ close(pipefd[1]);
+ exits(0);
+}