devnull.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /* Copyright (c) 2004 Russ Cox */
  2. #include <u.h>
  3. #include <libc.h>
  4. #include <venti.h>
  5. #include <thread.h>
  6. #include <libsec.h>
  7. #ifndef _UNISTD_H_
  8. #pragma varargck type "F" VtFcall*
  9. #pragma varargck type "T" void
  10. #endif
  11. int verbose;
  12. enum
  13. {
  14. STACK = 8192
  15. };
  16. void
  17. usage(void)
  18. {
  19. fprint(2, "usage: venti/devnull [-v] [-a address]\n");
  20. threadexitsall("usage");
  21. }
  22. void
  23. threadmain(int argc, char **argv)
  24. {
  25. VtReq *r;
  26. VtSrv *srv;
  27. char *address;
  28. fmtinstall('V', vtscorefmt);
  29. fmtinstall('F', vtfcallfmt);
  30. address = "tcp!*!venti";
  31. ARGBEGIN{
  32. case 'v':
  33. verbose++;
  34. break;
  35. case 'a':
  36. address = EARGF(usage());
  37. break;
  38. default:
  39. usage();
  40. }ARGEND
  41. srv = vtlisten(address);
  42. if(srv == nil)
  43. sysfatal("vtlisten %s: %r", address);
  44. while((r = vtgetreq(srv)) != nil){
  45. r->rx.msgtype = r->tx.msgtype+1;
  46. if(verbose)
  47. fprint(2, "<- %F\n", &r->tx);
  48. switch(r->tx.msgtype){
  49. case VtTping:
  50. break;
  51. case VtTgoodbye:
  52. break;
  53. case VtTread:
  54. r->rx.error = vtstrdup("no such block");
  55. r->rx.msgtype = VtRerror;
  56. break;
  57. case VtTwrite:
  58. packetsha1(r->tx.data, r->rx.score);
  59. break;
  60. case VtTsync:
  61. break;
  62. }
  63. if(verbose)
  64. fprint(2, "-> %F\n", &r->rx);
  65. vtrespond(r);
  66. }
  67. threadexitsall(nil);
  68. }