1 /* inet.c -- network management stuff
3 * author: hackbard@hackdaworld.dyndns.org
9 int network_init(t_ivac *ivac) {
13 puts("[ivac] inet: initializing network ...");
15 memset(ivac->net.connection,0,MAX_CONNECTIONS*sizeof(t_connection));
19 if((ivac->net.l_fd=socket(AF_INET,SOCK_STREAM,0))==-1) {
20 perror("[ivac] inet.c: socket call");
24 memset(&addr,0,sizeof(struct sockaddr));
25 addr.sin_family=AF_INET;
26 addr.sin_port=htons(ivac->net.l_port);
27 addr.sin_addr.s_addr=INADDR_ANY;
29 if(bind(ivac->net.l_fd,(struct sockaddr *)&addr,
30 sizeof(struct sockaddr))==-1) {
31 perror("[ivac] inet.c: bind call");
35 printf("[ivac] inet: listen on %s port %d.\n",inet_ntoa(addr.sin_addr.s_addr)
41 int network_manage_connection(t_ivac *ivac) {
46 for(i=0;i<MAX_CONNECTIONS;i++) {
48 if(ivac->net.connection[i].status&C_IN_USE) {
50 if(ivac->net.connection[i].status&C_HANGUP) {
51 if(close(ivac->net.connection[i].fd)==-1) {
52 perror("[ivac] inet.c: close call");
55 ivac->net.connection[i].status=0;
58 if(ivac->net.connection[i].status&C_INFO_A) {
60 if(!ivac->net.connection[i].status&C_SOCKET) {
61 if((ivac->net.connection[i].fd=socket(AF_INET,SOCK_STREAM,0))==-1) {
62 perror("[ivac] inet.c: socket call");
67 if(!ivac->net.connection[i].status&C_ESTABL) {
69 memset(&addr,0,sizeof(struct sockaddr));
70 addr.sin_family=AF_INET;
71 addr.sin_port=htons(ivac->net.connection[i].port);
72 addr.sin_addr_s_addr=inet_aton(ivac->net.connection[i].ip);
74 if(connect(ivac->net.connection[i].fd,(struct sockaddr *)&addr,
75 sizeof(struct sockaddr))==-1) {
76 perror("[ivac] inet.c: connect call");
91 int network_send(int fd,unsigned char *data,int datasize) {
99 if((count=write(fd,data+datasize-left,left))==-1) {
100 perror("[ivac] inet.c: write call");
109 int network_receive(int fd,unsigned char *data,int datasize) {
117 if((retval=read(fd,data+count,datasize-count))==-1) {
118 perror("[ivac] inet.c: read call");
127 int send_info(int fd,t_ivac *ivac) {
129 char data[SEND_I_MAX];
132 size=strlen(ivac->name);
136 strncpy(data+2,ivac->name,size);
139 data[size+1]=SEND_I_CAP;
140 data[size+2]=sizeof(unsigned char);
141 data[size+3]=ivac->net.cap;
142 size+=(sizeof(unsigned char)+2);
144 data[size+1]=SEND_I_AVCAP;
145 data[size+2]=sizeof(unsigned short);
146 data[size+2+sizeof(unsigned short)];
147 size+=(sizeof(unsigned short)+2);
149 if(network_send(fd,data,size)==ERROR) {
150 puts("[ivac] inet.c: send_info failed");
157 int receive_info(int i,t_ivac *ivac) {
159 char data[CHAR_USERNAME+2];
162 if((length=network_receive(ivac->net.connection[i].fd,
163 data,SEND_I_MAX))==ERROR) {
164 puts("[ivac] inet.c: receive_info failed");
168 while(length-count) {
169 switch(data[count]) {
171 strncpy(ivac->net.connection[i].name,data[count+2],data[count+1]);
172 ivac->net.connection[i].name[data[count+2]]='\0';
173 count+=(data[count+2]+2);
176 ivac->net.connection[i].cap=data[count+4];
177 count+=(sizeof(unsigned char)+2);
180 ivac->net.connection[i].avcap=data[count+3]<<8;
181 ivac->net.connection[i].avcap|=data[count+4];
182 count+=(sizeof(unsigned short)+2);
185 puts("[ivac] inet.c: receive_info, unknown character");