X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=src%2Fivac.c;h=3aad5998c56104ef3a7a598d26ba7c54d61ab3e7;hb=c19ed5019b55ed603dc10ff6f8ea47bf25058589;hp=43b7ef6545f23cc5826ae92ffd8971de08093ce1;hpb=eb0f685570bbc4e1f0f97d6d1bad5a905a1e036f;p=my-code%2Fivac.git diff --git a/src/ivac.c b/src/ivac.c index 43b7ef6..3aad599 100644 --- a/src/ivac.c +++ b/src/ivac.c @@ -25,6 +25,20 @@ #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 +46,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; } @@ -129,6 +161,22 @@ int ivac_send_info(int channel,t_ivac *ivac) { return SUCCESS; } +int ivac_send_quit(int channel,t_ivac *ivac) { + + char data[7]; /* one more for \0 */ + + data[0]=IVAC_SEND_QUIT; + data[1]=4; + strcpy(data+2,"quit"); + + if(network_send(ivac->net.connection[channel].fd,data,6)==N_ERROR) { + puts("[ivac] ivac_send_quit failed"); + return ERROR; + } + + return SUCCESS; +} + int ivac_receive_info(int channel,t_ivac *ivac) { char data[SEND_N_MAX]; @@ -158,8 +206,16 @@ int ivac_receive_info(int channel,t_ivac *ivac) { ivac->challenger[channel].av_cap|=data[count+3]; count+=4; break; + case IVAC_SEND_QUIT: + if(!(strncmp(data+count+2,"quit",data[1]))) + event_math(ivac->net.connection[channel].fd,&(ivac->event), + READ,REMOVE); + network_close(&(ivac->net),channel); + memset(&(ivac->challenger[channel]),0,sizeof(t_challenger)); + count+=6; default: - puts("[ivac] ivac_receive_info, unknown character"); + printf("[ivac] ivac_receive_info, unknown character: (%c,%02x\n", + data[count]); return ERROR; break; } @@ -200,6 +256,7 @@ int ivac_event_cb(t_event *event,void *ptr) { /* remote is sending info */ if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds))) ivac_receive_info(channel,ivac); + ivac_display_content(ivac); } } @@ -262,6 +319,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))) { @@ -306,11 +369,16 @@ int ivac_parse_command(t_input *input,void *ptr) { if((arg[1][0]>='0')&&(arg[1][0]<='9')) channel=atoi(arg[1]); else channel=-1; if((channel>=0)&&(channelnet),channel); - if(i==N_E_NC) - sprintf(c_str,"channel %02d: no active connection",channel); - else + if(ivac->net.connection[channel].status&C_ESTABL) { + ivac_send_quit(channel,ivac); + event_math(ivac->net.connection[channel].fd,&(ivac->event), + READ,REMOVE); + network_close(&(ivac->net),channel); sprintf(c_str,"channel %02d: connection closed",channel); + memset(&(ivac->challenger[channel]),0,sizeof(t_challenger)); + } + else + sprintf(c_str,"channel %02d: no active connection",channel); } else sprintf(c_str,"invalid argument: '%s'",arg[1]); }