Example #1
0
File: main.c Project: blogcin/OS
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);
}