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