X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fivac.git;a=blobdiff_plain;f=src%2Fnetwork.c;fp=src%2Fnetwork.c;h=0000000000000000000000000000000000000000;hp=053e309f4f750403c15bec1c723dcefd3099a4c1;hb=21a073b6e9d464f3f11dfb290d27341bb4a203b6;hpb=40031b2d692a7b83e437535045ece6c58f8bf31e diff --git a/src/network.c b/src/network.c deleted file mode 100644 index 053e309..0000000 --- a/src/network.c +++ /dev/null @@ -1,361 +0,0 @@ -/* network.c -- network management stuff - * - * author: hackbard@hackdaworld.dyndns.org - * - */ - -#include "network.h" - -int network_init(t_net *net) { - - struct sockaddr_in addr; - int true; - - puts("[network] initializing network ..."); - - memset(net->connection,0,MAX_CONNECTIONS*sizeof(t_connection)); - net->c_count=0; - net->sendmask=0; - - if((net->l_fd=socket(AF_INET,SOCK_STREAM,0))==-1) { - perror("[network] socket call"); - return N_ERROR; - } - - memset(&addr,0,sizeof(struct sockaddr)); - addr.sin_family=AF_INET; - addr.sin_port=htons(net->l_port); - addr.sin_addr.s_addr=INADDR_ANY; - - if(bind(net->l_fd,(struct sockaddr *)&addr, - sizeof(struct sockaddr))==-1) { - /* try harder ... */ - true=1; - if(setsockopt(net->l_fd,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(true))==-1) { - perror("[network] setsockopt call"); - return N_ERROR; - } - puts("[network] reused address"); - } - - if(listen(net->l_fd,MAX_LISTEN_QUEUE)==-1) { - perror("[network] listen call"); - return N_ERROR; - } - - printf("[network] listen on %s port %d\n",inet_ntoa(addr.sin_addr), - net->l_port); - - return N_SUCCESS; -} - -int network_shutdown(t_net *net) { - - int channel; - - for(channel=0;channelconnection[channel].status&C_SOCKET) - close(net->connection[channel].fd); - - if(close(net->l_fd)==-1) { - perror("[network] close call"); - return N_ERROR; - } - - puts("[network] shutdown"); - - return N_SUCCESS; -} - -int network_set_listen_port(t_net *net,in_port_t port) { - - net->l_port=port; - - return N_SUCCESS; -} - -int network_manage_connection(t_net *net) { - - int i; - struct sockaddr_in addr; - - for(i=0;iconnection[i].status&C_IN_USE) { - - if(net->connection[i].status&C_HANGUP) { - if(close(net->connection[i].fd)==-1) { - perror("[network] close call"); - return N_E_CLOSE; - } - printf("[network] connection %d closed\n",i); - net->connection[i].status=0; - } - - if(net->connection[i].status&C_INFO_A) { - - if(!(net->connection[i].status&C_SOCKET)) { - if((net->connection[i].fd=socket(AF_INET,SOCK_STREAM,0))==-1) { - perror("[network] socket call"); - return N_ERROR; - } - net->connection[i].status|=C_SOCKET; - } - - if((!(net->connection[i].status&C_ESTABL))&& - (net->connection[i].status&C_SOCKET)) { - - memset(&addr,0,sizeof(struct sockaddr)); - addr.sin_family=AF_INET; - addr.sin_port=htons(net->connection[i].port); - if(!inet_aton(net->connection[i].ip,&(addr.sin_addr))) { - perror("[network] inet_aton call"); - return N_ERROR; - } - - if(connect(net->connection[i].fd,(struct sockaddr *)&addr, - sizeof(struct sockaddr))==-1) { - perror("[network] connect call"); - return N_E_CONNECT; - } - - printf("[network] established connection to "); - printf("%s port %d on channel %d\n",net->connection[i].ip, - net->connection[i].port,i); - net->connection[i].status|=C_ESTABL; - - } - - } - - } - - } - - return N_SUCCESS; -} - -int network_connect(t_net *net,int channel) { - - if(net->connection[channel].status&C_IN_USE) { - printf("[network] connect failed, channel %02d in use\n",channel); - return N_E_IN_USE; - } - if(!(net->connection[channel].status&C_INFO_A)) { - printf("[network] connect failed, missing configuration for channel %02d\n", - channel); - return N_E_NO_INFO; - } - - /* try connect & return result */ - net->connection[channel].status|=C_IN_USE; - return(network_manage_connection(net)); /* could be other channel too */ -} - -int network_close(t_net *net,int channel) { - - if(!(net->connection[channel].status&C_ESTABL)) { - printf("[network] close failed, channel %02d not active\n",channel); - return N_E_NC; - } - - net->connection[channel].status|=C_HANGUP; - return(network_manage_connection(net)); /* could be other channel too */ -} - -int network_close_all(t_net *net) { - - int channel; - - for(channel=0;channelconnection[channel].status&C_ESTABL) network_close(net,channel); - - return N_SUCCESS; -} - -int network_set_connection_info(t_net *net,int channel,char *ip,int port) { - - if(net->connection[channel].status&C_IN_USE) { - printf("[network] set connection failed, channel %02d in use\n",channel); - return N_E_IN_USE; - } - - strncpy(net->connection[channel].ip,ip,IP_DIGITS); - net->connection[channel].port=port; - net->connection[channel].status|=C_INFO_A; - - return N_SUCCESS; -} - -int network_select(t_net *net,int channel) { - - int mask; - - if(channel==MAX_CONNECTIONS) mask=0xffffffff; - else mask=(1<sendmask|=mask; - - return N_SUCCESS; -} - -int network_deselect(t_net *net,int channel) { - - int mask; - - if(channel==MAX_CONNECTIONS) mask=0; - else mask=~(1<sendmask&=mask; - - return N_SUCCESS; -} - -int network_manage_incoming(t_net *net) { - - int channel; - struct sockaddr_in addr; - int len; - - for(channel=0;channelconnection[channel].status&C_IN_USE)) { - if((net->connection[channel].fd=accept(net->l_fd, - (struct sockaddr *)&addr, - &len))==-1) { - perror("[network] accept call"); - return N_E_ACCEPT; - } - strncpy(net->connection[channel].ip,inet_ntoa(addr.sin_addr),IP_DIGITS); - net->connection[channel].port=ntohs(addr.sin_port); - net->connection[channel].status=C_IN_USE|C_INFO_A|C_SOCKET|C_ESTABL; - printf("[network] established connection from %s port %d on channel %d\n", - net->connection[channel].ip,net->connection[channel].port,channel); - return channel; - } - } - - puts("[network] maximum connections reached"); - return N_E_MAXC; -} - -int network_send(int fd,unsigned char *data,int datasize) { - - int count,left; - - count=0; - left=datasize; - - while(left) { - if((count=write(fd,data+datasize-left,left))==-1) { - perror("[network] write call"); - return N_ERROR; - } - left-=count; - } - - return N_SUCCESS; -} - -int network_receive(int fd,unsigned char *data,int datasize) { - - int count; - - if((count=read(fd,data,datasize))==-1) { - perror("[network] read call"); - return N_ERROR; - } - - return count; -} - -int network_udp_listen_init(t_net *net) { - - struct sockaddr_in addr; - int true; - - if((net->l_udp_fd=socket(AF_INET,SOCK_DGRAM,0))==-1) { - perror("[network] socket call (udp-receive)"); - return N_ERROR; - } - - memset(&addr,0,sizeof(struct sockaddr)); - addr.sin_family=AF_INET; - addr.sin_port=htons(net->l_udp_port); - addr.sin_addr.s_addr=INADDR_ANY; - if(bind(net->l_udp_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr))==-1) { - /* try harder ... */ - true=1; - if(setsockopt(net->l_udp_fd,SOL_SOCKET,SO_REUSEADDR, - &true,sizeof(true))==-1) { - perror("[network] setsockopt call (udp)"); - return N_ERROR; - } - puts("[network] reused address (udp)"); - } - - printf("[network] listening on port %d (udp)\n",net->l_udp_port); - - if((net->s_udp_fd=socket(AF_INET,SOCK_DGRAM,0))==-1) { - perror("[network] socket call (udp-send)"); - return N_ERROR; - } - - return N_SUCCESS; -} - -int network_udp_receive(t_net *net,int channel, unsigned char *data,int count) { - - struct sockaddr_in addr; - socklen_t len; - - if((count=recvfrom(net->l_udp_fd,data,count,0, - (struct sockaddr *)&addr,&len))==-1) { - perror("[network] recvfrom call"); - return N_ERROR; - } - - if(strncmp(net->connection[channel].ip,inet_ntoa(addr.sin_addr),IP_DIGITS)) { - printf("[network] packet from unknown: %s\n",inet_ntoa(addr.sin_addr)); - return N_UDP_WRONG_SENDER; - } - - return N_SUCCESS; -} - -int network_udp_send(t_net *net,int channel, unsigned char *data,int size) { - - int count,left; - struct sockaddr_in addr; - - count=0; - left=count; - - memset(&addr,0,sizeof(struct sockaddr)); - addr.sin_family=AF_INET; - addr.sin_port=htons(net->l_udp_port); - inet_aton(net->connection[channel].ip,&(addr.sin_addr)); - - while(left) { - if((count=sendto(net->s_udp_fd,data+size-left,left,0, - (struct sockaddr *)&addr,sizeof(struct sockaddr)))==-1) { - perror("[network] sendto call"); - return N_ERROR; - } - left-=count; - } - - return N_SUCCESS; -} - -int network_udp_shutdown(t_net *net) { - - if(close(net->l_udp_fd)==-1) { - perror("[network] close call (udp-receive)"); - return N_ERROR; - } - - if(close(net->s_udp_fd)==-1) { - perror("[network] close call (udp-send)"); - return N_ERROR; - } - - return N_SUCCESS; -}