EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

STDIO.c (1766B)


      1 #include <EGong/Interfaces.h>
      2 #include <EGong/Interfaces/CMD.h>
      3 #include <EGong/Util/Log.h>
      4 #include <EGong/Util/Waiter.h>
      5 #include <unistd.h>
      6 #include <errno.h>
      7 #include <stdlib.h>
      8 
      9 #ifdef _WIN32
     10 	#include <stdio.h>
     11 #else
     12 	#include <fcntl.h>
     13 #endif
     14 
     15 int EGong_if_stdio_setup(struct EGong_interface *interface){
     16 	#ifdef _WIN32
     17 	#else
     18 		int flags;
     19 		flags = fcntl(STDIN_FILENO, F_GETFL);
     20 		flags = fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
     21 	#endif
     22 	if(EGong_waiter_add(STDIN_FILENO, EGONG_WAITER_FD)<0){
     23 		return EGONG_INTERFACE_RETURN_ERROR;
     24 	}
     25 	return EGONG_INTERFACE_RETURN_OK;
     26 }
     27 
     28 int EGong_if_stdio_cmd(char *msg){
     29 	const char *data[5];
     30 	unsigned int i=0,arg=0;
     31 	while(msg[i]!='\0'){
     32 		if(msg[i]==' '){
     33 			msg[i]='\0';
     34 			data[arg]=&msg[i+1];
     35 			arg++;
     36 		}
     37 		i++;
     38 	}
     39 	struct EGong_command_if_cmd *cmd=EGong_if_cmd_get_from_char(msg);
     40 	if(cmd==NULL){
     41 		write(STDOUT_FILENO, "Command unknown\n", sizeof("Command unknown\n"));
     42 	}
     43 	else{
     44 		EGong_command_exec((struct EGong_command *) cmd, (void **)data);
     45 	}
     46 	return EGONG_INTERFACE_RETURN_OK;
     47 }
     48 
     49 int EGong_if_stdio_cycle(struct EGong_interface *interface, String *msg, char **dest){
     50 	char buffer[50];
     51 	int ret=read(STDIN_FILENO, buffer, 50);
     52 	#ifdef _WIN32
     53 	if(ret<0&&errno!=EAGAIN){
     54 	#else
     55 	if(ret<0&&errno!=EAGAIN&&errno!=EWOULDBLOCK){
     56 	#endif
     57 		return EGONG_INTERFACE_RETURN_ERROR;
     58 	}
     59 	else if(ret>0){
     60 		buffer[ret-1]='\0';
     61 		if(buffer[0]=='/'){
     62 			EGong_if_stdio_cmd(&buffer[1]);
     63 		}
     64 		else{
     65 			msg->data=malloc(ret);
     66 			strncpy(msg->data, buffer, ret);
     67 		}
     68 	}
     69 	return EGONG_INTERFACE_RETURN_OK;
     70 }
     71 int EGong_if_stdio_display(struct EGong_interface *interface, const String *msg){
     72 	write(STDOUT_FILENO,msg->data,msg->length);
     73 	write(STDOUT_FILENO, "\n", sizeof("\n"));
     74 	return EGONG_INTERFACE_RETURN_OK;
     75 }