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