#include #include #include #include #include "cons.h" #define BUFSIZ 4000 extern int outfd; extern int wctlout; int hostpid; void edie(void) { static int dead = 0; if(dead++ > 0) return; close(outfd); postnote(PNGROUP, getpid(), "exit"); } static int start_host(void) { int fd; cs = consctl(); if(cs == 0){ perror("consctl"); exits("consctl"); } if(wflag){ bind("#|", "/mnt/temp", MREPL); wctlout = open("/mnt/temp/data", OWRITE); } switch((hostpid = rfork(RFPROC|RFNAMEG|RFFDG|RFNOTEG))) { case 0: if(wflag) bind("/mnt/temp/data1", "/dev/wctl", MREPL); fd = open("/dev/cons", OREAD); dup(fd,0); if(fd != 0) close(fd); fd = open("/dev/cons", OWRITE); dup(fd,1); dup(fd,2); if(fd != 1 && fd !=2) close(fd); execl("/bin/rc","rcX",nil); fprint(2,"failed to start up rc\n"); _exits("rc"); case -1: fprint(2,"rc startup: fork error\n"); _exits("rc_fork"); } return open("/mnt/cons/cons/data", ORDWR); } void ebegin(int Ehost) { atexit(edie); einit(Emouse|Ekeyboard); outfd = start_host(); if( estart(Ehost, outfd, BUFSIZ) != Ehost) { exits("event init error"); } } void send_interrupt(void) { postnote(PNGROUP, hostpid,"interrupt"); }