void main() { unsigned char temp; unsigned char flags; char keyTemp[2] = { 0, }; int i = 0; printstring(0, 10, "Switch To IA-32e Mode Success!"); printstring(0, 11, "IA-32e C Language Kernel Start!"); printstring(0, 12, "GDT initialize and switch IA-32e Mode.."); initGDTTableAndTSS(); loadGDTR(GDTR_STARTADDRESS); printstring(40, 12, "Pass"); printstring(0, 13, "TSS Segement Load..."); loadTR(GDT_TSSSEGMENT); printstring(22, 13, "Pass"); printstring(0, 14, "IDT Initialize..."); loadIDTR(IDTR_STARTADDRESS); printstring(18, 14, "Pass"); printstring(0, 15, "Keyboard Activate ..."); if(activateKeyboard()) { printstring(22, 15, "Pass"); changeKeyboardLED(0, 0, 0); } else { printstring(22, 15, "Pass"); while(1); } while(1) { if(isOutputBufferFull()) { temp = getKeyboardScanCode(); if(convertScanCodeToASCIICode(temp, &(keyTemp[0]), &flags)) { if(flags & KEY_FLAGS_DOWN) { printstring(i++, 16, keyTemp); } } } } while(1); }
/** * Advance for online execution */ void Redirector::advanceOnline(){ const int MAX=JAIL_NET_BUFFER_SIZE; //Buffer size to read const int POLLBAD=POLLERR|POLLHUP|POLLNVAL; const int POLLREAD=POLLIN|POLLPRI; const int polltimeout= 100; // 0.1 sec States oldstate=state; switch(state){ case begin:{ if(fdps<0) { state=error; //fd pseudo terminal error break; } Util::fdblock(fdps,false); state=connected; case connected:{ //Poll to write and read from program and net if(ws->isReadBuffered()) programbuf += ws->receive(); struct pollfd devices[2]; devices[0].fd=fdps; devices[1].fd=ws->getSocket(); char buf[MAX]; if(programbuf.size()) devices[0].events=POLLREAD|POLLOUT; else devices[0].events=POLLREAD; devices[1].events=POLLREAD; int res=poll(devices,2,polltimeout); if(res==-1) { //Error syslog(LOG_INFO,"pool error %m"); state = error; break; } if(res==0) break; //Nothing to do syslog(LOG_INFO,"poll: program %d %s", devices[0].revents,eventsToString(devices[0].revents).c_str()); if(devices[1].revents & POLLREAD) programbuf += ws->receive(); if((devices[0].revents & POLLREAD) && !isOutputBufferFull()){ //Read program output int readsize=read(fdps,buf,MAX); if(readsize <= 0){ syslog(LOG_INFO,"program output read error: %m"); state=ending; break; //program output read error } if(readsize >0) { ws->send(string(buf,readsize)); } } if(programbuf.size()>0 && (devices[0].revents & POLLOUT)){ //Write to program int written=write(fdps,programbuf.data(),programbuf.size()); if(written <=0) { syslog(LOG_INFO,"Write to program error: %m"); state=ending; break; } programbuf.erase(0,written); } if((devices[0].revents & POLLBAD) && !(devices[0].revents & POLLREAD)){ syslog(LOG_INFO,"Program end or I/O error: %m %d %s",devices[0].revents,eventsToString(devices[0].revents).c_str()); state=ending; break; } break; } case ending:{ if(isSilent()){ syslog(LOG_INFO,"Program terminated with no output"); ws->send("\nProgram terminated with no output\n"); } if(messageBuf.size()>0){ syslog(LOG_INFO,"Add jail message to output"); ws->send(messageBuf); messageBuf=""; } } state=end; /* no break */ case end: case error: if(ws->isClosed()) usleep(50000); else ws->close(); break; } } if(oldstate != state) syslog(LOG_INFO,"New redirector state %d => %d",oldstate,state); }