xref: /plan9/sys/src/ape/lib/bsd/inet_addr.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1219b2ee8SDavid du Colombier /* posix */
2219b2ee8SDavid du Colombier #include <sys/types.h>
3219b2ee8SDavid du Colombier #include <unistd.h>
4219b2ee8SDavid du Colombier #include <stdlib.h>
5219b2ee8SDavid du Colombier #include <string.h>
6219b2ee8SDavid du Colombier 
7219b2ee8SDavid du Colombier /* bsd extensions */
8219b2ee8SDavid du Colombier #include <sys/uio.h>
9219b2ee8SDavid du Colombier #include <sys/socket.h>
10219b2ee8SDavid du Colombier #include <netinet/in.h>
11219b2ee8SDavid du Colombier 
12219b2ee8SDavid du Colombier #define CLASS(x)	(x[0]>>6)
13219b2ee8SDavid du Colombier 
14219b2ee8SDavid du Colombier unsigned long
inet_addr(char * from)15219b2ee8SDavid du Colombier inet_addr(char *from)
16219b2ee8SDavid du Colombier {
17219b2ee8SDavid du Colombier 	int i;
18219b2ee8SDavid du Colombier 	char *p;
19219b2ee8SDavid du Colombier 	unsigned char to[4];
20219b2ee8SDavid du Colombier 	unsigned long x;
21219b2ee8SDavid du Colombier 
22219b2ee8SDavid du Colombier 	p = from;
23219b2ee8SDavid du Colombier 	memset(to, 0, 4);
24219b2ee8SDavid du Colombier 	for(i = 0; i < 4 && *p; i++){
25219b2ee8SDavid du Colombier 		to[i] = strtoul(p, &p, 0);
26219b2ee8SDavid du Colombier 		if(*p == '.')
27219b2ee8SDavid du Colombier 			p++;
28219b2ee8SDavid du Colombier 	}
29219b2ee8SDavid du Colombier 
30219b2ee8SDavid du Colombier 	switch(CLASS(to)){
31219b2ee8SDavid du Colombier 	case 0:	/* class A - 1 byte net */
32219b2ee8SDavid du Colombier 	case 1:
33219b2ee8SDavid du Colombier 		if(i == 3){
34219b2ee8SDavid du Colombier 			to[3] = to[2];
35219b2ee8SDavid du Colombier 			to[2] = to[1];
36219b2ee8SDavid du Colombier 			to[1] = 0;
37219b2ee8SDavid du Colombier 		} else if (i == 2){
38219b2ee8SDavid du Colombier 			to[3] = to[1];
39219b2ee8SDavid du Colombier 			to[1] = 0;
40219b2ee8SDavid du Colombier 		}
41219b2ee8SDavid du Colombier 		break;
42219b2ee8SDavid du Colombier 	case 2:	/* class B - 2 byte net */
43219b2ee8SDavid du Colombier 		if(i == 3){
44219b2ee8SDavid du Colombier 			to[3] = to[2];
45219b2ee8SDavid du Colombier 			to[2] = 0;
46219b2ee8SDavid du Colombier 		}
47219b2ee8SDavid du Colombier 		break;
48219b2ee8SDavid du Colombier 	}
49219b2ee8SDavid du Colombier 	x = nptohl(to);
50*7dd7cddfSDavid du Colombier 	x = htonl(x);
51219b2ee8SDavid du Colombier 	return x;
52219b2ee8SDavid du Colombier }
53