xref: /plan9-contrib/sys/src/cmd/fossil/fossil.c (revision b8a11165c6411897fdf740a1fb2f87ac0998b113)
15e96a66cSDavid du Colombier #include "stdinc.h"
2fe853e23SDavid du Colombier #include <ctype.h>
35e96a66cSDavid du Colombier 
45e96a66cSDavid du Colombier #include "9.h"
55e96a66cSDavid du Colombier 
65e96a66cSDavid du Colombier int Dflag;
7*b8a11165SDavid du Colombier int mempcnt;			/* for 9fsys.c */
85e96a66cSDavid du Colombier char* none = "none";
9fe853e23SDavid du Colombier 
105e96a66cSDavid du Colombier static void
115e96a66cSDavid du Colombier usage(void)
125e96a66cSDavid du Colombier {
13*b8a11165SDavid du Colombier 	fprint(2, "usage: %s [-Dt] [-c cmd] [-f partition] [-m %%]\n", argv0);
14dc5a79c1SDavid du Colombier 	exits("usage");
15dc5a79c1SDavid du Colombier }
16dc5a79c1SDavid du Colombier 
17dc5a79c1SDavid du Colombier static void
18dc5a79c1SDavid du Colombier readCmdPart(char *file, char ***pcmd, int *pncmd)
19dc5a79c1SDavid du Colombier {
20dc5a79c1SDavid du Colombier 	char buf[1024+1], *f[1024];
21fe853e23SDavid du Colombier 	char tbuf[1024];
22dc5a79c1SDavid du Colombier 	int nf;
23dc5a79c1SDavid du Colombier 	int i, fd, n;
24fe853e23SDavid du Colombier 	char **cmd, *p;
25dc5a79c1SDavid du Colombier 	int ncmd;
26dc5a79c1SDavid du Colombier 
27dc5a79c1SDavid du Colombier 	cmd = *pcmd;
28dc5a79c1SDavid du Colombier 	ncmd = *pncmd;
29dc5a79c1SDavid du Colombier 
30dc5a79c1SDavid du Colombier 	if((fd = open(file, OREAD)) < 0)
31dc5a79c1SDavid du Colombier 		sysfatal("open %s: %r", file);
32dc5a79c1SDavid du Colombier 	if(seek(fd, 127*1024, 0) != 127*1024)
33dc5a79c1SDavid du Colombier 		sysfatal("seek %s 127kB: %r", file);
34dc5a79c1SDavid du Colombier 	n = readn(fd, buf, sizeof buf-1);
35dc5a79c1SDavid du Colombier 	if(n == 0)
36dc5a79c1SDavid du Colombier 		sysfatal("short read of %s at 127kB", file);
37dc5a79c1SDavid du Colombier 	if(n < 0)
38dc5a79c1SDavid du Colombier 		sysfatal("read %s: %r", file);
39dc5a79c1SDavid du Colombier 	buf[n] = 0;
40dc5a79c1SDavid du Colombier 	if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0)
41dc5a79c1SDavid du Colombier 		sysfatal("bad config magic in %s", file);
42dc5a79c1SDavid du Colombier 	nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n");
43dc5a79c1SDavid du Colombier 	for(i=0; i<nf; i++){
44dc5a79c1SDavid du Colombier 		if(f[i][0] == '#')
45dc5a79c1SDavid du Colombier 			continue;
46dc5a79c1SDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
47fe853e23SDavid du Colombier 		/* expand argument '*' to mean current file */
48fe853e23SDavid du Colombier 		if((p = strchr(f[i], '*')) && (p==f[i]||isspace(p[-1])) && (p[1]==0||isspace(p[1]))){
49fe853e23SDavid du Colombier 			memmove(tbuf, f[i], p-f[i]);
50fe853e23SDavid du Colombier 			strecpy(tbuf+(p-f[i]), tbuf+sizeof tbuf, file);
51fe853e23SDavid du Colombier 			strecpy(tbuf+strlen(tbuf), tbuf+sizeof tbuf, p+1);
52fe853e23SDavid du Colombier 			f[i] = tbuf;
53fe853e23SDavid du Colombier 		}
54dc5a79c1SDavid du Colombier 		cmd[ncmd++] = vtStrDup(f[i]);
55dc5a79c1SDavid du Colombier 	}
56dc5a79c1SDavid du Colombier 	close(fd);
57dc5a79c1SDavid du Colombier 	*pcmd = cmd;
58dc5a79c1SDavid du Colombier 	*pncmd = ncmd;
595e96a66cSDavid du Colombier }
605e96a66cSDavid du Colombier 
615e96a66cSDavid du Colombier void
625e96a66cSDavid du Colombier main(int argc, char* argv[])
635e96a66cSDavid du Colombier {
645e96a66cSDavid du Colombier 	char **cmd, *p;
655e96a66cSDavid du Colombier 	int i, ncmd, tflag;
665e96a66cSDavid du Colombier 
675e96a66cSDavid du Colombier 	fmtinstall('D', dirfmt);
685e96a66cSDavid du Colombier 	fmtinstall('F', fcallfmt);
695e96a66cSDavid du Colombier 	fmtinstall('M', dirmodefmt);
705e96a66cSDavid du Colombier 	quotefmtinstall();
715e96a66cSDavid du Colombier 
725e96a66cSDavid du Colombier 	/*
735e96a66cSDavid du Colombier 	 * Insulate from the invoker's environment.
745e96a66cSDavid du Colombier 	 */
755e96a66cSDavid du Colombier 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
765e96a66cSDavid du Colombier 		sysfatal("rfork: %r");
775e96a66cSDavid du Colombier 
785e96a66cSDavid du Colombier 	close(0);
795e96a66cSDavid du Colombier 	open("/dev/null", OREAD);
805e96a66cSDavid du Colombier 	close(1);
815e96a66cSDavid du Colombier 	open("/dev/null", OWRITE);
825e96a66cSDavid du Colombier 
835e96a66cSDavid du Colombier 	cmd = nil;
845e96a66cSDavid du Colombier 	ncmd = tflag = 0;
855e96a66cSDavid du Colombier 
865e96a66cSDavid du Colombier 	vtAttach();
875e96a66cSDavid du Colombier 
885e96a66cSDavid du Colombier 	ARGBEGIN{
895e96a66cSDavid du Colombier 	case '?':
905e96a66cSDavid du Colombier 	default:
915e96a66cSDavid du Colombier 		usage();
925e96a66cSDavid du Colombier 		break;
93*b8a11165SDavid du Colombier 	case 'c':
94*b8a11165SDavid du Colombier 		p = EARGF(usage());
95*b8a11165SDavid du Colombier 		currfsysname = p;
96*b8a11165SDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
97*b8a11165SDavid du Colombier 		cmd[ncmd++] = p;
98*b8a11165SDavid du Colombier 		break;
995e96a66cSDavid du Colombier 	case 'D':
1005e96a66cSDavid du Colombier 		Dflag ^= 1;
1015e96a66cSDavid du Colombier 		break;
102dc5a79c1SDavid du Colombier 	case 'f':
103dc5a79c1SDavid du Colombier 		p = EARGF(usage());
104*b8a11165SDavid du Colombier 		currfsysname = p;
105dc5a79c1SDavid du Colombier 		readCmdPart(p, &cmd, &ncmd);
106dc5a79c1SDavid du Colombier 		break;
107*b8a11165SDavid du Colombier 	case 'm':
108*b8a11165SDavid du Colombier 		mempcnt = atoi(EARGF(usage()));
109*b8a11165SDavid du Colombier 		if(mempcnt <= 0 || mempcnt >= 100)
110*b8a11165SDavid du Colombier 			usage();
1115e96a66cSDavid du Colombier 		break;
1125e96a66cSDavid du Colombier 	case 't':
1135e96a66cSDavid du Colombier 		tflag = 1;
1145e96a66cSDavid du Colombier 		break;
1155e96a66cSDavid du Colombier 	}ARGEND
1165e96a66cSDavid du Colombier 	if(argc != 0)
1175e96a66cSDavid du Colombier 		usage();
1185e96a66cSDavid du Colombier 
1195e96a66cSDavid du Colombier 	consInit();
1205e96a66cSDavid du Colombier 	cliInit();
12134e04225SDavid du Colombier 	msgInit();
12234e04225SDavid du Colombier 	conInit();
1235e96a66cSDavid du Colombier 	cmdInit();
1245e96a66cSDavid du Colombier 	fsysInit();
1255e96a66cSDavid du Colombier 	exclInit();
1265e96a66cSDavid du Colombier 	fidInit();
1275e96a66cSDavid du Colombier 
1285e96a66cSDavid du Colombier 	srvInit();
1295e96a66cSDavid du Colombier 	lstnInit();
1305e96a66cSDavid du Colombier 	usersInit();
1315e96a66cSDavid du Colombier 
132dc5a79c1SDavid du Colombier 	for(i = 0; i < ncmd; i++)
1335e96a66cSDavid du Colombier 		if(cliExec(cmd[i]) == 0)
134dc5a79c1SDavid du Colombier 			fprint(2, "%s: %R\n", cmd[i]);
1355e96a66cSDavid du Colombier 	vtMemFree(cmd);
1365e96a66cSDavid du Colombier 
1375e96a66cSDavid du Colombier 	if(tflag && consTTY() == 0)
1385e96a66cSDavid du Colombier 		consPrint("%s\n", vtGetError());
1395e96a66cSDavid du Colombier 
1405e96a66cSDavid du Colombier 	vtDetach();
1415e96a66cSDavid du Colombier 	exits(0);
1425e96a66cSDavid du Colombier }
143