1 | |
---|
2 | |
---|
3 | |
---|
4 | |
---|
5 | |
---|
6 | |
---|
7 | |
---|
8 | |
---|
9 | |
---|
10 | |
---|
11 | |
---|
12 | |
---|
13 | |
---|
14 | |
---|
15 | |
---|
16 | |
---|
17 | |
---|
18 | |
---|
19 | |
---|
20 | |
---|
21 | |
---|
22 | |
---|
23 | |
---|
24 | |
---|
25 | |
---|
26 | |
---|
27 | |
---|
28 | |
---|
29 | |
---|
30 | |
---|
31 | #include "CaNA.h" |
---|
32 | |
---|
33 | char *myFilterFileName; |
---|
34 | |
---|
35 | static int inputSock; |
---|
36 | static int sockNamelg; |
---|
37 | static int inputSock2; |
---|
38 | static int sockNameFromlg; |
---|
39 | static int rcv; |
---|
40 | static int sockBufSize = SOCKET_BUFFER_SIZE; |
---|
41 | static unsigned short receptPort = RECEPTION_PORT; |
---|
42 | static char *receptAddress = RECEPTION_ADDRESS; |
---|
43 | static struct sockaddr_in name; |
---|
44 | static struct sockaddr_in name2; |
---|
45 | static struct sockaddr_in fromName; |
---|
46 | DatagramPtr pcktPtr; |
---|
47 | static unsigned char *ptr_buffer; |
---|
48 | |
---|
49 | int add_entry(u32 adIPS, FilterPtr ptrFilter) |
---|
50 | { |
---|
51 | ENTRY input; |
---|
52 | char *ptrstradIP; |
---|
53 | char stradIP[20]; |
---|
54 | |
---|
55 | fprintf(stderr, "in add_entry\n"); |
---|
56 | |
---|
57 | ptrstradIP = &stradIP[0]; |
---|
58 | sprintf(ptrstradIP,"%d",adIPS); |
---|
59 | |
---|
60 | fprintf(stderr, "string IP : %s\n", ptrstradIP); |
---|
61 | |
---|
62 | input.key = strdup(ptrstradIP); |
---|
63 | fprintf(stderr, "after key\n"); |
---|
64 | input . data = ptrFilter; |
---|
65 | fprintf(stderr, "after data\n"); |
---|
66 | if (hsearch(input, ENTER) == NULL){ |
---|
67 | perror("hsearch"); |
---|
68 | exit(1); |
---|
69 | } |
---|
70 | return 1; |
---|
71 | } |
---|
72 | |
---|
73 | int getFilters(char *filename) |
---|
74 | { |
---|
75 | FILE *configFile; |
---|
76 | s8 line[1024]; |
---|
77 | s32 cptLine = 0; |
---|
78 | s32 nbR = 0; |
---|
79 | s32 nbFilters = 0; |
---|
80 | s8 tadS[16]; |
---|
81 | s8 tadS1[16]; |
---|
82 | s8 tadD1[16]; |
---|
83 | s8 tnbfilters[2]; |
---|
84 | s8 tadD2[16]; |
---|
85 | s8 tadD3[16]; |
---|
86 | s8 tadS2[16]; |
---|
87 | s8 tadS3[16]; |
---|
88 | s8 tadD4[16]; |
---|
89 | s8 tadS4[16]; |
---|
90 | s8 tadD5[16]; |
---|
91 | s8 tadS5[16]; |
---|
92 | s8 tadD6[16]; |
---|
93 | s8 tadS6[16]; |
---|
94 | s8 tportS[6]; |
---|
95 | s8 tportD1[6]; |
---|
96 | s8 tportD2[6]; |
---|
97 | s8 tportD3[6]; |
---|
98 | s8 tportD4[6]; |
---|
99 | s8 tportD5[6]; |
---|
100 | s8 tportD6[6]; |
---|
101 | s32 ind = 0; |
---|
102 | unsigned short n0, n1, n2, n3; |
---|
103 | s8 bufferUnsignedShort4[4]; |
---|
104 | u32 adS; |
---|
105 | u32 adS1; |
---|
106 | u32 adS2; |
---|
107 | u32 adS3; |
---|
108 | u32 adS4; |
---|
109 | u32 adS5; |
---|
110 | u32 adS6; |
---|
111 | u32 adD1; |
---|
112 | u32 adD2; |
---|
113 | u32 adD3; |
---|
114 | u32 adD4; |
---|
115 | u32 adD5; |
---|
116 | u32 adD6; |
---|
117 | |
---|
118 | if (!(configFile = fopen(filename, "r"))) { |
---|
119 | fprintf (stderr, "error during file \"%s\" opening\n", filename); |
---|
120 | exit(1); |
---|
121 | } |
---|
122 | cptLine=0; |
---|
123 | while ( fgets(line, 1024, configFile) != 0) { |
---|
124 | if ( strspn(line, "#") == 0 ) { |
---|
125 | if (sscanf(line, "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n", |
---|
126 | tadS, |
---|
127 | tportS, |
---|
128 | tnbfilters, |
---|
129 | tadS1, |
---|
130 | tadD1, |
---|
131 | tportD1, |
---|
132 | tadS2, |
---|
133 | tadD2, |
---|
134 | tportD2, |
---|
135 | tadS3, |
---|
136 | tadD3, |
---|
137 | tportD3, |
---|
138 | tadS4, |
---|
139 | tadD4, |
---|
140 | tportD4, |
---|
141 | tadS5, |
---|
142 | tadD5, |
---|
143 | tportD5, |
---|
144 | tadS6, |
---|
145 | tadD6, |
---|
146 | tportD6) == 0) { |
---|
147 | fprintf(stderr, "Error in file %s, line %d\n", filename, cptLine); |
---|
148 | exit(1); |
---|
149 | } |
---|
150 | cptLine++; |
---|
151 | nbFilters = atoi(tnbfilters); |
---|
152 | fprintf(stderr, "tnbfilters %s %d nbFilters %d\n",tnbfilters,atoi(tnbfilters), nbFilters); |
---|
153 | if (sscanf(tadS,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
154 | fprintf(stderr, "IP Source error in file %s, line %d\n",filename, cptLine); |
---|
155 | exit(1); |
---|
156 | } |
---|
157 | bufferUnsignedShort4[3] = (s8)n0; |
---|
158 | bufferUnsignedShort4[2] = (s8)n1; |
---|
159 | bufferUnsignedShort4[1] = (s8)n2; |
---|
160 | bufferUnsignedShort4[0] = (s8)n3; |
---|
161 | adS = *((u32*)&bufferUnsignedShort4); |
---|
162 | fprintf(stderr, "First IP Address OK line %d\n", cptLine); |
---|
163 | if ( nbFilters >= 1 ) { |
---|
164 | if (sscanf(tadS1,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
165 | fprintf(stderr, "First filter, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
166 | exit(1); |
---|
167 | }; |
---|
168 | bufferUnsignedShort4[3] = (s8)n0; |
---|
169 | bufferUnsignedShort4[2] = (s8)n1; |
---|
170 | bufferUnsignedShort4[1] = (s8)n2; |
---|
171 | bufferUnsignedShort4[0] = (s8)n3; |
---|
172 | adS1 = *((u32*)&bufferUnsignedShort4); |
---|
173 | if (sscanf(tadD1,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
174 | fprintf(stderr, "First filter, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
175 | exit(1); |
---|
176 | }; |
---|
177 | bufferUnsignedShort4[3] = (s8)n0; |
---|
178 | bufferUnsignedShort4[2] = (s8)n1; |
---|
179 | bufferUnsignedShort4[1] = (s8)n2; |
---|
180 | bufferUnsignedShort4[0] = (s8)n3; |
---|
181 | adD1 = *((u32*)&bufferUnsignedShort4); |
---|
182 | fprintf(stderr, "First filter : address destination OK %d\n", cptLine); |
---|
183 | } |
---|
184 | if ( nbFilters >= 2 ) { |
---|
185 | if (sscanf(tadS2,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
186 | fprintf(stderr, "Second filter, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
187 | exit(1); |
---|
188 | }; |
---|
189 | bufferUnsignedShort4[3] = (s8)n0; |
---|
190 | bufferUnsignedShort4[2] = (s8)n1; |
---|
191 | bufferUnsignedShort4[1] = (s8)n2; |
---|
192 | bufferUnsignedShort4[0] = (s8)n3; |
---|
193 | adS2 = *((u32*)&bufferUnsignedShort4); |
---|
194 | if (sscanf(tadD2,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
195 | fprintf(stderr, "Second filter, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
196 | exit(1); |
---|
197 | }; |
---|
198 | bufferUnsignedShort4[3] = (s8)n0; |
---|
199 | bufferUnsignedShort4[2] = (s8)n1; |
---|
200 | bufferUnsignedShort4[1] = (s8)n2; |
---|
201 | bufferUnsignedShort4[0] = (s8)n3; |
---|
202 | adD2 = *((u32*)&bufferUnsignedShort4); |
---|
203 | fprintf(stderr, "Second filter : address destination OK %d\n", cptLine); |
---|
204 | } |
---|
205 | if ( nbFilters >= 3 ) { |
---|
206 | if (sscanf(tadS3,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
207 | fprintf(stderr, "Third filter, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
208 | exit(1); |
---|
209 | }; |
---|
210 | bufferUnsignedShort4[3] = (s8)n0; |
---|
211 | bufferUnsignedShort4[2] = (s8)n1; |
---|
212 | bufferUnsignedShort4[1] = (s8)n2; |
---|
213 | bufferUnsignedShort4[0] = (s8)n3; |
---|
214 | adS3 = *((u32*)&bufferUnsignedShort4); |
---|
215 | if (sscanf(tadD3,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
216 | fprintf(stderr, "Third filter, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
217 | exit(1); |
---|
218 | }; |
---|
219 | bufferUnsignedShort4[3] = (s8)n0; |
---|
220 | bufferUnsignedShort4[2] = (s8)n1; |
---|
221 | bufferUnsignedShort4[1] = (s8)n2; |
---|
222 | bufferUnsignedShort4[0] = (s8)n3; |
---|
223 | adD3 = *((u32*)&bufferUnsignedShort4); |
---|
224 | fprintf(stderr, "Third filter : address destination OK %d\n", cptLine); |
---|
225 | } |
---|
226 | if ( nbFilters >= 4 ) { |
---|
227 | if (sscanf(tadS4,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
228 | fprintf(stderr, "Third filter, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
229 | exit(1); |
---|
230 | }; |
---|
231 | bufferUnsignedShort4[3] = (s8)n0; |
---|
232 | bufferUnsignedShort4[2] = (s8)n1; |
---|
233 | bufferUnsignedShort4[1] = (s8)n2; |
---|
234 | bufferUnsignedShort4[0] = (s8)n3; |
---|
235 | adS4 = *((u32*)&bufferUnsignedShort4); |
---|
236 | if (sscanf(tadD4,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
237 | fprintf(stderr, "Third filter, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
238 | exit(1); |
---|
239 | }; |
---|
240 | bufferUnsignedShort4[3] = (s8)n0; |
---|
241 | bufferUnsignedShort4[2] = (s8)n1; |
---|
242 | bufferUnsignedShort4[1] = (s8)n2; |
---|
243 | bufferUnsignedShort4[0] = (s8)n3; |
---|
244 | adD4 = *((u32*)&bufferUnsignedShort4); |
---|
245 | fprintf(stderr, "Third filter : address destination OK %d\n", cptLine); |
---|
246 | } |
---|
247 | if ( nbFilters >= 5 ) { |
---|
248 | if (sscanf(tadS5,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
249 | fprintf(stderr, "Third filter, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
250 | exit(1); |
---|
251 | }; |
---|
252 | bufferUnsignedShort4[3] = (s8)n0; |
---|
253 | bufferUnsignedShort4[2] = (s8)n1; |
---|
254 | bufferUnsignedShort4[1] = (s8)n2; |
---|
255 | bufferUnsignedShort4[0] = (s8)n3; |
---|
256 | adS5 = *((u32*)&bufferUnsignedShort4); |
---|
257 | if (sscanf(tadD5,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
258 | fprintf(stderr, "Third filter, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
259 | exit(1); |
---|
260 | }; |
---|
261 | bufferUnsignedShort4[3] = (s8)n0; |
---|
262 | bufferUnsignedShort4[2] = (s8)n1; |
---|
263 | bufferUnsignedShort4[1] = (s8)n2; |
---|
264 | bufferUnsignedShort4[0] = (s8)n3; |
---|
265 | adD5 = *((u32*)&bufferUnsignedShort4); |
---|
266 | fprintf(stderr, "Third filter : address destination OK %d\n", cptLine); |
---|
267 | } |
---|
268 | if ( nbFilters >= 6 ) { |
---|
269 | if (sscanf(tadS6,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
270 | fprintf(stderr, "filter six, new source IP Address error in file %s, line %d\n",filename, cptLine); |
---|
271 | exit(1); |
---|
272 | }; |
---|
273 | bufferUnsignedShort4[3] = (s8)n0; |
---|
274 | bufferUnsignedShort4[2] = (s8)n1; |
---|
275 | bufferUnsignedShort4[1] = (s8)n2; |
---|
276 | bufferUnsignedShort4[0] = (s8)n3; |
---|
277 | adS6 = *((u32*)&bufferUnsignedShort4); |
---|
278 | if (sscanf(tadD6,"%hu.%hu.%hu.%hu",&n0,&n1,&n2,&n3) == 0){ |
---|
279 | fprintf(stderr, "filter six, new Destination IP Address error in file %s, line %d\n",filename, cptLine); |
---|
280 | exit(1); |
---|
281 | }; |
---|
282 | bufferUnsignedShort4[3] = (s8)n0; |
---|
283 | bufferUnsignedShort4[2] = (s8)n1; |
---|
284 | bufferUnsignedShort4[1] = (s8)n2; |
---|
285 | bufferUnsignedShort4[0] = (s8)n3; |
---|
286 | adD6 = *((u32*)&bufferUnsignedShort4); |
---|
287 | fprintf(stderr, "filter six: address destination OK %d\n", cptLine); |
---|
288 | } |
---|
289 | if ( nbFilters > 6) { |
---|
290 | fprintf(stderr, " More than 6 filters is not allowed in this version, file %s, line %d\n",filename, cptLine); |
---|
291 | exit(1); |
---|
292 | } |
---|
293 | FilterPtr tmp = (FilterPtr) malloc(sizeof(struct Filter)); |
---|
294 | tmp->nb_filters = nbFilters; |
---|
295 | tmp->new_router_ip = adS1; |
---|
296 | tmp->new_destination_ip = adD1; |
---|
297 | |
---|
298 | tmp->new_dest_udp_port = (u16) atoi(tportD1); |
---|
299 | tmp->second_router_ip = adS2; |
---|
300 | tmp->second_destination_ip = adD2; |
---|
301 | tmp->second_dest_udp_port = (u16) atoi(tportD2); |
---|
302 | tmp->third_router_ip = adS3; |
---|
303 | tmp->third_destination_ip = adD3; |
---|
304 | tmp->third_dest_udp_port = (u16) atoi(tportD3); |
---|
305 | tmp->fourth_router_ip = adS4; |
---|
306 | tmp->fourth_destination_ip = adD4; |
---|
307 | tmp->fourth_dest_udp_port = (u16) atoi(tportD4); |
---|
308 | tmp->five_router_ip = adS5; |
---|
309 | tmp->five_destination_ip = adD5; |
---|
310 | tmp->five_dest_udp_port = (u16) atoi(tportD5); |
---|
311 | tmp->six_router_ip = adS6; |
---|
312 | tmp->six_destination_ip = adD6; |
---|
313 | tmp->six_dest_udp_port = (u16) atoi(tportD6); |
---|
314 | if (add_entry(adS,tmp)!=1){ |
---|
315 | fprintf(stderr, "problem in add entry in hash table\n"); |
---|
316 | exit(1); |
---|
317 | }else{ |
---|
318 | fprintf(stderr, "add entry OK in hash table\n"); |
---|
319 | } |
---|
320 | |
---|
321 | } |
---|
322 | } |
---|
323 | if( fclose(configFile) != 0) { |
---|
324 | return (-1); |
---|
325 | } else { |
---|
326 | return nbR; |
---|
327 | } |
---|
328 | } |
---|
329 | |
---|
330 | |
---|
331 | |
---|
332 | |
---|
333 | |
---|
334 | unsigned short |
---|
335 | getIpHeader(unsigned char *buf) |
---|
336 | { |
---|
337 | unsigned char buffer2[2]; |
---|
338 | unsigned char buffer4[4]; |
---|
339 | unsigned short offset = 0; |
---|
340 | pcktPtr->ipH->versionAndLength = (unsigned short)*(buf); |
---|
341 | pcktPtr->ipH->tos = (unsigned short)*(buf+offset+1); |
---|
342 | buffer2[1]= *(buf+offset+2); |
---|
343 | buffer2[0]= *(buf+offset+3); |
---|
344 | pcktPtr->ipH->length = *((unsigned short*)&buffer2); |
---|
345 | buffer2[1]= *(buf+offset+4); |
---|
346 | buffer2[0]= *(buf+offset+5); |
---|
347 | pcktPtr->ipH->ident = *((unsigned short*)&buffer2); |
---|
348 | pcktPtr->ipH->flagsAndOffset = (unsigned short)(*(buf+offset+7)); |
---|
349 | pcktPtr->ipH->ttl = (unsigned short)*(buf+offset+8); |
---|
350 | pcktPtr->ipH->protocol = (unsigned short)*(buf+offset+9); |
---|
351 | buffer2[1]= *(buf+offset+10); |
---|
352 | buffer2[0]= *(buf+offset+11); |
---|
353 | pcktPtr->ipH->checksum = *((unsigned short*)(&buffer2)); |
---|
354 | buffer4[3] = *(buf+offset+12)&0xff; |
---|
355 | buffer4[2] = *(buf+offset+13)&0xff; |
---|
356 | buffer4[1] = *(buf+offset+14)&0xff; |
---|
357 | buffer4[0] = *(buf+offset+15)&0xff; |
---|
358 | pcktPtr->ipH->srcAdd = *((unsigned long*)(&buffer4)); |
---|
359 | buffer4[3] = *(buf+offset+16)&0xff; |
---|
360 | buffer4[2] = *(buf+offset+17)&0xff; |
---|
361 | buffer4[1] = *(buf+offset+18)&0xff; |
---|
362 | buffer4[0] = *(buf+offset+19)&0xff; |
---|
363 | pcktPtr->ipH->dstAdd = *((unsigned long*)(&buffer4)); |
---|
364 | return(0); |
---|
365 | } |
---|
366 | |
---|
367 | |
---|
368 | |
---|
369 | |
---|
370 | unsigned short |
---|
371 | checkIpHeader(DatagramPtr pP) |
---|
372 | { |
---|
373 | if ((pP->ipH->versionAndLength>>4) != 4) |
---|
374 | { |
---|
375 | syslog(LOG_INFO,"IP version not 4 (%d)", (pP->ipH->versionAndLength>>4)); |
---|
376 | return(1); |
---|
377 | } |
---|
378 | |
---|
379 | |
---|
380 | |
---|
381 | |
---|
382 | |
---|
383 | if (pP->ipH->tos != 0) |
---|
384 | { |
---|
385 | syslog(LOG_INFO,"TOS(%d) != 0", |
---|
386 | pP->ipH->tos); |
---|
387 | } |
---|
388 | if (pP->ipH->length > 1492) |
---|
389 | { |
---|
390 | syslog(LOG_INFO,"IP packet length > 1492 (%d)", |
---|
391 | pP->ipH->length); |
---|
392 | return(1); |
---|
393 | } |
---|
394 | if (pP->ipH->protocol != 17) |
---|
395 | { |
---|
396 | syslog(LOG_INFO,"Not UDP protocol (%u)",pP->ipH->protocol); |
---|
397 | return(1); |
---|
398 | } |
---|
399 | return(0); |
---|
400 | } |
---|
401 | |
---|
402 | |
---|
403 | |
---|
404 | |
---|
405 | |
---|
406 | unsigned short |
---|
407 | getUdpHeader(DatagramPtr pckt, unsigned char * buf) |
---|
408 | { |
---|
409 | unsigned char buffer2[2]; |
---|
410 | unsigned short offset = 20; |
---|
411 | buffer2[1]= *(buf+offset+0); |
---|
412 | buffer2[0]= *(buf+offset+1); |
---|
413 | pckt->udp_header->srcPort = *((unsigned short*)&buffer2); |
---|
414 | buffer2[1]= *(buf+offset+2); |
---|
415 | buffer2[0]= *(buf+offset+3); |
---|
416 | pckt->udp_header->dstPort = *((unsigned short*)&buffer2); |
---|
417 | buffer2[1]= *(buf+offset+4); |
---|
418 | buffer2[0]= *(buf+offset+5); |
---|
419 | pckt->udp_header->length = *((unsigned short*)&buffer2); |
---|
420 | buffer2[1]= *(buf+offset+6); |
---|
421 | buffer2[0]= *(buf+offset+7); |
---|
422 | pckt->udp_header->checksum = *((unsigned short*)&buffer2); |
---|
423 | return(0); |
---|
424 | } |
---|
425 | |
---|
426 | |
---|
427 | |
---|
428 | |
---|
429 | |
---|
430 | unsigned short |
---|
431 | checkUdpHeader(DatagramPtr pckt, int regRouter, unsigned short receptPort ) |
---|
432 | { |
---|
433 | if(pckt->udp_header->dstPort != receptPort) |
---|
434 | { |
---|
435 | if (regRouter == 0){ |
---|
436 | syslog(LOG_INFO,"Wrong destination port (%u)", |
---|
437 | pckt->udp_header->dstPort); |
---|
438 | return (1); |
---|
439 | } |
---|
440 | return (1); |
---|
441 | }else{ |
---|
442 | if (regRouter == 2) |
---|
443 | { |
---|
444 | syslog(LOG_INFO,"Router Address not registered : %lu.%lu.%lu.%lu)", |
---|
445 | (pckt->ipH->srcAdd>>24), |
---|
446 | (pckt->ipH->srcAdd<<8>>24), |
---|
447 | (pckt->ipH->srcAdd<<16>>24), |
---|
448 | (pckt->ipH->srcAdd<<24>>24)); |
---|
449 | return (1); |
---|
450 | } |
---|
451 | return (0); |
---|
452 | } |
---|
453 | |
---|
454 | |
---|
455 | |
---|
456 | |
---|
457 | |
---|
458 | return(0); |
---|
459 | } |
---|
460 | |
---|
461 | |
---|
462 | |
---|
463 | short |
---|
464 | initSocket() |
---|
465 | { |
---|
466 | inputSock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); |
---|
467 | if (inputSock < 0) |
---|
468 | { |
---|
469 | syslog(LOG_ERR,"socket : %s", strerror(errno)); |
---|
470 | exit(1); |
---|
471 | } |
---|
472 | memset((void*)&name, 0, sizeof(name)); |
---|
473 | name.sin_family = AF_INET; |
---|
474 | name.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
475 | if (name.sin_addr.s_addr == INADDR_NONE){ |
---|
476 | syslog(LOG_ERR, " INADDR_NONE "); |
---|
477 | exit(1); |
---|
478 | } |
---|
479 | name.sin_port = htons(receptPort); |
---|
480 | if (bind(inputSock,(struct sockaddr *)(&name), sizeof(name)) < 0) |
---|
481 | { |
---|
482 | syslog(LOG_ERR, "bind : %s", strerror(errno)); |
---|
483 | exit(1); |
---|
484 | } |
---|
485 | sockNamelg = sizeof(name); |
---|
486 | if (getsockname(inputSock, (struct sockaddr *) (&name), |
---|
487 | (socklen_t *)&sockNamelg) < 0) |
---|
488 | { |
---|
489 | syslog(LOG_ERR, "getsockname: %s", strerror(errno)); |
---|
490 | exit(1); |
---|
491 | } |
---|
492 | |
---|
493 | |
---|
494 | inputSock2 = socket(AF_INET, SOCK_DGRAM, 0); |
---|
495 | if (inputSock2 < 0) |
---|
496 | { |
---|
497 | syslog(LOG_ERR,"socket : %s", strerror(errno)); |
---|
498 | exit(1); |
---|
499 | } |
---|
500 | memset((void*)&name, 0, sizeof(name)); |
---|
501 | name2.sin_family = AF_INET; |
---|
502 | name2.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
503 | if (name2.sin_addr.s_addr == INADDR_NONE){ |
---|
504 | syslog(LOG_ERR, " INADDR_NONE "); |
---|
505 | exit(1); |
---|
506 | } |
---|
507 | name2.sin_port = htons(receptPort); |
---|
508 | if (bind(inputSock2,(struct sockaddr *)(&name2), sizeof(name2)) < 0) |
---|
509 | { |
---|
510 | syslog(LOG_ERR, "bind : %s", strerror(errno)); |
---|
511 | exit(1); |
---|
512 | } |
---|
513 | sockNamelg = sizeof(name2); |
---|
514 | if (getsockname(inputSock2, (struct sockaddr *) (&name2), |
---|
515 | (socklen_t *)&sockNamelg) < 0) |
---|
516 | { |
---|
517 | syslog(LOG_ERR, "getsockname: %s", strerror(errno)); |
---|
518 | exit(1); |
---|
519 | } |
---|
520 | return(0); |
---|
521 | } |
---|
522 | |
---|
523 | u16 in_cksum(u16 *addr, u32 length) |
---|
524 | { |
---|
525 | u32 conv = length; |
---|
526 | u32 sum = 0; |
---|
527 | u16 *paddr = addr; |
---|
528 | u16 res = 0; |
---|
529 | |
---|
530 | while (conv > 1) { |
---|
531 | sum += *paddr++; |
---|
532 | conv -= 2; |
---|
533 | } |
---|
534 | if (conv == 1) { |
---|
535 | *(unsigned char *) (&res) = *(unsigned char *) paddr; |
---|
536 | sum += res; |
---|
537 | } |
---|
538 | sum = (sum >> 16) + (sum & 0xFFFF); |
---|
539 | sum += (sum >> 16); |
---|
540 | res = ~sum; |
---|
541 | return (res); |
---|
542 | } |
---|
543 | |
---|
544 | u16 udp_checksum(u32 src, u32 dst, u16 *addr, u32 length) |
---|
545 | { |
---|
546 | struct toCkSum_UdpHeader buffer; |
---|
547 | |
---|
548 | memset(&buffer, 0, sizeof(buffer)); |
---|
549 | buffer.srcIP.s_addr = src; |
---|
550 | buffer.dstIP.s_addr = dst; |
---|
551 | buffer.padding = 0; |
---|
552 | buffer.protocol = IPPROTO_UDP; |
---|
553 | buffer.udp_length = htons(length); |
---|
554 | memcpy(&(buffer.udp), addr, length); |
---|
555 | return in_cksum((u16 *)&buffer, 12 + length); |
---|
556 | } |
---|
557 | |
---|
558 | |
---|
559 | |
---|
560 | |
---|
561 | short |
---|
562 | socketReading() |
---|
563 | { |
---|
564 | |
---|
565 | static s16 sockLg; |
---|
566 | static char *ptrstradIP; |
---|
567 | static char stradIP[20]; |
---|
568 | ENTRY input; |
---|
569 | ENTRY * finded; |
---|
570 | |
---|
571 | static struct ip ip; |
---|
572 | static struct udphdr udp; |
---|
573 | static u32 sd; |
---|
574 | const u32 opt = 1; |
---|
575 | static struct sockaddr_in sin; |
---|
576 | static u_char *packet; |
---|
577 | static char *myoffset; |
---|
578 | |
---|
579 | sockNameFromlg = sizeof(fromName); |
---|
580 | rcv = recvfrom(inputSock, ptr_buffer, sockBufSize, 0, |
---|
581 | (struct sockaddr *)(&fromName), |
---|
582 | (socklen_t *)&sockNameFromlg); |
---|
583 | sockLg = rcv; |
---|
584 | if (sockLg < 0) { |
---|
585 | syslog(LOG_ERR,"recvfrom : %s", strerror(errno)); |
---|
586 | exit(1); |
---|
587 | } |
---|
588 | if (sockLg == 0) { |
---|
589 | syslog(LOG_ERR,"recvfrom : %s", strerror(errno)); |
---|
590 | exit(1); |
---|
591 | } |
---|
592 | getIpHeader(ptr_buffer); |
---|
593 | checkIpHeader(pcktPtr); |
---|
594 | ptrstradIP = &stradIP[0]; |
---|
595 | sprintf(ptrstradIP,"%d",pcktPtr->ipH->srcAdd); |
---|
596 | input.key = ptrstradIP; |
---|
597 | if ( (finded = hsearch(input,FIND)) == NULL) { |
---|
598 | fprintf(stderr,"!"); |
---|
599 | } else { |
---|
600 | |
---|
601 | |
---|
602 | if ( ((FilterPtr)finded->data)->nb_filters >= 1 ) { |
---|
603 | |
---|
604 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
605 | ip.ip_hl = 0x5; |
---|
606 | ip.ip_v = 0x4; |
---|
607 | ip.ip_tos = 0x0; |
---|
608 | ip.ip_len = pcktPtr->ipH->length; |
---|
609 | ip.ip_id = pcktPtr->ipH->ident; |
---|
610 | ip.ip_off = 0x0; |
---|
611 | ip.ip_ttl = 64; |
---|
612 | ip.ip_p = IPPROTO_UDP; |
---|
613 | ip.ip_sum = 0x0; |
---|
614 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->new_router_ip); |
---|
615 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->new_destination_ip); |
---|
616 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
617 | memcpy(packet, &ip, sizeof(ip)); |
---|
618 | udp.source = htons(6604); |
---|
619 | udp.dest = htons(((FilterPtr)finded->data)->new_dest_udp_port); |
---|
620 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
621 | udp.check = 0; |
---|
622 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
623 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
624 | |
---|
625 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
626 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
627 | perror("raw socket"); |
---|
628 | exit(1); |
---|
629 | } |
---|
630 | |
---|
631 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
632 | perror("setsockopt"); |
---|
633 | exit(1); |
---|
634 | } |
---|
635 | memset(&sin, 0, sizeof(sin)); |
---|
636 | sin.sin_family = AF_INET; |
---|
637 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
638 | |
---|
639 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
640 | perror("sendto"); |
---|
641 | exit(1); |
---|
642 | } |
---|
643 | close(sd); |
---|
644 | free(packet); |
---|
645 | packet = NULL; |
---|
646 | } |
---|
647 | if ( ((FilterPtr)finded->data)->nb_filters >= 2 ) { |
---|
648 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
649 | ip.ip_hl = 0x5; |
---|
650 | ip.ip_v = 0x4; |
---|
651 | ip.ip_tos = 0x0; |
---|
652 | ip.ip_len = pcktPtr->ipH->length; |
---|
653 | ip.ip_id = pcktPtr->ipH->ident; |
---|
654 | ip.ip_off = 0x0; |
---|
655 | ip.ip_ttl = 64; |
---|
656 | ip.ip_p = IPPROTO_UDP; |
---|
657 | ip.ip_sum = 0x0; |
---|
658 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->second_router_ip); |
---|
659 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->second_destination_ip); |
---|
660 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
661 | memcpy(packet, &ip, sizeof(ip)); |
---|
662 | udp.source = htons(6604); |
---|
663 | udp.dest = htons(((FilterPtr)finded->data)->second_dest_udp_port); |
---|
664 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
665 | udp.check = 0; |
---|
666 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
667 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
668 | |
---|
669 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
670 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
671 | perror("raw socket"); |
---|
672 | exit(1); |
---|
673 | } |
---|
674 | |
---|
675 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
676 | perror("setsockopt"); |
---|
677 | exit(1); |
---|
678 | } |
---|
679 | memset(&sin, 0, sizeof(sin)); |
---|
680 | sin.sin_family = AF_INET; |
---|
681 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
682 | |
---|
683 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
684 | perror("sendto"); |
---|
685 | exit(1); |
---|
686 | } |
---|
687 | close(sd); |
---|
688 | free(packet); |
---|
689 | packet = NULL; |
---|
690 | } |
---|
691 | if ( ((FilterPtr)finded->data)->nb_filters >= 3 ) { |
---|
692 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
693 | ip.ip_hl = 0x5; |
---|
694 | ip.ip_v = 0x4; |
---|
695 | ip.ip_tos = 0x0; |
---|
696 | ip.ip_len = pcktPtr->ipH->length; |
---|
697 | ip.ip_id = pcktPtr->ipH->ident; |
---|
698 | ip.ip_off = 0x0; |
---|
699 | ip.ip_ttl = 64; |
---|
700 | ip.ip_p = IPPROTO_UDP; |
---|
701 | ip.ip_sum = 0x0; |
---|
702 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->third_router_ip); |
---|
703 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->third_destination_ip); |
---|
704 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
705 | memcpy(packet, &ip, sizeof(ip)); |
---|
706 | udp.source = htons(6604); |
---|
707 | udp.dest = htons(((FilterPtr)finded->data)->third_dest_udp_port); |
---|
708 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
709 | udp.check = 0; |
---|
710 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
711 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
712 | |
---|
713 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
714 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
715 | perror("raw socket"); |
---|
716 | exit(1); |
---|
717 | } |
---|
718 | |
---|
719 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
720 | perror("setsockopt"); |
---|
721 | exit(1); |
---|
722 | } |
---|
723 | memset(&sin, 0, sizeof(sin)); |
---|
724 | sin.sin_family = AF_INET; |
---|
725 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
726 | |
---|
727 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
728 | perror("sendto"); |
---|
729 | exit(1); |
---|
730 | } |
---|
731 | close(sd); |
---|
732 | free(packet); |
---|
733 | packet = NULL; |
---|
734 | } |
---|
735 | if ( ((FilterPtr)finded->data)->nb_filters >= 4 ) { |
---|
736 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
737 | ip.ip_hl = 0x5; |
---|
738 | ip.ip_v = 0x4; |
---|
739 | ip.ip_tos = 0x0; |
---|
740 | ip.ip_len = pcktPtr->ipH->length; |
---|
741 | ip.ip_id = pcktPtr->ipH->ident; |
---|
742 | ip.ip_off = 0x0; |
---|
743 | ip.ip_ttl = 64; |
---|
744 | ip.ip_p = IPPROTO_UDP; |
---|
745 | ip.ip_sum = 0x0; |
---|
746 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->fourth_router_ip); |
---|
747 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->fourth_destination_ip); |
---|
748 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
749 | memcpy(packet, &ip, sizeof(ip)); |
---|
750 | udp.source = htons(6604); |
---|
751 | udp.dest = htons(((FilterPtr)finded->data)->fourth_dest_udp_port); |
---|
752 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
753 | udp.check = 0; |
---|
754 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
755 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
756 | |
---|
757 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
758 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
759 | perror("raw socket"); |
---|
760 | exit(1); |
---|
761 | } |
---|
762 | |
---|
763 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
764 | perror("setsockopt"); |
---|
765 | exit(1); |
---|
766 | } |
---|
767 | memset(&sin, 0, sizeof(sin)); |
---|
768 | sin.sin_family = AF_INET; |
---|
769 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
770 | |
---|
771 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
772 | perror("sendto"); |
---|
773 | exit(1); |
---|
774 | } |
---|
775 | close(sd); |
---|
776 | free(packet); |
---|
777 | packet = NULL; |
---|
778 | } |
---|
779 | if ( ((FilterPtr)finded->data)->nb_filters >= 5 ) { |
---|
780 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
781 | ip.ip_hl = 0x5; |
---|
782 | ip.ip_v = 0x4; |
---|
783 | ip.ip_tos = 0x0; |
---|
784 | ip.ip_len = pcktPtr->ipH->length; |
---|
785 | ip.ip_id = pcktPtr->ipH->ident; |
---|
786 | ip.ip_off = 0x0; |
---|
787 | ip.ip_ttl = 64; |
---|
788 | ip.ip_p = IPPROTO_UDP; |
---|
789 | ip.ip_sum = 0x0; |
---|
790 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->five_router_ip); |
---|
791 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->five_destination_ip); |
---|
792 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
793 | memcpy(packet, &ip, sizeof(ip)); |
---|
794 | udp.source = htons(6604); |
---|
795 | udp.dest = htons(((FilterPtr)finded->data)->five_dest_udp_port); |
---|
796 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
797 | udp.check = 0; |
---|
798 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
799 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
800 | |
---|
801 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
802 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
803 | perror("raw socket"); |
---|
804 | exit(1); |
---|
805 | } |
---|
806 | |
---|
807 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
808 | perror("setsockopt"); |
---|
809 | exit(1); |
---|
810 | } |
---|
811 | memset(&sin, 0, sizeof(sin)); |
---|
812 | sin.sin_family = AF_INET; |
---|
813 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
814 | |
---|
815 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
816 | perror("sendto"); |
---|
817 | exit(1); |
---|
818 | } |
---|
819 | close(sd); |
---|
820 | free(packet); |
---|
821 | packet = NULL; |
---|
822 | } |
---|
823 | if ( ((FilterPtr)finded->data)->nb_filters == 6 ) { |
---|
824 | packet = (u_char *)malloc(pcktPtr->ipH->length); |
---|
825 | ip.ip_hl = 0x5; |
---|
826 | ip.ip_v = 0x4; |
---|
827 | ip.ip_tos = 0x0; |
---|
828 | ip.ip_len = pcktPtr->ipH->length; |
---|
829 | ip.ip_id = pcktPtr->ipH->ident; |
---|
830 | ip.ip_off = 0x0; |
---|
831 | ip.ip_ttl = 64; |
---|
832 | ip.ip_p = IPPROTO_UDP; |
---|
833 | ip.ip_sum = 0x0; |
---|
834 | ip.ip_src.s_addr = htonl(((FilterPtr)finded->data)->six_router_ip); |
---|
835 | ip.ip_dst.s_addr = htonl(((FilterPtr)finded->data)->six_destination_ip); |
---|
836 | ip.ip_sum = in_cksum((u16 *)&ip, sizeof(ip)); |
---|
837 | memcpy(packet, &ip, sizeof(ip)); |
---|
838 | udp.source = htons(6604); |
---|
839 | udp.dest = htons(((FilterPtr)finded->data)->six_dest_udp_port); |
---|
840 | udp.len = htons(pcktPtr->ipH->length-20); |
---|
841 | udp.check = 0; |
---|
842 | udp.check = udp_checksum(ip.ip_src.s_addr, ip.ip_dst.s_addr, (u16 *)&udp, sizeof(udp)); |
---|
843 | memcpy(packet+20, &udp, sizeof(udp)); |
---|
844 | |
---|
845 | memcpy(packet+28, (ptr_buffer+28), (pcktPtr->ipH->length)-28); |
---|
846 | if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { |
---|
847 | perror("raw socket"); |
---|
848 | exit(1); |
---|
849 | } |
---|
850 | |
---|
851 | if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) < 0) { |
---|
852 | perror("setsockopt"); |
---|
853 | exit(1); |
---|
854 | } |
---|
855 | memset(&sin, 0, sizeof(sin)); |
---|
856 | sin.sin_family = AF_INET; |
---|
857 | sin.sin_addr.s_addr = ip.ip_dst.s_addr; |
---|
858 | |
---|
859 | if (sendto(sd, packet, pcktPtr->ipH->length, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { |
---|
860 | perror("sendto"); |
---|
861 | exit(1); |
---|
862 | } |
---|
863 | close(sd); |
---|
864 | free(packet); |
---|
865 | packet = NULL; |
---|
866 | } |
---|
867 | } |
---|
868 | return(0); |
---|
869 | } |
---|
870 | |
---|
871 | int |
---|
872 | main (int argc, char *argv[]) |
---|
873 | { |
---|
874 | if ( argc != 2) { |
---|
875 | fprintf (stderr, |
---|
876 | "%s: Usage: %s <filter file name>\n exp: %s /tmp/routers_filters.txt\n", |
---|
877 | argv[0], argv[0], argv[0]); |
---|
878 | exit(1); |
---|
879 | } |
---|
880 | |
---|
881 | |
---|
882 | if (hcreate(NB_ENTRY) == 0){ |
---|
883 | perror("hcreate"); |
---|
884 | exit(1); |
---|
885 | } |
---|
886 | |
---|
887 | |
---|
888 | myFilterFileName = argv[1]; |
---|
889 | if (getFilters(myFilterFileName)==-1) |
---|
890 | { |
---|
891 | fprintf (stderr, "error in reading your file :\"%s\" \n", myFilterFileName); |
---|
892 | exit(1); |
---|
893 | }; |
---|
894 | |
---|
895 | pcktPtr = (DatagramPtr) malloc(sizeof(struct Datagram)); |
---|
896 | if (pcktPtr==NULL) { |
---|
897 | fprintf(stderr, "ERROR in struct Datagram allocation\n"); |
---|
898 | exit(1); |
---|
899 | } else { |
---|
900 | pcktPtr->ipH = (IpHeaderPtr) malloc(sizeof(struct IpHeader)); |
---|
901 | pcktPtr->udp_header = (UdpHeaderPtr) malloc(sizeof(struct UdpHeader)); |
---|
902 | } |
---|
903 | if (! (ptr_buffer = malloc(sockBufSize))) |
---|
904 | { |
---|
905 | printf("ERROR during socket buffer allocation\n"); |
---|
906 | exit(2); |
---|
907 | } |
---|
908 | |
---|
909 | |
---|
910 | initSocket(); |
---|
911 | do { |
---|
912 | socketReading(); |
---|
913 | } while(1); |
---|
914 | |
---|
915 | |
---|
916 | |
---|
917 | hdestroy(); |
---|
918 | exit(1); |
---|
919 | } |
---|