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