Fixes stat() #include
[akaros.git] / user / iplib / ipaux.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <stdio.h>
12 #include <parlib.h>
13 #include <unistd.h>
14 #include <signal.h>
15 #include <iplib.h>
16
17 /*
18  *  well known IP addresses
19  */
20 uint8_t IPv4bcast[IPaddrlen] = {
21         0, 0, 0, 0,
22         0, 0, 0, 0,
23         0, 0, 0xff, 0xff,
24         0xff, 0xff, 0xff, 0xff
25 };
26 uint8_t IPv4allsys[IPaddrlen] = {
27         0, 0, 0, 0,
28         0, 0, 0, 0,
29         0, 0, 0xff, 0xff,
30         0xe0, 0, 0, 0x01
31 };
32 uint8_t IPv4allrouter[IPaddrlen] = {
33         0, 0, 0, 0,
34         0, 0, 0, 0,
35         0, 0, 0xff, 0xff,
36         0xe0, 0, 0, 0x02
37 };
38 uint8_t IPallbits[IPaddrlen] = {
39         0xff, 0xff, 0xff, 0xff,
40         0xff, 0xff, 0xff, 0xff,
41         0xff, 0xff, 0xff, 0xff,
42         0xff, 0xff, 0xff, 0xff
43 };
44 uint8_t IPnoaddr[IPaddrlen];
45
46 /*
47  *  prefix of all v4 addresses
48  */
49 uint8_t v4prefix[IPaddrlen] = {
50         0, 0, 0, 0,
51         0, 0, 0, 0,
52         0, 0, 0xff, 0xff,
53         0, 0, 0, 0
54 };
55
56 int
57 isv4(uint8_t *ip)
58 {
59         return memcmp(ip, v4prefix, IPv4off) == 0;
60 }
61
62 /*
63  *  the following routines are unrolled with no memset's to speed
64  *  up the usual case
65  */
66 void
67 v4tov6(uint8_t *v6, uint8_t *v4)
68 {
69         v6[0] = 0;
70         v6[1] = 0;
71         v6[2] = 0;
72         v6[3] = 0;
73         v6[4] = 0;
74         v6[5] = 0;
75         v6[6] = 0;
76         v6[7] = 0;
77         v6[8] = 0;
78         v6[9] = 0;
79         v6[10] = 0xff;
80         v6[11] = 0xff;
81         v6[12] = v4[0];
82         v6[13] = v4[1];
83         v6[14] = v4[2];
84         v6[15] = v4[3];
85 }
86
87 int
88 v6tov4(uint8_t *v4, uint8_t *v6)
89 {
90         if(v6[0] == 0
91         && v6[1] == 0
92         && v6[2] == 0
93         && v6[3] == 0
94         && v6[4] == 0
95         && v6[5] == 0
96         && v6[6] == 0
97         && v6[7] == 0
98         && v6[8] == 0
99         && v6[9] == 0
100         && v6[10] == 0xff
101         && v6[11] == 0xff)
102         {
103                 v4[0] = v6[12];
104                 v4[1] = v6[13];
105                 v4[2] = v6[14];
106                 v4[3] = v6[15];
107                 return 0;
108         } else {
109                 memset(v4, 0, 4);
110                 if(memcmp(v6, IPnoaddr, IPaddrlen) == 0)
111                         return 0;
112                 return -1;
113         }
114 }