xref: /plan9/sys/src/cmd/webfsget.c (revision 824682f6e41dbeb396150954726b170592cf1eac)
1 /* Example of how to use webfs */
2 #include <u.h>
3 #include <libc.h>
4 
5 void
xfer(int from,int to)6 xfer(int from, int to)
7 {
8 	char buf[12*1024];
9 	int n;
10 
11 	while((n = read(from, buf, sizeof buf)) > 0)
12 		if(write(to, buf, n) < 0)
13 			sysfatal("write failed: %r");
14 	if(n < 0)
15 		sysfatal("read failed: %r");
16 }
17 
18 void
usage(void)19 usage(void)
20 {
21 	fprint(2, "usage: webfsget [-b baseurl] [-m mtpt] [-p postbody] url\n");
22 	exits("usage");
23 }
24 
25 void
main(int argc,char ** argv)26 main(int argc, char **argv)
27 {
28 	int conn, ctlfd, fd, n;
29 	char buf[128], *base, *mtpt, *post, *url;
30 
31 	mtpt = "/mnt/web";
32 	post = nil;
33 	base = nil;
34 	ARGBEGIN{
35 	default:
36 		usage();
37 	case 'b':
38 		base = EARGF(usage());
39 		break;
40 	case 'm':
41 		mtpt = EARGF(usage());
42 		break;
43 	case 'p':
44 		post = EARGF(usage());
45 		break;
46 	}ARGEND;
47 
48 	if (argc != 1)
49 		usage();
50 
51 	url = argv[0];
52 
53 	snprint(buf, sizeof buf, "%s/clone", mtpt);
54 	if((ctlfd = open(buf, ORDWR)) < 0)
55 		sysfatal("couldn't open %s: %r", buf);
56 	if((n = read(ctlfd, buf, sizeof buf-1)) < 0)
57 		sysfatal("reading clone: %r");
58 	if(n == 0)
59 		sysfatal("short read on clone");
60 	buf[n] = '\0';
61 	conn = atoi(buf);
62 
63 	if(base)
64 		if(fprint(ctlfd, "baseurl %s", base) < 0)
65 			sysfatal("baseurl ctl write: %r");
66 
67 	if(fprint(ctlfd, "url %s", url) <= 0)
68 		sysfatal("get ctl write: %r");
69 
70 	if(post){
71 		snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn);
72 		if((fd = open(buf, OWRITE)) < 0)
73 			sysfatal("open %s: %r", buf);
74 		if(write(fd, post, strlen(post)) < 0)
75 			sysfatal("post write failed: %r");
76 		close(fd);
77 	}
78 
79 	snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn);
80 	if((fd = open(buf, OREAD)) < 0)
81 		sysfatal("open %s: %r", buf);
82 
83 	xfer(fd, 1);
84 	exits(nil);
85 }
86