X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fivac.git;a=blobdiff_plain;f=src%2Fivac.c;h=e3e206013aee7ba74ef556cb7ec53bbf1df44418;hp=0108131e4a9e9e2ad3b5ab5e646fddbfeb2510bb;hb=44d1396bcdd42a518855981fc8aa0b0fbc665231;hpb=b5512e7ee393a12bffc0b3fecabe515a2964c26b diff --git a/src/ivac.c b/src/ivac.c index 0108131..e3e2060 100644 --- a/src/ivac.c +++ b/src/ivac.c @@ -22,9 +22,25 @@ */ // #define USE_NCURSES +/* dont care about ncurses .. go for gtk(2)! */ +#define USE_GTK #include "ivac.h" +int usage(void) { + + puts(""); + puts("usage: ivac "); + puts(""); + puts("options:"); + puts("-h \t\t show this help"); + puts("-n \t specify your name"); + puts("-p \t specify port to listen for incoming connections"); + puts(""); + + return SUCCESS; +} + int main(int argc,char **argv) { /* TESTING BY NOW */ @@ -32,13 +48,31 @@ int main(int argc,char **argv) { t_ivac ivac; int i; - if(argc!=2) { - printf("\nusage: %s \n\n",argv[0]); - return ERROR; + /* default values */ + strcpy(ivac.username,"ivac"); + ivac.net.l_port=IVAC_LISTEN_PORT; + + /* parse argv and change default values */ + for(i=1;inet)); input_shutdown(&(ivac->input)); event_stop(&(ivac->event)); - // display_shutdown(&(ivac->display)); +#ifdef USE_NCURSES + display_shutdown(&(ivac->display)); +#endif return SUCCESS; } @@ -131,7 +165,7 @@ int ivac_send_info(int channel,t_ivac *ivac) { int ivac_send_quit(int channel,t_ivac *ivac) { - char data[6]; + char data[7]; /* one more for \0 */ data[0]=IVAC_SEND_QUIT; data[1]=4; @@ -148,6 +182,7 @@ int ivac_send_quit(int channel,t_ivac *ivac) { int ivac_receive_info(int channel,t_ivac *ivac) { char data[SEND_N_MAX]; + char c_str[IVAC_CONSOLE_STRING_LEN]; int count,length; count=0; @@ -176,17 +211,25 @@ int ivac_receive_info(int channel,t_ivac *ivac) { break; case IVAC_SEND_QUIT: if(!(strncmp(data+count+2,"quit",data[1]))) + sprintf(c_str,"channel %02d: connection closed by remote host", + channel); event_math(ivac->net.connection[channel].fd,&(ivac->event), READ,REMOVE); network_close(&(ivac->net),channel); + memset(&(ivac->challenger[channel]),0,sizeof(t_challenger)); + ivac_add_to_monitor(ivac,c_str); + count+=6; + break; default: - puts("[ivac] ivac_receive_info, unknown character"); + sprintf(c_str,"ivac_receive_info, unknown character: 0x%02x\n", + data[count]); + ivac_add_to_monitor(ivac,c_str); return ERROR; break; } } - return SUCCESS; + return length; } int ivac_event_cb(t_event *event,void *ptr) { @@ -219,9 +262,15 @@ int ivac_event_cb(t_event *event,void *ptr) { for(channel=0;channelnet.connection[channel].status&C_ESTABL) { /* remote is sending info */ - if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds))) - ivac_receive_info(channel,ivac); - // ivac_display_content(ivac); + if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds))) { + if(ivac_receive_info(channel,ivac)==0) { + event_math(ivac->net.connection[channel].fd,event,READ,REMOVE); + network_close(&(ivac->net),channel); + sprintf(c_str,"channel %02d: broken pipe - disconnected",channel); + ivac_add_to_monitor(ivac,c_str); + } + ivac_display_content(ivac); + } } } @@ -284,6 +333,12 @@ int ivac_parse_command(t_input *input,void *ptr) { if(!(strncmp(arg[0],"quit",4))) { valid=1; sprintf(c_str,"ivac shutdown ..."); + for(i=0;inet.connection[i].status&C_ESTABL) { + ivac_send_quit(i,ivac); + network_close(&(ivac->net),i); + } + } ivac_shutdown(ivac); } if(!(strncmp(arg[0],"set",3))) {