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