source: titan/titan/inetwork.h @ 15338

Last change on this file since 15338 was 15146, checked in by nit, 12 years ago

[titan] fix network

File size: 14.7 KB
Line 
1#ifndef INETWORK_H
2#define INETWORK_H
3
4void delinetworkfound()
5{
6        debug(1000, "in");
7        struct inetwork *node = inetwork;
8
9        while(node != NULL)
10        {
11                node->found = 0;
12                node = node->next;
13        }
14}
15
16struct inetwork* getinetworkfirstwlan()
17{
18        debug(1000, "in");
19        struct inetwork *node = inetwork;
20
21        while(node != NULL)
22        {
23                if(ostrcmp(node->device, "ra0") == 0)
24                {
25                        debug(1000, "out");
26                        return node;
27                }
28                if(ostrcmp(node->device, "wlan0") == 0)
29                {
30                        debug(1000, "out");
31                        return node;
32                }
33
34                node = node->next;
35        }
36        return NULL;
37}
38
39struct inetwork* getinetworkbydevice(char* device)
40{
41        debug(1000, "in");
42        struct inetwork *node = inetwork;
43
44        while(node != NULL)
45        {
46                if(ostrcmp(node->device, device) == 0)
47                {
48                        debug(1000, "out");
49                        return node;
50                }
51
52                node = node->next;
53        }
54        debug(100, "inetwork not found (name=%s)", device);
55        return NULL;
56}
57
58void delinetwork(char* device)
59{
60        debug(1000, "in");
61        struct inetwork *node = inetwork, *prev = inetwork;
62       
63        while(node != NULL)
64        {
65                if(ostrcmp(node->device, device) == 0)
66                {
67                        if(node == inetwork)
68                        {
69                                inetwork = node->next;
70                                if(inetwork != NULL)
71                                        inetwork->prev = NULL;
72                        }
73                        else
74                        {
75                                prev->next = node->next;
76                                if(node->next != NULL)
77                                        node->next->prev = prev;
78                        }
79
80                        free(node->device); node->device = NULL;
81                        free(node->ip); node->ip = NULL;
82                        free(node->netmask); node->netmask = NULL;
83                        free(node->mac); node->mac = NULL;
84                        free(node->broadcast); node->broadcast = NULL;
85
86                        free(node);
87                        node = NULL;
88                        break;
89                }
90
91                prev = node;
92                node = node->next;
93        }
94        debug(1000, "out");
95}
96
97void delinetworknotfound()
98{
99        debug(1000, "in");
100        struct inetwork *node = inetwork, *prev = inetwork;
101
102        while(node != NULL)
103        {
104                prev = node;
105                node = node->next;
106                if(prev != NULL && prev->found == 0)
107                        delinetwork(prev->device);
108        }
109        debug(1000, "out");
110}
111
112//flag 0: change all
113//flag 1: check only values from getifaddrs (called from timer)
114struct inetwork* changeinetwork(char* device, char* ip, char* netmask, char* mac, char* broadcast, int dhcp, struct inetwork* node, int flag)
115{
116        if(node == NULL) return NULL;
117
118        if(ostrcmp(node->device, device) != 0)
119        {
120                free(node->device);
121                node->device = device;
122        }
123
124        if(ostrcmp(node->ip, ip) != 0)
125        {
126                free(node->ip);
127                node->ip = ip;
128        }
129
130        if(ostrcmp(node->netmask, netmask) != 0)
131        {
132                free(node->netmask);
133                node->netmask = netmask;
134        }
135
136        if(ostrcmp(node->broadcast, broadcast) != 0)
137        {
138                free(node->broadcast);
139                node->broadcast = broadcast;
140        }
141
142        if(flag == 0)
143        {
144                if(ostrcmp(node->mac, mac) != 0)
145                {
146                        free(node->mac);
147                        node->mac = mac;
148                }
149
150                node->dhcp = dhcp;
151        }
152        node->found = 1;
153
154        return node;
155}
156
157struct inetwork* addinetwork(char* device, char* ip, char* netmask, char* mac, char* broadcast, int dhcp, struct inetwork* last)
158{
159        debug(1000, "in");
160        struct inetwork *newnode = NULL, *prev = NULL, *node = inetwork;
161
162        newnode = (struct inetwork*)malloc(sizeof(struct inetwork));   
163        if(newnode == NULL)
164        {
165                err("no memory");
166                return NULL;
167        }
168
169        memset(newnode, 0, sizeof(struct inetwork));
170
171        newnode->device = device;
172        newnode->ip = ip;
173        newnode->netmask = netmask;
174        newnode->mac = mac;
175        newnode->broadcast = broadcast;
176        newnode->dhcp = dhcp;
177        newnode->found = 1;
178       
179        if(ostrcmp(device, "eth0") == 0)
180                newnode->flag = 1;
181        if(ostrcmp(device, "ra0") == 0)
182                newnode->flag = 1;
183        if(ostrcmp(device, "wlan0") == 0)
184                newnode->flag = 1;
185       
186        debug(50,"[NETWORK] device: %s", device);
187        debug(50,"[NETWORK] ip: %s", ip);
188        debug(50,"[NETWORK] netmask: %s", netmask);
189        debug(50,"[NETWORK] mac: %s", mac);
190        debug(50,"[NETWORK] broadcast: %s", broadcast);
191        debug(50,"[NETWORK] dhcp: %d\n", dhcp);
192
193        if(last == NULL)
194        {
195                while(node != NULL && strcoll(newnode->device, node->device) > 0)
196                {
197                        prev = node;
198                        node = node->next;
199                }
200        }
201        else
202        {
203                prev = last;
204                node = last->next;
205        }
206
207        if(prev == NULL)
208                inetwork = newnode;
209        else
210        {
211                prev->next = newnode;
212                newnode->prev = prev;
213        }
214        newnode->next = node;
215
216        debug(1000, "out");
217        return newnode;
218}
219
220//self == NULL: check all
221//self != NULL: check only values from getifaddrs (called from timer)
222int addinetworkall(struct stimerthread* self)
223{
224        int ret = 0;
225        struct ifaddrs *ifa = NULL, *tmpifa = NULL;
226        void* tmpaddr = NULL;
227        char* buf = NULL, *tmpstr = NULL;
228        struct inetwork* node = inetwork;
229        char* tmp_gateway = NULL;
230        char* tmp_dnsserver1 = NULL;
231        char* tmp_dnsserver2 = NULL;
232        char* cmd = NULL;
233
234        ret = getifaddrs(&ifa);
235        if(ret != 0)
236        {
237                err("get network interfaces");
238                return 1;
239        }
240
241        buf = malloc(MINMALLOC);
242        if(buf == NULL)
243        {
244                err("no mem");
245                return 1;
246        }
247
248        delinetworkfound();
249
250        for(tmpifa = ifa; tmpifa != NULL; tmpifa = tmpifa->ifa_next)
251        {
252                char* cmddev = NULL;
253                char* tmp_ipaddresse = NULL;
254                char* tmp_netmask = NULL;
255                char* tmp_mac = NULL;
256                char* tmp_broadcast = NULL;
257                char* tmp_device = NULL;
258                int tmp_dhcp = 0;
259
260                if(tmpifa->ifa_addr == NULL)
261                        continue;
262
263                //Don't add IPV6 ot other
264                if(tmpifa->ifa_addr->sa_family != AF_INET && tmpifa->ifa_addr->sa_family != AF_PACKET)
265                        continue;
266
267                cmddev = ostrcat(cmddev, tmpifa->ifa_name, 1, 0);
268                cmddev = ostrcat("ifconfig ", cmddev, 0, 1);
269
270                //Device Name
271                tmp_device = string_newline(ostrcat(tmp_device, tmpifa->ifa_name, 1, 0));
272
273                //IP ADDR
274                memset(buf, 0, MINMALLOC);
275                if(tmpifa->ifa_addr->sa_family == AF_INET)
276                        tmpaddr = &((struct sockaddr_in*)tmpifa->ifa_addr)->sin_addr;
277                else
278                        tmpaddr = &((struct sockaddr_in6*)tmpifa->ifa_addr)->sin6_addr;
279                inet_ntop(tmpifa->ifa_addr->sa_family, tmpaddr, buf, MINMALLOC);
280                if(strlen(buf) != 0)
281                {
282                        tmpstr = fixip(buf, 0);
283                        tmp_ipaddresse = string_newline(ostrcat(tmpstr, "", 1, 0));
284                }
285                else
286                        tmp_ipaddresse = ostrcat(tmp_ipaddresse, "000.000.000.000", 1, 0);
287
288                //NETMASK
289                memset(buf, 0, MINMALLOC);
290                if(tmpifa->ifa_netmask != NULL)
291                {
292                        if(tmpifa->ifa_netmask->sa_family == AF_INET)
293                                tmpaddr = &((struct sockaddr_in*)tmpifa->ifa_netmask)->sin_addr;
294                        else
295                                tmpaddr = &((struct sockaddr_in6*)tmpifa->ifa_netmask)->sin6_addr;
296                        inet_ntop(tmpifa->ifa_netmask->sa_family, tmpaddr, buf, MINMALLOC);
297
298                }
299                if(strlen(buf) != 0)
300                {
301                        tmpstr = fixip(buf, 0);
302                        tmp_netmask = string_newline(ostrcat(tmpstr, "", 1, 0));
303                }
304                else
305                        tmp_netmask = ostrcat(tmp_netmask, "000.000.000.000", 1, 0);
306
307                //BROADCAST / DSTADDR
308                memset(buf, 0, MINMALLOC);
309                if(tmpifa->ifa_ifu.ifu_broadaddr != NULL)
310                {
311                        if(tmpifa->ifa_flags & IFF_POINTOPOINT)
312                        {
313                                if(tmpifa->ifa_ifu.ifu_dstaddr->sa_family == AF_INET)
314                                        tmpaddr = &((struct sockaddr_in*)tmpifa->ifa_ifu.ifu_dstaddr)->sin_addr;
315                                else
316                                        tmpaddr = &((struct sockaddr_in6*)tmpifa->ifa_ifu.ifu_dstaddr)->sin6_addr;
317                                inet_ntop(tmpifa->ifa_ifu.ifu_dstaddr->sa_family, tmpaddr, buf, MINMALLOC);
318                        }
319                        else
320                        {
321                                if(tmpifa->ifa_ifu.ifu_broadaddr->sa_family == AF_INET)
322                                        tmpaddr = &((struct sockaddr_in*)tmpifa->ifa_ifu.ifu_broadaddr)->sin_addr;
323                                else
324                                        tmpaddr = &((struct sockaddr_in6*)tmpifa->ifa_ifu.ifu_broadaddr)->sin6_addr;
325                                inet_ntop(tmpifa->ifa_ifu.ifu_broadaddr->sa_family, tmpaddr, buf, MINMALLOC);
326                        }
327                               
328                }
329                if(strlen(buf) != 0)
330                {
331                        tmpstr = fixip(tmp_broadcast, 0);
332                        tmp_broadcast = string_newline(ostrcat(tmpstr, "",  1, 0));
333                }
334                else
335                        tmp_broadcast = ostrcat(tmp_broadcast, "000.000.000.000", 1, 0);
336
337                if(self == NULL)
338                {
339                        // MAC
340                        if(ostrcmp(cmddev, "ifconfig lo") == 0)
341                                tmp_mac = ostrcat(tmp_mac, "00:00:00:00:00:00", 1, 0);
342                        else
343                        {
344                                cmd = ostrcat(cmd, " | grep -m1 'HWaddr' | awk '{ print $5 }'", 1, 0);
345                                cmd = ostrcat(cmddev, cmd, 0, 1);
346                                tmp_mac = command(cmd);
347               
348                                if (tmp_mac != 0)
349                                        tmp_mac = string_newline(ostrcat(tmp_mac, "", 1, 0));
350                                else
351                                        tmp_mac = ostrcat(tmp_mac, "00:00:00:00:00:00", 1, 0);
352                        }
353                        free(cmd); cmd = NULL;
354
355                        // DHCP
356                        cmd = ostrcat(cmd, "cat /var/etc/network/interfaces | grep ", 1, 0);
357                        cmd = ostrcat(cmd, tmp_device, 1, 0);
358                        cmd = ostrcat(cmd, " | grep dhcp | wc -l", 1, 0);
359                        tmpstr = command(cmd);
360                        if(tmpstr != NULL)
361                                tmp_dhcp = atoi(tmpstr);
362                        free(tmpstr); tmpstr = NULL;
363                }
364
365
366                struct inetwork* tmpinetwork = getinetworkbydevice(tmp_device);
367                if(tmpinetwork != NULL)
368                {
369                        if(self == NULL)
370                                node = changeinetwork(tmp_device, tmp_ipaddresse, tmp_netmask, tmp_mac,  tmp_broadcast, tmp_dhcp, tmpinetwork, 0);
371                        else
372                                node = changeinetwork(tmp_device, tmp_ipaddresse, tmp_netmask, tmp_mac,  tmp_broadcast, tmp_dhcp, tmpinetwork, 1);
373                }
374                else
375                        node = addinetwork(tmp_device, tmp_ipaddresse, tmp_netmask, tmp_mac,  tmp_broadcast, tmp_dhcp, node);
376
377                free(cmd); cmd = NULL;
378                free(cmddev); cmddev = NULL;
379        }
380
381        freeifaddrs(ifa); ifa = NULL;
382
383        // GATEWAY
384        if(self == NULL)
385        {
386                tmp_gateway = getdefaultgw();
387                if (tmp_gateway != NULL)
388                {
389                        tmpstr = fixip(tmp_gateway, 0);
390                        status.gateway = string_newline(ostrcat(tmpstr, "", 1, 0));
391                }
392                else
393                        status.gateway = ostrcat(tmp_gateway, "000.000.000.000", 1, 0);
394
395                // DNSSERVER1
396                cmd = ostrcat(cmd, "cat /var/etc/resolv.conf | grep nameserver | awk '{ print $2 }' | head -n1 | tail -n1", 1, 0);
397                tmp_dnsserver1 = ostrcat(tmp_dnsserver1 , command(cmd), 1, 1);
398                if (tmp_dnsserver1 != NULL)
399                {
400                        tmpstr = fixip(tmp_dnsserver1, 0);
401                        free(tmp_dnsserver1); tmp_dnsserver1 = NULL;
402                        status.dnsserver1 = string_newline(ostrcat(tmpstr, "", 1, 0));
403                }
404                else
405                        status.dnsserver1 = ostrcat(tmp_dnsserver1, "000.000.000.000", 1, 0);
406                free(cmd); cmd = NULL;
407
408                // DNSSERVER2
409                cmd = ostrcat(cmd, "cat /var/etc/resolv.conf | grep nameserver | awk '{ print $2 }' | head -n2 | tail -n1", 1, 0);
410                tmp_dnsserver2 = ostrcat(tmp_dnsserver2 , command(cmd), 1, 1);
411                if (tmp_dnsserver2 != NULL)
412                {
413                        tmpstr = fixip(tmp_dnsserver2, 0);
414                        free(tmp_dnsserver2); tmp_dnsserver2 = NULL;
415                        status.dnsserver2 = string_newline(ostrcat(tmpstr, "", 1, 0));
416                }
417                else
418                        status.dnsserver2 = ostrcat(tmp_dnsserver2, "000.000.000.000", 1, 0);
419        }
420        free(cmd); cmd = NULL;
421        free(buf);
422
423        delinetworknotfound();
424        return 0;
425}
426
427//this method does not include
428//network interfaces, that not
429//configured
430/*
431int addinetworkall()
432{
433        char* buf = NULL, *tmpstr = NULL;
434        int sck, nInterfaces, i;
435        struct ifconf ifc;
436        struct ifreq *ifr;
437        struct inetwork* node = inetwork;
438        char* tmp_gateway = NULL;
439        char* tmp_dnsserver1 = NULL;
440        char* tmp_dnsserver2 = NULL;
441        char* cmd = NULL;
442
443        buf = malloc(MINMALLOC);
444        if(buf == NULL)
445        {
446                err("no mem");
447                return 1;
448        }
449
450        // Get a socket handle.
451        sck = socket(AF_INET, SOCK_DGRAM, 0);
452        if(sck < 0)
453        {
454                perror("socket");
455                return 0;
456        }
457
458        // Query available interfaces.
459        ifc.ifc_len = MINMALLOC;
460        ifc.ifc_buf = buf;
461        if(ioctl(sck, SIOCGIFCONF, &ifc) < 0)
462        {
463                perror("ioctl(SIOCGIFCONF)");
464                return 0;
465        }
466
467        // Iterate through the list of interfaces.
468        ifr = ifc.ifc_req;
469        nInterfaces = ifc.ifc_len / sizeof(struct ifreq);
470        for(i = 0; i < nInterfaces; i++)
471        {
472                struct ifreq *item = &ifr[i];
473                char* cmddev = NULL;
474                char* tmp_ipaddresse = NULL;
475                char* tmp_netmask = NULL;
476                char* tmp_mac = NULL;
477                char* tmp_broadcast = NULL;
478                char* tmp_device = NULL;
479                int tmp_dhcp = 0;
480
481                cmddev = ostrcat(cmddev, item->ifr_name, 1, 0);
482                cmddev = ostrcat("ifconfig ", cmddev, 0, 1);
483
484                // IP
485                cmd = ostrcat(cmd, " | grep -m1 'inet addr' | awk '{ print $2 }' | cut -d ':' -f2", 1, 0);
486                cmd = ostrcat(cmddev, cmd, 0, 1);
487                tmp_ipaddresse = ostrcat(tmp_ipaddresse, command(cmd), 1, 1);
488                if (tmp_ipaddresse != 0)
489                {
490                        tmpstr = fixip(tmp_ipaddresse, 0);
491                        free(tmp_ipaddresse); tmp_ipaddresse = NULL;
492                        tmp_ipaddresse = string_newline(ostrcat(tmpstr, "", 1, 0));
493                }
494                else
495                        tmp_ipaddresse = ostrcat(tmp_ipaddresse, "000.000.000.000", 1, 0);
496                free(cmd); cmd = NULL;
497
498                // NETMASK
499                if(ostrcmp(cmddev, "ifconfig lo") == 0)
500                        cmd = ostrcat(cmd, " | grep -m1 'inet addr' | awk '{ print $3 }' | cut -d ':' -f2", 1, 0);
501                else
502                        cmd = ostrcat(cmd, " | grep -m1 'inet addr' | awk '{ print $4 }' | cut -d ':' -f2", 1 ,0);
503                cmd = ostrcat(cmddev, cmd, 0, 1);
504                tmp_netmask = ostrcat(tmp_netmask , command(cmd), 1, 1);
505                if (tmp_netmask != 0)
506                {
507                        tmpstr = fixip(tmp_netmask, 0);
508                        free(tmp_netmask); tmp_netmask = NULL;
509                        tmp_netmask = string_newline(ostrcat(tmpstr, "", 1, 0));
510                }
511                else
512                        tmp_netmask = ostrcat(tmp_netmask, "000.000.000.000", 1, 0);
513                free(cmd); cmd = NULL;
514
515                // MAC
516                if(ostrcmp(cmddev, "ifconfig lo") == 0)
517                        tmp_mac = ostrcat(tmp_mac, "00:00:00:00:00:00", 1, 0);
518                else
519                {
520                        cmd = ostrcat(cmd, " | grep -m1 'HWaddr' | awk '{ print $5 }'", 1, 0);
521                        cmd = ostrcat(cmddev, cmd, 0, 1);
522                        tmp_mac = command(cmd);
523               
524                        if (tmp_mac != 0)
525                                tmp_mac = string_newline(ostrcat(tmp_mac, "", 1, 0));
526                        else
527                                tmp_mac = ostrcat(tmp_mac, "00:00:00:00:00:00", 1, 0);
528                }
529                free(cmd); cmd = NULL;
530
531                // BROADCAST
532                if(ostrcmp(cmddev, "ifconfig lo") == 0)
533                        tmp_broadcast = ostrcat(tmp_broadcast, "000.000.000.000", 1, 0);
534                else
535                {
536                        cmd = ostrcat(cmd, " | grep -m1 'inet addr' | awk '{ print $3 }' | cut -d ':' -f2", 1, 0);
537                        cmd = ostrcat(cmddev, cmd, 0, 1);
538                        tmp_broadcast = command(cmd);
539                }
540                if (tmp_broadcast != 0)
541                {
542                        tmpstr = fixip(tmp_broadcast, 0);
543                        free(tmp_broadcast); tmp_broadcast = NULL;
544                        tmp_broadcast = string_newline(ostrcat(tmpstr, "",  1, 0));
545                }
546                else
547                        tmp_broadcast = ostrcat(tmp_broadcast, "000.000.000.000", 1, 0);
548                free(cmd); cmd = NULL;
549
550                // DHCP
551                cmd = ostrcat(cmd, "cat /var/etc/network/interfaces | grep dhcp | wc -l", 1, 0);
552                tmpstr = command(cmd);
553                if(tmpstr != NULL)
554                        tmp_dhcp = atoi(tmpstr);
555                free(tmpstr); tmpstr = NULL;
556
557                // DEVICE NAME
558                tmp_device = string_newline(ostrcat(tmp_device, item->ifr_name, 1, 0));
559
560                node = addinetwork(i, tmp_device, tmp_ipaddresse, tmp_netmask, tmp_mac,  tmp_broadcast, tmp_dhcp, node);
561
562                free(cmd); cmd = NULL;
563                free(cmddev); cmddev = NULL;
564        }
565
566        // GATEWAY
567        tmp_gateway = getdefaultgw();
568        if (tmp_gateway != 0)
569        {
570                tmpstr = fixip(tmp_gateway, 0);
571                status.gateway = string_newline(ostrcat(tmpstr, "", 1, 0));
572        }
573        else
574                status.gateway = ostrcat(tmp_gateway, "000.000.000.000", 1, 0);
575
576        // DNSSERVER1
577        cmd = ostrcat(cmd, "cat /var/etc/resolv.conf | grep nameserver | awk '{ print $2 }' | head -n1 | tail -n1", 1, 0);
578        tmp_dnsserver1 = ostrcat(tmp_dnsserver1 , command(cmd), 1, 1);
579        if (tmp_dnsserver1 != 0)
580        {
581                tmpstr = fixip(tmp_dnsserver1, 0);
582                free(tmp_dnsserver1); tmp_dnsserver1 = NULL;
583                status.dnsserver1 = string_newline(ostrcat(tmpstr, "", 1, 0));
584        }
585        else
586                status.dnsserver1 = ostrcat(tmp_dnsserver1, "000.000.000.000", 1, 0);
587        free(cmd); cmd = NULL;
588
589        // DNSSERVER2
590        cmd = ostrcat(cmd, "cat /var/etc/resolv.conf | grep nameserver | awk '{ print $2 }' | head -n2 | tail -n1", 1, 0);
591        tmp_dnsserver2 = ostrcat(tmp_dnsserver2 , command(cmd), 1, 1);
592        if (tmp_dnsserver2 != 0)
593        {
594                tmpstr = fixip(tmp_dnsserver2, 0);
595                free(tmp_dnsserver2); tmp_dnsserver2 = NULL;
596                status.dnsserver2 = string_newline(ostrcat(tmpstr, "", 1, 0));
597        }
598        else
599                status.dnsserver2 = ostrcat(tmp_dnsserver2, "000.000.000.000", 1, 0);
600        free(cmd); cmd = NULL;
601
602        free(buf);
603        return 0;
604}
605*/
606
607void freeinetwork()
608{
609        debug(1000, "in");
610        struct inetwork *node = inetwork, *prev = inetwork;
611
612        while(node != NULL)
613        {
614                prev = node;
615                node = node->next;
616                if(prev != NULL)
617                        delinetwork(prev->device);
618        }
619        debug(1000, "out");
620}
621
622#endif
Note: See TracBrowser for help on using the repository browser.