Annotation of ircnowd/src/ipaddr/ng_ipaddr.h, Revision 1.1
1.1 ! tomglok 1: /*
! 2: * (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
! 3: */
! 4:
! 5: #ifndef NG_IPADDR_HDR
! 6: #define NG_IPADDR_HDR
! 7:
! 8: #include "portab.h"
! 9:
! 10: /**
! 11: * @file
! 12: * Functions for AF_ agnostic ipv4/ipv6 handling (header).
! 13: */
! 14:
! 15: #include <assert.h>
! 16: #include <string.h>
! 17: #include <sys/socket.h>
! 18: #include <netinet/in.h>
! 19:
! 20: #ifdef HAVE_ARPA_INET_H
! 21: # include <arpa/inet.h>
! 22: #else
! 23: # define PF_INET AF_INET
! 24: #endif
! 25:
! 26:
! 27: #ifdef WANT_IPV6
! 28: #define NG_INET_ADDRSTRLEN INET6_ADDRSTRLEN
! 29: #else
! 30: #define NG_INET_ADDRSTRLEN 16
! 31: #endif
! 32:
! 33:
! 34: #ifdef WANT_IPV6
! 35: typedef union {
! 36: struct sockaddr sa;
! 37: struct sockaddr_in sin4;
! 38: struct sockaddr_in6 sin6;
! 39: } ng_ipaddr_t;
! 40: #else
! 41: /* assume compiler can't deal with typedef struct {... */
! 42: struct NG_IP_ADDR_DONTUSE {
! 43: struct sockaddr_in sin4;
! 44: };
! 45: typedef struct NG_IP_ADDR_DONTUSE ng_ipaddr_t;
! 46: #endif
! 47:
! 48:
! 49: static inline int
! 50: ng_ipaddr_af(const ng_ipaddr_t *a)
! 51: {
! 52: assert(a != NULL);
! 53: #ifdef WANT_IPV6
! 54: return a->sa.sa_family;
! 55: #else
! 56: assert(a->sin4.sin_family == 0 || a->sin4.sin_family == AF_INET);
! 57: return a->sin4.sin_family;
! 58: #endif
! 59: }
! 60:
! 61:
! 62: static inline socklen_t
! 63: ng_ipaddr_salen(const ng_ipaddr_t *a)
! 64: {
! 65: assert(a != NULL);
! 66: #ifdef WANT_IPV6
! 67: assert(a->sa.sa_family == AF_INET || a->sa.sa_family == AF_INET6);
! 68: if (a->sa.sa_family == AF_INET6)
! 69: return (socklen_t)sizeof(a->sin6);
! 70: #endif
! 71: assert(a->sin4.sin_family == AF_INET);
! 72: return (socklen_t)sizeof(a->sin4);
! 73: }
! 74:
! 75:
! 76: static inline UINT16
! 77: ng_ipaddr_getport(const ng_ipaddr_t *a)
! 78: {
! 79: #ifdef WANT_IPV6
! 80: int af = a->sa.sa_family;
! 81:
! 82: assert(a != NULL);
! 83: assert(af == AF_INET || af == AF_INET6);
! 84:
! 85: if (af == AF_INET6)
! 86: return ntohs(a->sin6.sin6_port);
! 87: #endif /* WANT_IPV6 */
! 88:
! 89: assert(a != NULL);
! 90: assert(a->sin4.sin_family == AF_INET);
! 91: return ntohs(a->sin4.sin_port);
! 92: }
! 93:
! 94: /*
! 95: * init a ng_ipaddr_t object.
! 96: * @param addr: pointer to ng_ipaddr_t to initialize.
! 97: * @param ip_str: ip address in dotted-decimal (ipv4) or hexadecimal (ipv6) notation
! 98: * @param port: transport layer port number to use.
! 99: */
! 100: GLOBAL bool ng_ipaddr_init PARAMS((ng_ipaddr_t *addr, const char *ip_str, UINT16 port));
! 101:
! 102: /* set sin4/sin6_port, depending on a->sa_family */
! 103: GLOBAL void ng_ipaddr_setport PARAMS((ng_ipaddr_t *a, UINT16 port));
! 104:
! 105: /* return true if a and b have the same IP address. If a and b have different AF, return false. */
! 106: GLOBAL bool ng_ipaddr_ipequal PARAMS((const ng_ipaddr_t *a, const ng_ipaddr_t *b));
! 107:
! 108:
! 109: #ifdef WANT_IPV6
! 110: /* convert struct sockaddr to string, returns pointer to static buffer */
! 111: GLOBAL const char *ng_ipaddr_tostr PARAMS((const ng_ipaddr_t *addr));
! 112:
! 113: /* convert struct sockaddr to string. dest must be NG_INET_ADDRSTRLEN bytes long */
! 114: GLOBAL bool ng_ipaddr_tostr_r PARAMS((const ng_ipaddr_t *addr, char *dest));
! 115: #else
! 116: static inline const char*
! 117: ng_ipaddr_tostr(const ng_ipaddr_t *addr)
! 118: {
! 119: assert(addr != NULL);
! 120: return inet_ntoa(addr->sin4.sin_addr);
! 121: }
! 122:
! 123: static inline bool
! 124: ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *d)
! 125: {
! 126: assert(addr != NULL);
! 127: assert(d != NULL);
! 128: strlcpy(d, inet_ntoa(addr->sin4.sin_addr), NG_INET_ADDRSTRLEN);
! 129: return true;
! 130: }
! 131: #endif
! 132: #endif
! 133:
! 134: /* -eof- */
CVSweb