xref: /plan9/sys/src/cmd/fossil/fossil.c (revision 7f1bc48a5d5ca136336b74dbd3399d0216d468c3)
15e96a66cSDavid du Colombier #include "stdinc.h"
25e96a66cSDavid du Colombier 
35e96a66cSDavid du Colombier #include "9.h"
45e96a66cSDavid du Colombier 
55e96a66cSDavid du Colombier int Dflag;
65e96a66cSDavid du Colombier char* none = "none";
75e96a66cSDavid du Colombier int stdfd[2];
85e96a66cSDavid du Colombier 
95e96a66cSDavid du Colombier static void
105e96a66cSDavid du Colombier usage(void)
115e96a66cSDavid du Colombier {
12dc5a79c1SDavid du Colombier 	fprint(2, "usage: %s"
135e96a66cSDavid du Colombier 		" [-Dt]"
14dc5a79c1SDavid du Colombier 		" [-c cmd]"
15*7f1bc48aSDavid du Colombier 		" [-f partition]\n"
16dc5a79c1SDavid du Colombier 		, argv0);
17dc5a79c1SDavid du Colombier 	exits("usage");
18dc5a79c1SDavid du Colombier }
19dc5a79c1SDavid du Colombier 
20dc5a79c1SDavid du Colombier static void
21dc5a79c1SDavid du Colombier readCmdPart(char *file, char ***pcmd, int *pncmd)
22dc5a79c1SDavid du Colombier {
23dc5a79c1SDavid du Colombier 	char buf[1024+1], *f[1024];
24dc5a79c1SDavid du Colombier 	int nf;
25dc5a79c1SDavid du Colombier 	int i, fd, n;
26dc5a79c1SDavid du Colombier 	char **cmd;
27dc5a79c1SDavid du Colombier 	int ncmd;
28dc5a79c1SDavid du Colombier 
29dc5a79c1SDavid du Colombier 	cmd = *pcmd;
30dc5a79c1SDavid du Colombier 	ncmd = *pncmd;
31dc5a79c1SDavid du Colombier 
32dc5a79c1SDavid du Colombier 	if((fd = open(file, OREAD)) < 0)
33dc5a79c1SDavid du Colombier 		sysfatal("open %s: %r", file);
34dc5a79c1SDavid du Colombier 	if(seek(fd, 127*1024, 0) != 127*1024)
35dc5a79c1SDavid du Colombier 		sysfatal("seek %s 127kB: %r", file);
36dc5a79c1SDavid du Colombier 	n = readn(fd, buf, sizeof buf-1);
37dc5a79c1SDavid du Colombier 	if(n == 0)
38dc5a79c1SDavid du Colombier 		sysfatal("short read of %s at 127kB", file);
39dc5a79c1SDavid du Colombier 	if(n < 0)
40dc5a79c1SDavid du Colombier 		sysfatal("read %s: %r", file);
41dc5a79c1SDavid du Colombier 	buf[n] = 0;
42dc5a79c1SDavid du Colombier 	if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0)
43dc5a79c1SDavid du Colombier 		sysfatal("bad config magic in %s", file);
44dc5a79c1SDavid du Colombier 	nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n");
45dc5a79c1SDavid du Colombier 	for(i=0; i<nf; i++){
46dc5a79c1SDavid du Colombier 		if(f[i][0] == '#')
47dc5a79c1SDavid du Colombier 			continue;
48dc5a79c1SDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
49dc5a79c1SDavid du Colombier 		cmd[ncmd++] = vtStrDup(f[i]);
50dc5a79c1SDavid du Colombier 	}
51dc5a79c1SDavid du Colombier 	close(fd);
52dc5a79c1SDavid du Colombier 	*pcmd = cmd;
53dc5a79c1SDavid du Colombier 	*pncmd = ncmd;
545e96a66cSDavid du Colombier }
555e96a66cSDavid du Colombier 
565e96a66cSDavid du Colombier void
575e96a66cSDavid du Colombier main(int argc, char* argv[])
585e96a66cSDavid du Colombier {
595e96a66cSDavid du Colombier 	char **cmd, *p;
605e96a66cSDavid du Colombier 	int i, ncmd, tflag;
615e96a66cSDavid du Colombier 
625e96a66cSDavid du Colombier 	fmtinstall('D', dirfmt);
635e96a66cSDavid du Colombier 	fmtinstall('F', fcallfmt);
645e96a66cSDavid du Colombier 	fmtinstall('M', dirmodefmt);
655e96a66cSDavid du Colombier 	quotefmtinstall();
665e96a66cSDavid du Colombier 
675e96a66cSDavid du Colombier 	/*
685e96a66cSDavid du Colombier 	 * Insulate from the invoker's environment.
695e96a66cSDavid du Colombier 	 */
705e96a66cSDavid du Colombier 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
715e96a66cSDavid du Colombier 		sysfatal("rfork: %r");
725e96a66cSDavid du Colombier 
735e96a66cSDavid du Colombier 	close(0);
745e96a66cSDavid du Colombier 	open("/dev/null", OREAD);
755e96a66cSDavid du Colombier 	close(1);
765e96a66cSDavid du Colombier 	open("/dev/null", OWRITE);
775e96a66cSDavid du Colombier 
785e96a66cSDavid du Colombier 	cmd = nil;
795e96a66cSDavid du Colombier 	ncmd = tflag = 0;
805e96a66cSDavid du Colombier 
815e96a66cSDavid du Colombier 	vtAttach();
825e96a66cSDavid du Colombier 
835e96a66cSDavid du Colombier 	ARGBEGIN{
845e96a66cSDavid du Colombier 	case '?':
855e96a66cSDavid du Colombier 	default:
865e96a66cSDavid du Colombier 		usage();
875e96a66cSDavid du Colombier 		break;
885e96a66cSDavid du Colombier 	case 'D':
895e96a66cSDavid du Colombier 		Dflag ^= 1;
905e96a66cSDavid du Colombier 		break;
91dc5a79c1SDavid du Colombier 	case 'f':
92dc5a79c1SDavid du Colombier 		p = EARGF(usage());
93dc5a79c1SDavid du Colombier 		readCmdPart(p, &cmd, &ncmd);
94dc5a79c1SDavid du Colombier 		break;
955e96a66cSDavid du Colombier 	case 'c':
96dc5a79c1SDavid du Colombier 		p = EARGF(usage());
975e96a66cSDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
985e96a66cSDavid du Colombier 		cmd[ncmd++] = p;
995e96a66cSDavid du Colombier 		break;
1005e96a66cSDavid du Colombier 	case 't':
1015e96a66cSDavid du Colombier 		tflag = 1;
1025e96a66cSDavid du Colombier 		break;
1035e96a66cSDavid du Colombier 	}ARGEND
1045e96a66cSDavid du Colombier 	if(argc != 0)
1055e96a66cSDavid du Colombier 		usage();
1065e96a66cSDavid du Colombier 
1075e96a66cSDavid du Colombier 	consInit();
1085e96a66cSDavid du Colombier 	cliInit();
10934e04225SDavid du Colombier 	msgInit();
11034e04225SDavid du Colombier 	conInit();
1115e96a66cSDavid du Colombier 	cmdInit();
1125e96a66cSDavid du Colombier 	fsysInit();
1135e96a66cSDavid du Colombier 	exclInit();
1145e96a66cSDavid du Colombier 	fidInit();
1155e96a66cSDavid du Colombier 
1165e96a66cSDavid du Colombier 	srvInit();
1175e96a66cSDavid du Colombier 	lstnInit();
1185e96a66cSDavid du Colombier 	usersInit();
1195e96a66cSDavid du Colombier 
120dc5a79c1SDavid du Colombier 	for(i = 0; i < ncmd; i++)
1215e96a66cSDavid du Colombier 		if(cliExec(cmd[i]) == 0)
122dc5a79c1SDavid du Colombier 			fprint(2, "%s: %R\n", cmd[i]);
1235e96a66cSDavid du Colombier 	vtMemFree(cmd);
1245e96a66cSDavid du Colombier 
1255e96a66cSDavid du Colombier 	if(tflag && consTTY() == 0)
1265e96a66cSDavid du Colombier 		consPrint("%s\n", vtGetError());
1275e96a66cSDavid du Colombier 
1285e96a66cSDavid du Colombier 	vtDetach();
1295e96a66cSDavid du Colombier 	exits(0);
1305e96a66cSDavid du Colombier }
131