PCI: adds device-specific data pointer
[akaros.git] / user / bsd / inet_addr.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 /* posix */
10 #include <sys/types.h>
11 #include <unistd.h>
12 #include <stdlib.h>
13 #include <string.h>
14
15 /* bsd extensions */
16 #include <sys/uio.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19
20 #include "priv.h"
21
22 /* where to define this? only used once? */
23 unsigned long nptohl(void *p);
24
25 #define CLASS(x)        (x[0]>>6)
26
27 unsigned long
28 inet_addr(char *from)
29 {
30         int i;
31         char *p;
32         unsigned char to[4];
33         unsigned long x;
34  
35         p = from;
36         memset(to, 0, 4);
37         for(i = 0; i < 4 && *p; i++){
38                 to[i] = strtoul(p, &p, 0);
39                 if(*p == '.')
40                         p++;
41         }
42
43         switch(CLASS(to)){
44         case 0: /* class A - 1 byte net */
45         case 1:
46                 if(i == 3){
47                         to[3] = to[2];
48                         to[2] = to[1];
49                         to[1] = 0;
50                 } else if (i == 2){
51                         to[3] = to[1];
52                         to[1] = 0;
53                 }
54                 break;
55         case 2: /* class B - 2 byte net */
56                 if(i == 3){
57                         to[3] = to[2];
58                         to[2] = 0;
59                 }
60                 break;
61         }
62         x = nptohl(to);
63         x = htonl(x);
64         return x;
65 }