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 }