plumber.c 2.1 KB

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