1*de1e4e89SAndroid Build Coastguard Worker #include <errno.h>
2*de1e4e89SAndroid Build Coastguard Worker #include <sys/types.h>
3*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h>
4*de1e4e89SAndroid Build Coastguard Worker #include <netinet/in.h>
5*de1e4e89SAndroid Build Coastguard Worker
6*de1e4e89SAndroid Build Coastguard Worker #include "utils.h"
7*de1e4e89SAndroid Build Coastguard Worker
do_digit(char * str,u_int32_t addr,u_int32_t scale,size_t * pos,size_t len)8*de1e4e89SAndroid Build Coastguard Worker static __inline__ int do_digit(char *str, u_int32_t addr, u_int32_t scale, size_t *pos, size_t len)
9*de1e4e89SAndroid Build Coastguard Worker {
10*de1e4e89SAndroid Build Coastguard Worker u_int32_t tmp = addr >> (scale * 4);
11*de1e4e89SAndroid Build Coastguard Worker
12*de1e4e89SAndroid Build Coastguard Worker if (*pos == len)
13*de1e4e89SAndroid Build Coastguard Worker return 1;
14*de1e4e89SAndroid Build Coastguard Worker
15*de1e4e89SAndroid Build Coastguard Worker tmp &= 0x0f;
16*de1e4e89SAndroid Build Coastguard Worker if (tmp > 9)
17*de1e4e89SAndroid Build Coastguard Worker *str = tmp + 'A' - 10;
18*de1e4e89SAndroid Build Coastguard Worker else
19*de1e4e89SAndroid Build Coastguard Worker *str = tmp + '0';
20*de1e4e89SAndroid Build Coastguard Worker (*pos)++;
21*de1e4e89SAndroid Build Coastguard Worker
22*de1e4e89SAndroid Build Coastguard Worker return 0;
23*de1e4e89SAndroid Build Coastguard Worker }
24*de1e4e89SAndroid Build Coastguard Worker
ipx_ntop1(const struct ipx_addr * addr,char * str,size_t len)25*de1e4e89SAndroid Build Coastguard Worker static const char *ipx_ntop1(const struct ipx_addr *addr, char *str, size_t len)
26*de1e4e89SAndroid Build Coastguard Worker {
27*de1e4e89SAndroid Build Coastguard Worker int i;
28*de1e4e89SAndroid Build Coastguard Worker size_t pos = 0;
29*de1e4e89SAndroid Build Coastguard Worker
30*de1e4e89SAndroid Build Coastguard Worker if (len == 0)
31*de1e4e89SAndroid Build Coastguard Worker return str;
32*de1e4e89SAndroid Build Coastguard Worker
33*de1e4e89SAndroid Build Coastguard Worker for(i = 7; i >= 0; i--)
34*de1e4e89SAndroid Build Coastguard Worker if (do_digit(str + pos, ntohl(addr->ipx_net), i, &pos, len))
35*de1e4e89SAndroid Build Coastguard Worker return str;
36*de1e4e89SAndroid Build Coastguard Worker
37*de1e4e89SAndroid Build Coastguard Worker if (pos == len)
38*de1e4e89SAndroid Build Coastguard Worker return str;
39*de1e4e89SAndroid Build Coastguard Worker
40*de1e4e89SAndroid Build Coastguard Worker *(str + pos) = '.';
41*de1e4e89SAndroid Build Coastguard Worker pos++;
42*de1e4e89SAndroid Build Coastguard Worker
43*de1e4e89SAndroid Build Coastguard Worker for(i = 0; i < 6; i++) {
44*de1e4e89SAndroid Build Coastguard Worker if (do_digit(str + pos, addr->ipx_node[i], 1, &pos, len))
45*de1e4e89SAndroid Build Coastguard Worker return str;
46*de1e4e89SAndroid Build Coastguard Worker if (do_digit(str + pos, addr->ipx_node[i], 0, &pos, len))
47*de1e4e89SAndroid Build Coastguard Worker return str;
48*de1e4e89SAndroid Build Coastguard Worker }
49*de1e4e89SAndroid Build Coastguard Worker
50*de1e4e89SAndroid Build Coastguard Worker if (pos == len)
51*de1e4e89SAndroid Build Coastguard Worker return str;
52*de1e4e89SAndroid Build Coastguard Worker
53*de1e4e89SAndroid Build Coastguard Worker *(str + pos) = 0;
54*de1e4e89SAndroid Build Coastguard Worker
55*de1e4e89SAndroid Build Coastguard Worker return str;
56*de1e4e89SAndroid Build Coastguard Worker }
57*de1e4e89SAndroid Build Coastguard Worker
58*de1e4e89SAndroid Build Coastguard Worker
ipx_ntop(int af,const void * addr,char * str,size_t len)59*de1e4e89SAndroid Build Coastguard Worker const char *ipx_ntop(int af, const void *addr, char *str, size_t len)
60*de1e4e89SAndroid Build Coastguard Worker {
61*de1e4e89SAndroid Build Coastguard Worker switch(af) {
62*de1e4e89SAndroid Build Coastguard Worker case AF_IPX:
63*de1e4e89SAndroid Build Coastguard Worker errno = 0;
64*de1e4e89SAndroid Build Coastguard Worker return ipx_ntop1((struct ipx_addr *)addr, str, len);
65*de1e4e89SAndroid Build Coastguard Worker default:
66*de1e4e89SAndroid Build Coastguard Worker errno = EAFNOSUPPORT;
67*de1e4e89SAndroid Build Coastguard Worker }
68*de1e4e89SAndroid Build Coastguard Worker
69*de1e4e89SAndroid Build Coastguard Worker return NULL;
70*de1e4e89SAndroid Build Coastguard Worker }
71