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