1 #include <errno.h> 2 #include <sys/types.h> 3 #include <netinet/in.h> 4 5 #include "utils.h" 6 7 static __inline__ u_int16_t dn_htons(u_int16_t addr) 8 { 9 union { 10 u_int8_t byte[2]; 11 u_int16_t word; 12 } u; 13 14 u.word = addr; 15 return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8); 16 } 17 18 19 static int dnet_num(const char *src, u_int16_t * dst) 20 { 21 int rv = 0; 22 int tmp; 23 *dst = 0; 24 25 while ((tmp = *src++) != 0) { 26 tmp -= '0'; 27 if ((tmp < 0) || (tmp > 9)) 28 return rv; 29 30 rv++; 31 (*dst) *= 10; 32 (*dst) += tmp; 33 } 34 35 return rv; 36 } 37 38 static int dnet_pton1(const char *src, struct dn_naddr *dna) 39 { 40 u_int16_t area = 0; 41 u_int16_t node = 0; 42 int pos; 43 44 pos = dnet_num(src, &area); 45 if ((pos == 0) || (area > 63) || (*(src + pos) != '.')) 46 return 0; 47 pos = dnet_num(src + pos + 1, &node); 48 if ((pos == 0) || (node > 1023)) 49 return 0; 50 dna->a_len = 2; 51 *(u_int16_t *)dna->a_addr = dn_htons((area << 10) | node); 52 53 return 1; 54 } 55 56 int dnet_pton(int af, const char *src, void *addr) 57 { 58 int err; 59 60 switch (af) { 61 case AF_DECnet: 62 errno = 0; 63 err = dnet_pton1(src, (struct dn_naddr *)addr); 64 break; 65 default: 66 errno = EAFNOSUPPORT; 67 err = -1; 68 } 69 70 return err; 71 } 72