diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/webfsget.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/webfsget.c')
-rwxr-xr-x | sys/src/cmd/webfsget.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/sys/src/cmd/webfsget.c b/sys/src/cmd/webfsget.c new file mode 100755 index 000000000..906d7d1cb --- /dev/null +++ b/sys/src/cmd/webfsget.c @@ -0,0 +1,85 @@ +/* Example of how to use webfs */ +#include <u.h> +#include <libc.h> + +void +xfer(int from, int to) +{ + char buf[12*1024]; + int n; + + while((n = read(from, buf, sizeof buf)) > 0) + if(write(to, buf, n) < 0) + sysfatal("write failed: %r"); + if(n < 0) + sysfatal("read failed: %r"); +} + +void +usage(void) +{ + fprint(2, "usage: webfsget [-b baseurl] [-m mtpt] [-p postbody] url\n"); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int conn, ctlfd, fd, n; + char buf[128], *base, *mtpt, *post, *url; + + mtpt = "/mnt/web"; + post = nil; + base = nil; + ARGBEGIN{ + default: + usage(); + case 'b': + base = EARGF(usage()); + break; + case 'm': + mtpt = EARGF(usage()); + break; + case 'p': + post = EARGF(usage()); + break; + }ARGEND; + + if (argc != 1) + usage(); + + url = argv[0]; + + snprint(buf, sizeof buf, "%s/clone", mtpt); + if((ctlfd = open(buf, ORDWR)) < 0) + sysfatal("couldn't open %s: %r", buf); + if((n = read(ctlfd, buf, sizeof buf-1)) < 0) + sysfatal("reading clone: %r"); + if(n == 0) + sysfatal("short read on clone"); + buf[n] = '\0'; + conn = atoi(buf); + + if(base) + if(fprint(ctlfd, "baseurl %s", base) < 0) + sysfatal("baseurl ctl write: %r"); + + if(fprint(ctlfd, "url %s", url) <= 0) + sysfatal("get ctl write: %r"); + + if(post){ + snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn); + if((fd = open(buf, OWRITE)) < 0) + sysfatal("open %s: %r", buf); + if(write(fd, post, strlen(post)) < 0) + sysfatal("post write failed: %r"); + close(fd); + } + + snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn); + if((fd = open(buf, OREAD)) < 0) + sysfatal("open %s: %r", buf); + + xfer(fd, 1); + exits(nil); +} |