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