xref: /plan9/sys/src/cmd/fossil/fossil.c (revision ff8c3af2f44d95267f67219afa20ba82ff6cf7e4)
1 #include "stdinc.h"
2 
3 #include "9.h"
4 
5 int Dflag;
6 char* none = "none";
7 int stdfd[2];
8 
9 static void
10 usage(void)
11 {
12 	fprint(2, "usage: %s"
13 		" [-Dt]"
14 		" [-c cmd]"
15 		" [-f partition]"
16 		, argv0);
17 	exits("usage");
18 }
19 
20 static void
21 readCmdPart(char *file, char ***pcmd, int *pncmd)
22 {
23 	char buf[1024+1], *f[1024];
24 	int nf;
25 	int i, fd, n;
26 	char **cmd;
27 	int ncmd;
28 
29 	cmd = *pcmd;
30 	ncmd = *pncmd;
31 
32 	if((fd = open(file, OREAD)) < 0)
33 		sysfatal("open %s: %r", file);
34 	if(seek(fd, 127*1024, 0) != 127*1024)
35 		sysfatal("seek %s 127kB: %r", file);
36 	n = readn(fd, buf, sizeof buf-1);
37 	if(n == 0)
38 		sysfatal("short read of %s at 127kB", file);
39 	if(n < 0)
40 		sysfatal("read %s: %r", file);
41 	buf[n] = 0;
42 	if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0)
43 		sysfatal("bad config magic in %s", file);
44 	nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n");
45 	for(i=0; i<nf; i++){
46 		if(f[i][0] == '#')
47 			continue;
48 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
49 		cmd[ncmd++] = vtStrDup(f[i]);
50 	}
51 	close(fd);
52 	*pcmd = cmd;
53 	*pncmd = ncmd;
54 }
55 
56 void
57 main(int argc, char* argv[])
58 {
59 	char **cmd, *p;
60 	int i, ncmd, tflag;
61 
62 	fmtinstall('D', dirfmt);
63 	fmtinstall('F', fcallfmt);
64 	fmtinstall('M', dirmodefmt);
65 	quotefmtinstall();
66 
67 	/*
68 	 * Insulate from the invoker's environment.
69 	 */
70 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
71 		sysfatal("rfork: %r");
72 
73 	close(0);
74 	open("/dev/null", OREAD);
75 	close(1);
76 	open("/dev/null", OWRITE);
77 
78 	cmd = nil;
79 	ncmd = tflag = 0;
80 
81 	vtAttach();
82 
83 	ARGBEGIN{
84 	case '?':
85 	default:
86 		usage();
87 		break;
88 	case 'D':
89 		Dflag ^= 1;
90 		break;
91 	case 'f':
92 		p = EARGF(usage());
93 		readCmdPart(p, &cmd, &ncmd);
94 		break;
95 	case 'c':
96 		p = EARGF(usage());
97 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
98 		cmd[ncmd++] = p;
99 		break;
100 	case 't':
101 		tflag = 1;
102 		break;
103 	}ARGEND
104 	if(argc != 0)
105 		usage();
106 
107 	consInit();
108 	cliInit();
109 	msgInit();
110 	conInit();
111 	cmdInit();
112 	fsysInit();
113 	exclInit();
114 	fidInit();
115 
116 	srvInit();
117 	lstnInit();
118 	usersInit();
119 
120 	for(i = 0; i < ncmd; i++)
121 		if(cliExec(cmd[i]) == 0)
122 			fprint(2, "%s: %R\n", cmd[i]);
123 	vtMemFree(cmd);
124 
125 	if(tflag && consTTY() == 0)
126 		consPrint("%s\n", vtGetError());
127 
128 	vtDetach();
129 	exits(0);
130 }
131