xref: /plan9/sys/src/cmd/webfs/webget.c (revision b8b257802f7f811fbf50141a6401409bebd29327)
10d862726SDavid du Colombier /*
20d862726SDavid du Colombier  * Sample client.
30d862726SDavid du Colombier  */
40d862726SDavid du Colombier #include <u.h>
50d862726SDavid du Colombier #include <libc.h>
60d862726SDavid du Colombier 
70d862726SDavid du Colombier void
xfer(int from,int to)80d862726SDavid du Colombier xfer(int from, int to)
90d862726SDavid du Colombier {
100d862726SDavid du Colombier 	char buf[12*1024];
110d862726SDavid du Colombier 	int n;
120d862726SDavid du Colombier 
130d862726SDavid du Colombier 	while((n = read(from, buf, sizeof buf)) > 0)
140d862726SDavid du Colombier 		if(write(to, buf, n) < 0)
150d862726SDavid du Colombier 			sysfatal("write failed: %r");
160d862726SDavid du Colombier 	if(n < 0)
170d862726SDavid du Colombier 		sysfatal("read failed: %r");
180d862726SDavid du Colombier }
190d862726SDavid du Colombier 
200d862726SDavid du Colombier void
usage(void)210d862726SDavid du Colombier usage(void)
220d862726SDavid du Colombier {
230d862726SDavid du Colombier 	fprint(2, "usage: webget [-b baseurl] [-m mtpt] [-p postbody] url\n");
240d862726SDavid du Colombier 	exits("usage");
250d862726SDavid du Colombier }
260d862726SDavid du Colombier 
270d862726SDavid du Colombier void
main(int argc,char ** argv)280d862726SDavid du Colombier main(int argc, char **argv)
290d862726SDavid du Colombier {
30*b8b25780SDavid du Colombier 	int conn, ctlfd, fd, n;
310d862726SDavid du Colombier 	char buf[128], *base, *mtpt, *post, *url;
320d862726SDavid du Colombier 
330d862726SDavid du Colombier 	mtpt = "/mnt/web";
340d862726SDavid du Colombier 	post = nil;
350d862726SDavid du Colombier 	base = nil;
360d862726SDavid du Colombier 	ARGBEGIN{
370d862726SDavid du Colombier 	default:
380d862726SDavid du Colombier 		usage();
390d862726SDavid du Colombier 	case 'b':
400d862726SDavid du Colombier 		base = EARGF(usage());
410d862726SDavid du Colombier 		break;
420d862726SDavid du Colombier 	case 'm':
430d862726SDavid du Colombier 		mtpt = EARGF(usage());
440d862726SDavid du Colombier 		break;
450d862726SDavid du Colombier 	case 'p':
460d862726SDavid du Colombier 		post = EARGF(usage());
470d862726SDavid du Colombier 		break;
480d862726SDavid du Colombier 	}ARGEND;
490d862726SDavid du Colombier 
500d862726SDavid du Colombier 	if (argc != 1)
510d862726SDavid du Colombier 		usage();
520d862726SDavid du Colombier 
530d862726SDavid du Colombier 	url = argv[0];
540d862726SDavid du Colombier 
550d862726SDavid du Colombier 	snprint(buf, sizeof buf, "%s/clone", mtpt);
560d862726SDavid du Colombier 	if((ctlfd = open(buf, ORDWR)) < 0)
570d862726SDavid du Colombier 		sysfatal("couldn't open %s: %r", buf);
580d862726SDavid du Colombier 	if((n = read(ctlfd, buf, sizeof buf-1)) < 0)
590d862726SDavid du Colombier 		sysfatal("reading clone: %r");
600d862726SDavid du Colombier 	if(n == 0)
610d862726SDavid du Colombier 		sysfatal("short read on clone");
620d862726SDavid du Colombier 	buf[n] = '\0';
630d862726SDavid du Colombier 	conn = atoi(buf);
640d862726SDavid du Colombier 
650d862726SDavid du Colombier 	if(base)
660d862726SDavid du Colombier 		if(fprint(ctlfd, "baseurl %s", base) < 0)
670d862726SDavid du Colombier 			sysfatal("baseurl ctl write: %r");
680d862726SDavid du Colombier 
690d862726SDavid du Colombier 	if(fprint(ctlfd, "url %s", url) <= 0)
700d862726SDavid du Colombier 		sysfatal("get ctl write: %r");
710d862726SDavid du Colombier 
720d862726SDavid du Colombier 	if(post){
730d862726SDavid du Colombier 		snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn);
740d862726SDavid du Colombier 		if((fd = open(buf, OWRITE)) < 0)
750d862726SDavid du Colombier 			sysfatal("open %s: %r", buf);
760d862726SDavid du Colombier 		if(write(fd, post, strlen(post)) < 0)
770d862726SDavid du Colombier 			sysfatal("post write failed: %r");
780d862726SDavid du Colombier 		close(fd);
790d862726SDavid du Colombier 	}
800d862726SDavid du Colombier 
810d862726SDavid du Colombier 	snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn);
820d862726SDavid du Colombier 	if((fd = open(buf, OREAD)) < 0)
830d862726SDavid du Colombier 		sysfatal("open %s: %r", buf);
840d862726SDavid du Colombier 
850d862726SDavid du Colombier 	xfer(fd, 1);
860d862726SDavid du Colombier 	exits(nil);
870d862726SDavid du Colombier }
88