Home | History | Annotate | Download | only in lib
      1 #include <errno.h>
      2 #include <string.h>
      3 #include <sys/types.h>
      4 #include <sys/socket.h>
      5 #include <netinet/in.h>
      6 
      7 #include "utils.h"
      8 
      9 static u_int32_t hexget(char c)
     10 {
     11 	if (c >= 'A' && c <= 'F')
     12 		return c - 'A' + 10;
     13 	if (c >= 'a' && c <= 'f')
     14 		return c - 'a' + 10;
     15 	if (c >= '0' && c <= '9')
     16 		return c - '0';
     17 
     18 	return 0xf0;
     19 }
     20 
     21 static int ipx_getnet(u_int32_t *net, const char *str)
     22 {
     23 	int i;
     24 	u_int32_t tmp;
     25 
     26 	for(i = 0; *str && (i < 8); i++) {
     27 
     28 		if ((tmp = hexget(*str)) & 0xf0) {
     29 			if (*str == '.')
     30 				return 0;
     31 			else
     32 				return -1;
     33 		}
     34 
     35 		str++;
     36 		(*net) <<= 4;
     37 		(*net) |= tmp;
     38 	}
     39 
     40 	if (*str == 0)
     41 		return 0;
     42 
     43 	return -1;
     44 }
     45 
     46 static int ipx_getnode(u_int8_t *node, const char *str)
     47 {
     48 	int i;
     49 	u_int32_t tmp;
     50 
     51 	for(i = 0; i < 6; i++) {
     52 		if ((tmp = hexget(*str++)) & 0xf0)
     53 			return -1;
     54 		node[i] = (u_int8_t)tmp;
     55 		node[i] <<= 4;
     56 		if ((tmp = hexget(*str++)) & 0xf0)
     57 			return -1;
     58 		node[i] |= (u_int8_t)tmp;
     59 		if (*str == ':')
     60 			str++;
     61 	}
     62 
     63 	return 0;
     64 }
     65 
     66 static int ipx_pton1(const char *src, struct ipx_addr *addr)
     67 {
     68 	char *sep = (char *)src;
     69 	int no_node = 0;
     70 
     71 	memset(addr, 0, sizeof(struct ipx_addr));
     72 
     73 	while(*sep && (*sep != '.'))
     74 		sep++;
     75 
     76 	if (*sep != '.')
     77 		no_node = 1;
     78 
     79 	if (ipx_getnet(&addr->ipx_net, src))
     80 		return 0;
     81 
     82 	addr->ipx_net = htonl(addr->ipx_net);
     83 
     84 	if (no_node)
     85 		return 1;
     86 
     87 	if (ipx_getnode(addr->ipx_node, sep + 1))
     88 		return 0;
     89 
     90 	return 1;
     91 }
     92 
     93 int ipx_pton(int af, const char *src, void *addr)
     94 {
     95 	int err;
     96 
     97 	switch (af) {
     98 	case AF_IPX:
     99 		errno = 0;
    100 		err = ipx_pton1(src, (struct ipx_addr *)addr);
    101 		break;
    102 	default:
    103 		errno = EAFNOSUPPORT;
    104 		err = -1;
    105 	}
    106 
    107 	return err;
    108 }
    109