projects
/
my-code
/
ivac.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
also memset challenger struct when receiving quit
[my-code/ivac.git]
/
src
/
ivac.c
diff --git
a/src/ivac.c
b/src/ivac.c
index
f4f6952
..
4fede22
100644
(file)
--- a/
src/ivac.c
+++ b/
src/ivac.c
@@
-129,6
+129,22
@@
int ivac_send_info(int channel,t_ivac *ivac) {
return SUCCESS;
}
return SUCCESS;
}
+int ivac_send_quit(int channel,t_ivac *ivac) {
+
+ char data[6];
+
+ 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];
int ivac_receive_info(int channel,t_ivac *ivac) {
char data[SEND_N_MAX];
@@
-158,6
+174,12
@@
int ivac_receive_info(int channel,t_ivac *ivac) {
ivac->challenger[channel].av_cap|=data[count+3];
count+=4;
break;
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));
default:
puts("[ivac] ivac_receive_info, unknown character");
return ERROR;
default:
puts("[ivac] ivac_receive_info, unknown character");
return ERROR;
@@
-184,7
+206,7
@@
int ivac_event_cb(t_event *event,void *ptr) {
else if(channel==N_E_MAXC)
sprintf(c_str,"maximum connections reached");
else {
else if(channel==N_E_MAXC)
sprintf(c_str,"maximum connections reached");
else {
- sprintf(c_str,"
established connection from %s port %d on channel %d\n
",
+ sprintf(c_str,"
connection from %s port %d on channel %d
",
ivac->net.connection[channel].ip,
ivac->net.connection[channel].port,channel);
ivac_add_to_monitor(ivac,c_str);
ivac->net.connection[channel].ip,
ivac->net.connection[channel].port,channel);
ivac_add_to_monitor(ivac,c_str);
@@
-200,6
+222,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);
/* remote is sending info */
if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds)))
ivac_receive_info(channel,ivac);
+ // ivac_display_content(ivac);
}
}
}
}
@@
-306,11
+329,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)&&(channel<MAX_CONNECTIONS)) {
if((arg[1][0]>='0')&&(arg[1][0]<='9')) channel=atoi(arg[1]);
else channel=-1;
if((channel>=0)&&(channel<MAX_CONNECTIONS)) {
- i=network_close(&(ivac->net),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);
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]);
}
}
else sprintf(c_str,"invalid argument: '%s'",arg[1]);
}