xref: /plan9/sys/src/cmd/vt/event.c (revision ac84fd08a8c8d942164771116b1cd72c58cf8dc5)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <event.h>
57dd7cddfSDavid du Colombier #include "cons.h"
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier #define	BUFSIZ	4000
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier extern int	outfd;
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier int	hostpid;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier void
edie(void)147dd7cddfSDavid du Colombier edie(void)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier 	static int dead = 0;
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier 	if(dead++ > 0) return;
197dd7cddfSDavid du Colombier 	close(outfd);
207dd7cddfSDavid du Colombier 	postnote(PNGROUP, getpid(), "exit");
217dd7cddfSDavid du Colombier }
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier static int
start_host(void)247dd7cddfSDavid du Colombier start_host(void)
257dd7cddfSDavid du Colombier {
267dd7cddfSDavid du Colombier 	int	fd;
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier 	cs = consctl();
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier 	switch((hostpid = rfork(RFPROC|RFNAMEG|RFFDG|RFNOTEG))) {
317dd7cddfSDavid du Colombier 	case 0:
327dd7cddfSDavid du Colombier 		fd = open("/dev/cons", OREAD);
337dd7cddfSDavid du Colombier 		dup(fd,0);
347dd7cddfSDavid du Colombier 		if(fd != 0)
357dd7cddfSDavid du Colombier 			close(fd);
367dd7cddfSDavid du Colombier 		fd = open("/dev/cons", OWRITE);
377dd7cddfSDavid du Colombier 		dup(fd,1);
387dd7cddfSDavid du Colombier 		dup(fd,2);
397dd7cddfSDavid du Colombier 		if(fd != 1 && fd !=2)
407dd7cddfSDavid du Colombier 			close(fd);
41*f19e7b74SDavid du Colombier 		execl("/bin/rc","rcX",nil);
427dd7cddfSDavid du Colombier 		fprint(2,"failed to start up rc\n");
437dd7cddfSDavid du Colombier 		_exits("rc");
447dd7cddfSDavid du Colombier 	case -1:
457dd7cddfSDavid du Colombier 		fprint(2,"rc startup: fork error\n");
467dd7cddfSDavid du Colombier 		_exits("rc_fork");
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier 	return open("/mnt/cons/cons/data", ORDWR);
507dd7cddfSDavid du Colombier }
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier void
ebegin(int Ehost)537dd7cddfSDavid du Colombier ebegin(int Ehost)
547dd7cddfSDavid du Colombier {
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier 	atexit(edie);
577dd7cddfSDavid du Colombier 
587dd7cddfSDavid du Colombier 	einit(Emouse|Ekeyboard);
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier 	outfd = start_host();
617dd7cddfSDavid du Colombier 	if( estart(Ehost, outfd, BUFSIZ) != Ehost) {
627dd7cddfSDavid du Colombier 		exits("event init error");
637dd7cddfSDavid du Colombier 	}
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier void
send_interrupt(void)677dd7cddfSDavid du Colombier send_interrupt(void)
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier 	postnote(PNGROUP, hostpid,"interrupt");
707dd7cddfSDavid du Colombier }
71