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