listen.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. #include <fcall.h>
  5. #include <thread.h>
  6. #include <9p.h>
  7. static void listenproc(void*);
  8. static void srvproc(void*);
  9. static char *getremotesys(char*);
  10. void
  11. _listensrv(Srv *os, char *addr)
  12. {
  13. Srv *s;
  14. if(_forker == nil)
  15. sysfatal("no forker");
  16. s = emalloc9p(sizeof *s);
  17. *s = *os;
  18. s->addr = estrdup9p(addr);
  19. _forker(listenproc, s, 0);
  20. }
  21. static void
  22. listenproc(void *v)
  23. {
  24. char ndir[NETPATHLEN], dir[NETPATHLEN];
  25. int ctl, data, nctl;
  26. Srv *os, *s;
  27. os = v;
  28. ctl = announce(os->addr, dir);
  29. if(ctl < 0){
  30. fprint(2, "%s: announce %s: %r", argv0, os->addr);
  31. return;
  32. }
  33. for(;;){
  34. nctl = listen(dir, ndir);
  35. if(nctl < 0){
  36. fprint(2, "%s: listen %s: %r", argv0, os->addr);
  37. break;
  38. }
  39. data = accept(ctl, ndir);
  40. if(data < 0){
  41. fprint(2, "%s: accept %s: %r\n", argv0, ndir);
  42. continue;
  43. }
  44. s = emalloc9p(sizeof *s);
  45. *s = *os;
  46. s->addr = getremotesys(ndir);
  47. s->infd = s->outfd = data;
  48. s->fpool = nil;
  49. s->rpool = nil;
  50. s->rbuf = nil;
  51. s->wbuf = nil;
  52. _forker(srvproc, s, 0);
  53. }
  54. free(os->addr);
  55. free(os);
  56. }
  57. static void
  58. srvproc(void *v)
  59. {
  60. int data;
  61. Srv *s;
  62. s = v;
  63. data = s->infd;
  64. srv(s);
  65. close(data);
  66. free(s->addr);
  67. free(s);
  68. }
  69. static char*
  70. getremotesys(char *ndir)
  71. {
  72. char buf[128], *serv, *sys;
  73. int fd, n;
  74. snprint(buf, sizeof buf, "%s/remote", ndir);
  75. sys = nil;
  76. fd = open(buf, OREAD);
  77. if(fd >= 0){
  78. n = read(fd, buf, sizeof(buf)-1);
  79. if(n>0){
  80. buf[n-1] = 0;
  81. serv = strchr(buf, '!');
  82. if(serv)
  83. *serv = 0;
  84. sys = estrdup9p(buf);
  85. }
  86. close(fd);
  87. }
  88. if(sys == nil)
  89. sys = estrdup9p("unknown");
  90. return sys;
  91. }