1 b8c14089 2003-11-23 devnull #include <u.h>
2 b8c14089 2003-11-23 devnull #include <libc.h>
3 b8c14089 2003-11-23 devnull #include <regexp.h>
4 b8c14089 2003-11-23 devnull #include <thread.h>
5 b8c14089 2003-11-23 devnull #include <plumb.h>
6 b8c14089 2003-11-23 devnull #include <fcall.h>
7 b8c14089 2003-11-23 devnull #include "plumber.h"
9 32f69c36 2003-12-11 devnull int debug;
10 b8c14089 2003-11-23 devnull char *plumbfile;
11 b8c14089 2003-11-23 devnull char *user;
12 b8c14089 2003-11-23 devnull char *home;
13 b8c14089 2003-11-23 devnull char *progname;
14 b8c14089 2003-11-23 devnull Ruleset **rules;
15 b8c14089 2003-11-23 devnull int printerrors=1;
16 b8c14089 2003-11-23 devnull jmp_buf parsejmp;
17 b8c14089 2003-11-23 devnull char *lasterror;
20 b8c14089 2003-11-23 devnull makeports(Ruleset *rules[])
24 b8c14089 2003-11-23 devnull for(i=0; rules[i]; i++)
25 b8c14089 2003-11-23 devnull addport(rules[i]->port);
29 b8c14089 2003-11-23 devnull threadmain(int argc, char *argv[])
31 b8c14089 2003-11-23 devnull char buf[512];
32 15680d56 2004-03-05 devnull int fd, dofork;
34 b8c14089 2003-11-23 devnull progname = "plumber";
35 15680d56 2004-03-05 devnull dofork = 1;
37 b8c14089 2003-11-23 devnull ARGBEGIN{
38 32f69c36 2003-12-11 devnull case 'd':
39 32f69c36 2003-12-11 devnull debug = 1;
41 15680d56 2004-03-05 devnull case 'f':
42 15680d56 2004-03-05 devnull dofork = 0;
44 b8c14089 2003-11-23 devnull case 'p':
45 b8c14089 2003-11-23 devnull plumbfile = ARGF();
49 32f69c36 2003-12-11 devnull user = getuser();
50 b8c14089 2003-11-23 devnull home = getenv("home");
51 32f69c36 2003-12-11 devnull if(home == nil)
52 32f69c36 2003-12-11 devnull home = getenv("HOME");
53 b8c14089 2003-11-23 devnull if(user==nil || home==nil)
54 b8c14089 2003-11-23 devnull error("can't initialize $user or $home: %r");
55 b8c14089 2003-11-23 devnull if(plumbfile == nil){
56 b8c14089 2003-11-23 devnull sprint(buf, "%s/lib/plumbing", home);
57 8ad51794 2004-03-25 devnull if(access(buf, 0) >= 0)
58 8ad51794 2004-03-25 devnull plumbfile = estrdup(buf);
60 8ad51794 2004-03-25 devnull plumbfile = unsharp("#9/plumb/initial.plumbing");
63 b8c14089 2003-11-23 devnull fd = open(plumbfile, OREAD);
64 b8c14089 2003-11-23 devnull if(fd < 0)
65 b8c14089 2003-11-23 devnull error("can't open rules file %s: %r", plumbfile);
66 b8c14089 2003-11-23 devnull if(setjmp(parsejmp))
67 b8c14089 2003-11-23 devnull error("parse error");
69 b8c14089 2003-11-23 devnull rules = readrules(plumbfile, fd);
70 b8c14089 2003-11-23 devnull close(fd);
73 b8c14089 2003-11-23 devnull * Start all processes and threads from other proc
74 b8c14089 2003-11-23 devnull * so we (main pid) can return to user.
76 15680d56 2004-03-05 devnull if(dofork)
77 f063dad9 2004-02-29 devnull switch(fork()){
79 f063dad9 2004-02-29 devnull sysfatal("fork: %r");
83 f063dad9 2004-02-29 devnull _exit(0);
86 f063dad9 2004-02-29 devnull printerrors = 0;
87 f063dad9 2004-02-29 devnull makeports(rules);
88 f063dad9 2004-02-29 devnull startfsys();
92 b8c14089 2003-11-23 devnull error(char *fmt, ...)
94 b8c14089 2003-11-23 devnull char buf[512];
95 b8c14089 2003-11-23 devnull va_list args;
97 b8c14089 2003-11-23 devnull va_start(args, fmt);
98 b8c14089 2003-11-23 devnull vseprint(buf, buf+sizeof buf, fmt, args);
99 b8c14089 2003-11-23 devnull va_end(args);
101 b8c14089 2003-11-23 devnull fprint(2, "%s: %s\n", progname, buf);
102 b8c14089 2003-11-23 devnull threadexitsall("error");
106 b8c14089 2003-11-23 devnull parseerror(char *fmt, ...)
108 b8c14089 2003-11-23 devnull char buf[512];
109 b8c14089 2003-11-23 devnull va_list args;
111 b8c14089 2003-11-23 devnull va_start(args, fmt);
112 b8c14089 2003-11-23 devnull vseprint(buf, buf+sizeof buf, fmt, args);
113 b8c14089 2003-11-23 devnull va_end(args);
115 b8c14089 2003-11-23 devnull if(printerrors){
116 b8c14089 2003-11-23 devnull printinputstack();
117 b8c14089 2003-11-23 devnull fprint(2, "%s\n", buf);
119 b8c14089 2003-11-23 devnull do; while(popinput());
120 b8c14089 2003-11-23 devnull lasterror = estrdup(buf);
121 b8c14089 2003-11-23 devnull longjmp(parsejmp, 1);
125 b8c14089 2003-11-23 devnull emalloc(long n)
127 b8c14089 2003-11-23 devnull void *p;
129 b8c14089 2003-11-23 devnull p = malloc(n);
130 b8c14089 2003-11-23 devnull if(p == nil)
131 b8c14089 2003-11-23 devnull error("malloc failed: %r");
132 b8c14089 2003-11-23 devnull memset(p, 0, n);
133 b8c14089 2003-11-23 devnull return p;
137 b8c14089 2003-11-23 devnull erealloc(void *p, long n)
139 b8c14089 2003-11-23 devnull p = realloc(p, n);
140 b8c14089 2003-11-23 devnull if(p == nil)
141 b8c14089 2003-11-23 devnull error("realloc failed: %r");
142 b8c14089 2003-11-23 devnull return p;
146 b8c14089 2003-11-23 devnull estrdup(char *s)
148 b8c14089 2003-11-23 devnull char *t;
150 b8c14089 2003-11-23 devnull t = strdup(s);
151 b8c14089 2003-11-23 devnull if(t == nil)
152 b8c14089 2003-11-23 devnull error("estrdup failed: %r");
153 b8c14089 2003-11-23 devnull return t;