webfsget.c 1.6 KB

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