Blame


1 d7094239 2003-11-23 devnull #include <u.h>
2 d7094239 2003-11-23 devnull #include <libc.h>
3 d7094239 2003-11-23 devnull #include <ip.h>
4 d7094239 2003-11-23 devnull
5 d7094239 2003-11-23 devnull char*
6 d7094239 2003-11-23 devnull v4parseip(uchar *to, char *from)
7 d7094239 2003-11-23 devnull {
8 d7094239 2003-11-23 devnull int i;
9 d7094239 2003-11-23 devnull char *p;
10 d7094239 2003-11-23 devnull
11 d7094239 2003-11-23 devnull p = from;
12 d7094239 2003-11-23 devnull for(i = 0; i < 4 && *p; i++){
13 d7094239 2003-11-23 devnull to[i] = strtoul(p, &p, 0);
14 d7094239 2003-11-23 devnull if(*p == '.')
15 d7094239 2003-11-23 devnull p++;
16 d7094239 2003-11-23 devnull }
17 d7094239 2003-11-23 devnull switch(CLASS(to)){
18 d7094239 2003-11-23 devnull case 0: /* class A - 1 uchar net */
19 d7094239 2003-11-23 devnull case 1:
20 d7094239 2003-11-23 devnull if(i == 3){
21 d7094239 2003-11-23 devnull to[3] = to[2];
22 d7094239 2003-11-23 devnull to[2] = to[1];
23 d7094239 2003-11-23 devnull to[1] = 0;
24 d7094239 2003-11-23 devnull } else if (i == 2){
25 d7094239 2003-11-23 devnull to[3] = to[1];
26 d7094239 2003-11-23 devnull to[1] = 0;
27 d7094239 2003-11-23 devnull }
28 d7094239 2003-11-23 devnull break;
29 d7094239 2003-11-23 devnull case 2: /* class B - 2 uchar net */
30 d7094239 2003-11-23 devnull if(i == 3){
31 d7094239 2003-11-23 devnull to[3] = to[2];
32 d7094239 2003-11-23 devnull to[2] = 0;
33 d7094239 2003-11-23 devnull }
34 d7094239 2003-11-23 devnull break;
35 d7094239 2003-11-23 devnull }
36 d7094239 2003-11-23 devnull return p;
37 d7094239 2003-11-23 devnull }
38 d7094239 2003-11-23 devnull
39 d7094239 2003-11-23 devnull ulong
40 d7094239 2003-11-23 devnull parseip(uchar *to, char *from)
41 d7094239 2003-11-23 devnull {
42 d7094239 2003-11-23 devnull int i, elipsis = 0, v4 = 1;
43 d7094239 2003-11-23 devnull ulong x;
44 d7094239 2003-11-23 devnull char *p, *op;
45 d7094239 2003-11-23 devnull
46 d7094239 2003-11-23 devnull memset(to, 0, IPaddrlen);
47 d7094239 2003-11-23 devnull p = from;
48 d7094239 2003-11-23 devnull for(i = 0; i < 16 && *p; i+=2){
49 d7094239 2003-11-23 devnull op = p;
50 d7094239 2003-11-23 devnull x = strtoul(p, &p, 16);
51 d7094239 2003-11-23 devnull if(*p == '.' || (*p == 0 && i == 0)){
52 d7094239 2003-11-23 devnull p = v4parseip(to+i, op);
53 d7094239 2003-11-23 devnull i += 4;
54 d7094239 2003-11-23 devnull break;
55 d7094239 2003-11-23 devnull }
56 d7094239 2003-11-23 devnull to[i] = x>>8;
57 d7094239 2003-11-23 devnull to[i+1] = x;
58 d7094239 2003-11-23 devnull if(*p == ':'){
59 d7094239 2003-11-23 devnull v4 = 0;
60 d7094239 2003-11-23 devnull if(*++p == ':'){
61 d7094239 2003-11-23 devnull elipsis = i+2;
62 d7094239 2003-11-23 devnull p++;
63 d7094239 2003-11-23 devnull }
64 d7094239 2003-11-23 devnull }
65 d7094239 2003-11-23 devnull }
66 d7094239 2003-11-23 devnull if(i < 16){
67 d7094239 2003-11-23 devnull memmove(&to[elipsis+16-i], &to[elipsis], i-elipsis);
68 d7094239 2003-11-23 devnull memset(&to[elipsis], 0, 16-i);
69 d7094239 2003-11-23 devnull }
70 d7094239 2003-11-23 devnull if(v4){
71 d7094239 2003-11-23 devnull to[10] = to[11] = 0xff;
72 d7094239 2003-11-23 devnull return nhgetl(to+12);
73 d7094239 2003-11-23 devnull } else
74 d7094239 2003-11-23 devnull return 6;
75 d7094239 2003-11-23 devnull }
76 d7094239 2003-11-23 devnull
77 d7094239 2003-11-23 devnull /*
78 d7094239 2003-11-23 devnull * hack to allow ip v4 masks to be entered in the old
79 d7094239 2003-11-23 devnull * style
80 d7094239 2003-11-23 devnull */
81 d7094239 2003-11-23 devnull ulong
82 d7094239 2003-11-23 devnull parseipmask(uchar *to, char *from)
83 d7094239 2003-11-23 devnull {
84 d7094239 2003-11-23 devnull ulong x;
85 d7094239 2003-11-23 devnull int i;
86 d7094239 2003-11-23 devnull uchar *p;
87 d7094239 2003-11-23 devnull
88 d7094239 2003-11-23 devnull if(*from == '/'){
89 d7094239 2003-11-23 devnull /* as a number of prefix bits */
90 d7094239 2003-11-23 devnull i = atoi(from+1);
91 d7094239 2003-11-23 devnull if(i < 0)
92 d7094239 2003-11-23 devnull i = 0;
93 d7094239 2003-11-23 devnull if(i > 128)
94 d7094239 2003-11-23 devnull i = 128;
95 d7094239 2003-11-23 devnull memset(to, 0, IPaddrlen);
96 d7094239 2003-11-23 devnull for(p = to; i >= 8; i -= 8)
97 d7094239 2003-11-23 devnull *p++ = 0xff;
98 d7094239 2003-11-23 devnull if(i > 0)
99 d7094239 2003-11-23 devnull *p = ~((1<<(8-i))-1);
100 d7094239 2003-11-23 devnull x = nhgetl(to+IPv4off);
101 d7094239 2003-11-23 devnull } else {
102 d7094239 2003-11-23 devnull /* as a straight bit mask */
103 d7094239 2003-11-23 devnull x = parseip(to, from);
104 d7094239 2003-11-23 devnull if(memcmp(to, v4prefix, IPv4off) == 0)
105 d7094239 2003-11-23 devnull memset(to, 0xff, IPv4off);
106 d7094239 2003-11-23 devnull }
107 d7094239 2003-11-23 devnull return x;
108 d7094239 2003-11-23 devnull }
109 d7094239 2003-11-23 devnull
110 d7094239 2003-11-23 devnull /*
111 d7094239 2003-11-23 devnull * parse a v4 ip address/mask in cidr format
112 d7094239 2003-11-23 devnull */
113 d7094239 2003-11-23 devnull char*
114 d7094239 2003-11-23 devnull v4parsecidr(uchar *addr, uchar *mask, char *from)
115 d7094239 2003-11-23 devnull {
116 d7094239 2003-11-23 devnull int i;
117 d7094239 2003-11-23 devnull char *p;
118 d7094239 2003-11-23 devnull uchar *a;
119 d7094239 2003-11-23 devnull
120 d7094239 2003-11-23 devnull p = v4parseip(addr, from);
121 d7094239 2003-11-23 devnull
122 d7094239 2003-11-23 devnull if(*p == '/'){
123 d7094239 2003-11-23 devnull /* as a number of prefix bits */
124 d7094239 2003-11-23 devnull i = strtoul(p+1, &p, 0);
125 d7094239 2003-11-23 devnull if(i > 32)
126 d7094239 2003-11-23 devnull i = 32;
127 d7094239 2003-11-23 devnull memset(mask, 0, IPv4addrlen);
128 d7094239 2003-11-23 devnull for(a = mask; i >= 8; i -= 8)
129 d7094239 2003-11-23 devnull *a++ = 0xff;
130 d7094239 2003-11-23 devnull if(i > 0)
131 d7094239 2003-11-23 devnull *a = ~((1<<(8-i))-1);
132 fa325e9b 2020-01-10 cross } else
133 d7094239 2003-11-23 devnull memcpy(mask, defmask(addr), IPv4addrlen);
134 d7094239 2003-11-23 devnull return p;
135 d7094239 2003-11-23 devnull }