]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libip/myipaddr.c
ip/ipconfig: use ewrite() to enable routing command for sendra
[plan9front.git] / sys / src / libip / myipaddr.c
1 #include <u.h>
2 #include <libc.h>
3 #include <ip.h>
4
5 static uchar loopbacknet[IPaddrlen] = {
6         0, 0, 0, 0,
7         0, 0, 0, 0,
8         0, 0, 0xff, 0xff,
9         127, 0, 0, 0
10 };
11 static uchar loopbackmask[IPaddrlen] = {
12         0xff, 0xff, 0xff, 0xff,
13         0xff, 0xff, 0xff, 0xff,
14         0xff, 0xff, 0xff, 0xff,
15         0xff, 0, 0, 0
16 };
17 static uchar loopback6[IPaddrlen] = {
18         0, 0, 0, 0,
19         0, 0, 0, 0,
20         0, 0, 0, 0,
21         0, 0, 0, 1
22 };
23
24 // find first ip that isn't a friggin loopback or
25 // link-local address. prefer v4 over v6.
26 int
27 myipaddr(uchar *ip, char *net)
28 {
29         Ipifc *nifc;
30         Iplifc *lifc;
31         static Ipifc *ifc;
32         uchar mynet[IPaddrlen];
33
34         ipmove(ip, IPnoaddr);
35         ifc = readipifc(net, ifc, -1);
36         for(nifc = ifc; nifc != nil; nifc = nifc->next){
37                 for(lifc = nifc->lifc; lifc != nil; lifc = lifc->next){
38                         /* unspecified */
39                         if(ipcmp(lifc->ip, IPnoaddr) == 0)
40                                 continue;
41
42                         if(isv4(lifc->ip)){
43                                 /* ipv4 loopback */
44                                 maskip(lifc->ip, loopbackmask, mynet);
45                                 if(ipcmp(mynet, loopbacknet) == 0)
46                                         continue;
47         
48                                 ipmove(ip, lifc->ip);
49                                 return 0;
50                         }
51
52                         /* already got a v6 address? */
53                         if(ipcmp(ip, IPnoaddr) != 0)
54                                 continue;
55
56                         /* ipv6 loopback */
57                         if(ipcmp(lifc->ip, loopback6) == 0)
58                                 continue;
59
60                         /* ipv6 linklocal */
61                         if(ISIPV6LINKLOCAL(lifc->ip))
62                                 continue;
63
64                         /* save first v6 address */
65                         ipmove(ip, lifc->ip);
66                 }
67         }
68         return ipcmp(ip, IPnoaddr) != 0 ? 0 : -1;
69 }