1 /* 2 * Sample client. 3 */ 4 #include <u.h> 5 #include <libc.h> 6 7 void 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 21 usage(void) 22 { 23 fprint(2, "usage: webget [-b baseurl] [-m mtpt] [-p postbody] url\n"); 24 exits("usage"); 25 } 26 27 void 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