Blame


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