xref: /plan9/sys/src/cmd/fossil/fossil.c (revision 5e96a66c77eb9140492ca53f857cbbf108e128ed)
1*5e96a66cSDavid du Colombier #include "stdinc.h"
2*5e96a66cSDavid du Colombier 
3*5e96a66cSDavid du Colombier #include "9.h"
4*5e96a66cSDavid du Colombier 
5*5e96a66cSDavid du Colombier int Dflag;
6*5e96a66cSDavid du Colombier char* none = "none";
7*5e96a66cSDavid du Colombier int stdfd[2];
8*5e96a66cSDavid du Colombier 
9*5e96a66cSDavid du Colombier static char* myname = "numpty";
10*5e96a66cSDavid du Colombier 
11*5e96a66cSDavid du Colombier static void
12*5e96a66cSDavid du Colombier usage(void)
13*5e96a66cSDavid du Colombier {
14*5e96a66cSDavid du Colombier 	argv0 = myname;
15*5e96a66cSDavid du Colombier 	sysfatal("usage: %s"
16*5e96a66cSDavid du Colombier 		" [-Dt]"
17*5e96a66cSDavid du Colombier 		" [-c cmd]",
18*5e96a66cSDavid du Colombier 		myname);
19*5e96a66cSDavid du Colombier }
20*5e96a66cSDavid du Colombier 
21*5e96a66cSDavid du Colombier void
22*5e96a66cSDavid du Colombier main(int argc, char* argv[])
23*5e96a66cSDavid du Colombier {
24*5e96a66cSDavid du Colombier 	char **cmd, *p;
25*5e96a66cSDavid du Colombier 	int i, ncmd, tflag;
26*5e96a66cSDavid du Colombier 
27*5e96a66cSDavid du Colombier 	myname = argv[0];
28*5e96a66cSDavid du Colombier 	fmtinstall('D', dirfmt);
29*5e96a66cSDavid du Colombier 	fmtinstall('F', fcallfmt);
30*5e96a66cSDavid du Colombier 	fmtinstall('M', dirmodefmt);
31*5e96a66cSDavid du Colombier 	quotefmtinstall();
32*5e96a66cSDavid du Colombier 
33*5e96a66cSDavid du Colombier 	/*
34*5e96a66cSDavid du Colombier 	 * Insulate from the invoker's environment.
35*5e96a66cSDavid du Colombier 	 */
36*5e96a66cSDavid du Colombier 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
37*5e96a66cSDavid du Colombier 		sysfatal("rfork: %r");
38*5e96a66cSDavid du Colombier 
39*5e96a66cSDavid du Colombier 	close(0);
40*5e96a66cSDavid du Colombier 	open("/dev/null", OREAD);
41*5e96a66cSDavid du Colombier 	close(1);
42*5e96a66cSDavid du Colombier 	open("/dev/null", OWRITE);
43*5e96a66cSDavid du Colombier 
44*5e96a66cSDavid du Colombier 	cmd = nil;
45*5e96a66cSDavid du Colombier 	ncmd = tflag = 0;
46*5e96a66cSDavid du Colombier 
47*5e96a66cSDavid du Colombier 	vtAttach();
48*5e96a66cSDavid du Colombier 
49*5e96a66cSDavid du Colombier 	ARGBEGIN{
50*5e96a66cSDavid du Colombier 	case '?':
51*5e96a66cSDavid du Colombier 	default:
52*5e96a66cSDavid du Colombier 		usage();
53*5e96a66cSDavid du Colombier 		break;
54*5e96a66cSDavid du Colombier 	case 'D':
55*5e96a66cSDavid du Colombier 		Dflag ^= 1;
56*5e96a66cSDavid du Colombier 		break;
57*5e96a66cSDavid du Colombier 	case 'c':
58*5e96a66cSDavid du Colombier 		p = ARGF();
59*5e96a66cSDavid du Colombier 		if(p == nil)
60*5e96a66cSDavid du Colombier 			usage();
61*5e96a66cSDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
62*5e96a66cSDavid du Colombier 		cmd[ncmd++] = p;
63*5e96a66cSDavid du Colombier 		break;
64*5e96a66cSDavid du Colombier 	case 't':
65*5e96a66cSDavid du Colombier 		tflag = 1;
66*5e96a66cSDavid du Colombier 		break;
67*5e96a66cSDavid du Colombier 	}ARGEND
68*5e96a66cSDavid du Colombier 	if(argc != 0)
69*5e96a66cSDavid du Colombier 		usage();
70*5e96a66cSDavid du Colombier 
71*5e96a66cSDavid du Colombier 	consInit();
72*5e96a66cSDavid du Colombier 	cliInit();
73*5e96a66cSDavid du Colombier 	procInit();
74*5e96a66cSDavid du Colombier 	cmdInit();
75*5e96a66cSDavid du Colombier 	fsysInit();
76*5e96a66cSDavid du Colombier 	exclInit();
77*5e96a66cSDavid du Colombier 	fidInit();
78*5e96a66cSDavid du Colombier 
79*5e96a66cSDavid du Colombier 	srvInit();
80*5e96a66cSDavid du Colombier 	lstnInit();
81*5e96a66cSDavid du Colombier 	usersInit();
82*5e96a66cSDavid du Colombier 
83*5e96a66cSDavid du Colombier 	for(i = 0; i < ncmd; i++){
84*5e96a66cSDavid du Colombier 		if(cliExec(cmd[i]) == 0)
85*5e96a66cSDavid du Colombier 			break;
86*5e96a66cSDavid du Colombier 	}
87*5e96a66cSDavid du Colombier 	vtMemFree(cmd);
88*5e96a66cSDavid du Colombier 
89*5e96a66cSDavid du Colombier 	if(tflag && consTTY() == 0)
90*5e96a66cSDavid du Colombier 		consPrint("%s\n", vtGetError());
91*5e96a66cSDavid du Colombier 
92*5e96a66cSDavid du Colombier 	vtDetach();
93*5e96a66cSDavid du Colombier 	exits(0);
94*5e96a66cSDavid du Colombier }
95