plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }