plumber.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <regexp.h>
  4. #include <thread.h>
  5. #include <plumb.h>
  6. #include <auth.h>
  7. #include <fcall.h>
  8. #include "plumber.h"
  9. char *plumbfile;
  10. char *user;
  11. char *home;
  12. char *progname;
  13. Ruleset **rules;
  14. int printerrors=1;
  15. jmp_buf parsejmp;
  16. char *lasterror;
  17. int mainstacksize = 20*1024;
  18. void
  19. makeports(Ruleset *rules[])
  20. {
  21. int i;
  22. for(i=0; rules[i]; i++)
  23. addport(rules[i]->port);
  24. }
  25. void
  26. mainproc(void *v)
  27. {
  28. Channel *c;
  29. c = v;
  30. printerrors = 0;
  31. makeports(rules);
  32. startfsys();
  33. sendp(c, nil);
  34. }
  35. void
  36. threadmain(int argc, char *argv[])
  37. {
  38. char buf[512];
  39. int fd;
  40. Channel *c;
  41. progname = "plumber";
  42. ARGBEGIN{
  43. case 'p':
  44. plumbfile = ARGF();
  45. break;
  46. }ARGEND
  47. user = getenv("user");
  48. home = getenv("home");
  49. if(user==nil || home==nil)
  50. error("can't initialize $user or $home: %r");
  51. if(plumbfile == nil){
  52. sprint(buf, "%s/lib/plumbing", home);
  53. plumbfile = estrdup(buf);
  54. }
  55. fd = open(plumbfile, OREAD);
  56. if(fd < 0)
  57. error("can't open rules file %s: %r", plumbfile);
  58. if(setjmp(parsejmp))
  59. error("parse error");
  60. rules = readrules(plumbfile, fd);
  61. close(fd);
  62. /*
  63. * Start all processes and threads from other proc
  64. * so we (main pid) can return to user.
  65. */
  66. c = chancreate(sizeof(void*), 0);
  67. proccreate(mainproc, c, 8192);
  68. recvp(c);
  69. chanfree(c);
  70. threadexits(nil);
  71. }
  72. void
  73. error(char *fmt, ...)
  74. {
  75. char buf[512];
  76. va_list args;
  77. va_start(args, fmt);
  78. vseprint(buf, buf+sizeof buf, fmt, args);
  79. va_end(args);
  80. fprint(2, "%s: %s\n", progname, buf);
  81. threadexitsall("error");
  82. }
  83. void
  84. parseerror(char *fmt, ...)
  85. {
  86. char buf[512];
  87. va_list args;
  88. va_start(args, fmt);
  89. vseprint(buf, buf+sizeof buf, fmt, args);
  90. va_end(args);
  91. if(printerrors){
  92. printinputstack();
  93. fprint(2, "%s\n", buf);
  94. }
  95. do; while(popinput());
  96. lasterror = estrdup(buf);
  97. longjmp(parsejmp, 1);
  98. }
  99. void*
  100. emalloc(long n)
  101. {
  102. void *p;
  103. p = malloc(n);
  104. if(p == nil)
  105. error("malloc failed: %r");
  106. memset(p, 0, n);
  107. return p;
  108. }
  109. void*
  110. erealloc(void *p, long n)
  111. {
  112. p = realloc(p, n);
  113. if(p == nil)
  114. error("realloc failed: %r");
  115. return p;
  116. }
  117. char*
  118. estrdup(char *s)
  119. {
  120. char *t;
  121. t = strdup(s);
  122. if(t == nil)
  123. error("estrdup failed: %r");
  124. setmalloctag(t, getcallerpc(&s));
  125. return t;
  126. }