xref: /aosp_15_r20/external/iproute2/lib/ipx_ntop.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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