]>
git.saurik.com Git - apt.git/blob - methods/rfc2553emu.h
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: rfc2553emu.h,v 1.4 2000/06/18 06:04:45 jgg Exp $
4 /* ######################################################################
6 RFC 2553 Emulation - Provides emulation for RFC 2553 getaddrinfo,
7 freeaddrinfo and getnameinfo
9 These functions are necessary to write portable protocol independent
10 networking. They transparently support IPv4, IPv6 and probably many
11 other protocols too. This implementation is needed when the host does
12 not support these standards. It implements a simple wrapper that
13 basically supports only IPv4.
15 Perfect emulation is not provided, but it is passable..
17 Originally written by Jason Gunthorpe <jgg@debian.org> and placed into
18 the Public Domain, do with it what you will.
20 ##################################################################### */
26 #include <sys/types.h>
27 #include <sys/socket.h>
29 // Autosense getaddrinfo
30 #if defined(AI_PASSIVE) && defined(EAI_NONAME)
31 #define HAVE_GETADDRINFO
34 // Autosense getnameinfo
35 #if defined(NI_NUMERICHOST)
36 #define HAVE_GETNAMEINFO
39 // getaddrinfo support?
40 #ifndef HAVE_GETADDRINFO
41 // Renamed to advoid type clashing.. (for debugging)
44 int ai_flags
; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
45 int ai_family
; /* PF_xxx */
46 int ai_socktype
; /* SOCK_xxx */
47 int ai_protocol
; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
48 size_t ai_addrlen
; /* length of ai_addr */
49 char *ai_canonname
; /* canonical name for nodename */
50 struct sockaddr
*ai_addr
; /* binary address */
51 struct addrinfo_emu
*ai_next
; /* next structure in linked list */
53 #define addrinfo addrinfo_emu
55 int getaddrinfo(const char *nodename
, const char *servname
,
56 const struct addrinfo
*hints
,
57 struct addrinfo
**res
);
58 void freeaddrinfo(struct addrinfo
*ai
);
61 #define AI_PASSIVE (1<<1)
70 #define EAI_SOCKTYPE -6
71 #define EAI_SERVICE -7
72 #define EAI_ADDRFAMILY -8
73 #define EAI_SYSTEM -10
74 #define EAI_MEMORY -11
77 /* If we don't have getaddrinfo then we probably don't have
78 sockaddr_storage either (same RFC) so we definitely will not be
79 doing any IPv6 stuff. Do not use the members of this structure to
80 retain portability, cast to a sockaddr. */
81 #define sockaddr_storage sockaddr_in
84 // getnameinfo support (glibc2.0 has getaddrinfo only)
85 #ifndef HAVE_GETNAMEINFO
87 int getnameinfo(const struct sockaddr
*sa
, socklen_t salen
,
88 char *host
, size_t hostlen
,
89 char *serv
, size_t servlen
,
93 #define NI_MAXHOST 1025
97 #ifndef NI_NUMERICHOST
98 #define NI_NUMERICHOST (1<<0)
99 #define NI_NUMERICSERV (1<<1)
100 // #define NI_NOFQDN (1<<2)
101 #define NI_NAMEREQD (1<<3)
102 #define NI_DATAGRAM (1<<4)
105 #define sockaddr_storage sockaddr_in
108 // Glibc 2.0.7 misses this one
109 #ifndef AI_NUMERICHOST
110 #define AI_NUMERICHOST 0