xref: /plan9-contrib/sys/src/cmd/fossil/fossil.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
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 char* myname = "numpty";
105e96a66cSDavid du Colombier 
115e96a66cSDavid du Colombier static void
125e96a66cSDavid du Colombier usage(void)
135e96a66cSDavid du Colombier {
145e96a66cSDavid du Colombier 	argv0 = myname;
155e96a66cSDavid du Colombier 	sysfatal("usage: %s"
165e96a66cSDavid du Colombier 		" [-Dt]"
175e96a66cSDavid du Colombier 		" [-c cmd]",
185e96a66cSDavid du Colombier 		myname);
195e96a66cSDavid du Colombier }
205e96a66cSDavid du Colombier 
215e96a66cSDavid du Colombier void
225e96a66cSDavid du Colombier main(int argc, char* argv[])
235e96a66cSDavid du Colombier {
245e96a66cSDavid du Colombier 	char **cmd, *p;
255e96a66cSDavid du Colombier 	int i, ncmd, tflag;
265e96a66cSDavid du Colombier 
275e96a66cSDavid du Colombier 	myname = argv[0];
285e96a66cSDavid du Colombier 	fmtinstall('D', dirfmt);
295e96a66cSDavid du Colombier 	fmtinstall('F', fcallfmt);
305e96a66cSDavid du Colombier 	fmtinstall('M', dirmodefmt);
315e96a66cSDavid du Colombier 	quotefmtinstall();
325e96a66cSDavid du Colombier 
335e96a66cSDavid du Colombier 	/*
345e96a66cSDavid du Colombier 	 * Insulate from the invoker's environment.
355e96a66cSDavid du Colombier 	 */
365e96a66cSDavid du Colombier 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
375e96a66cSDavid du Colombier 		sysfatal("rfork: %r");
385e96a66cSDavid du Colombier 
395e96a66cSDavid du Colombier 	close(0);
405e96a66cSDavid du Colombier 	open("/dev/null", OREAD);
415e96a66cSDavid du Colombier 	close(1);
425e96a66cSDavid du Colombier 	open("/dev/null", OWRITE);
435e96a66cSDavid du Colombier 
445e96a66cSDavid du Colombier 	cmd = nil;
455e96a66cSDavid du Colombier 	ncmd = tflag = 0;
465e96a66cSDavid du Colombier 
475e96a66cSDavid du Colombier 	vtAttach();
485e96a66cSDavid du Colombier 
495e96a66cSDavid du Colombier 	ARGBEGIN{
505e96a66cSDavid du Colombier 	case '?':
515e96a66cSDavid du Colombier 	default:
525e96a66cSDavid du Colombier 		usage();
535e96a66cSDavid du Colombier 		break;
545e96a66cSDavid du Colombier 	case 'D':
555e96a66cSDavid du Colombier 		Dflag ^= 1;
565e96a66cSDavid du Colombier 		break;
575e96a66cSDavid du Colombier 	case 'c':
585e96a66cSDavid du Colombier 		p = ARGF();
595e96a66cSDavid du Colombier 		if(p == nil)
605e96a66cSDavid du Colombier 			usage();
615e96a66cSDavid du Colombier 		cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
625e96a66cSDavid du Colombier 		cmd[ncmd++] = p;
635e96a66cSDavid du Colombier 		break;
645e96a66cSDavid du Colombier 	case 't':
655e96a66cSDavid du Colombier 		tflag = 1;
665e96a66cSDavid du Colombier 		break;
675e96a66cSDavid du Colombier 	}ARGEND
685e96a66cSDavid du Colombier 	if(argc != 0)
695e96a66cSDavid du Colombier 		usage();
705e96a66cSDavid du Colombier 
715e96a66cSDavid du Colombier 	consInit();
725e96a66cSDavid du Colombier 	cliInit();
73*34e04225SDavid du Colombier 	msgInit();
74*34e04225SDavid du Colombier 	conInit();
755e96a66cSDavid du Colombier 	cmdInit();
765e96a66cSDavid du Colombier 	fsysInit();
775e96a66cSDavid du Colombier 	exclInit();
785e96a66cSDavid du Colombier 	fidInit();
795e96a66cSDavid du Colombier 
805e96a66cSDavid du Colombier 	srvInit();
815e96a66cSDavid du Colombier 	lstnInit();
825e96a66cSDavid du Colombier 	usersInit();
835e96a66cSDavid du Colombier 
845e96a66cSDavid du Colombier 	for(i = 0; i < ncmd; i++){
855e96a66cSDavid du Colombier 		if(cliExec(cmd[i]) == 0)
865e96a66cSDavid du Colombier 			break;
875e96a66cSDavid du Colombier 	}
885e96a66cSDavid du Colombier 	vtMemFree(cmd);
895e96a66cSDavid du Colombier 
905e96a66cSDavid du Colombier 	if(tflag && consTTY() == 0)
915e96a66cSDavid du Colombier 		consPrint("%s\n", vtGetError());
925e96a66cSDavid du Colombier 
935e96a66cSDavid du Colombier 	vtDetach();
945e96a66cSDavid du Colombier 	exits(0);
955e96a66cSDavid du Colombier }
96