webget.c 1.6 KB

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