2011-02-12 05:22:29 +00:00
|
|
|
#ifndef _NETDB_H
|
|
|
|
#define _NETDB_H
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2012-09-08 03:13:55 +00:00
|
|
|
#include <features.h>
|
refactor headers, especially alltypes.h, and improve C++ ABI compat
the arch-specific bits/alltypes.h.sh has been replaced with a generic
alltypes.h.in and minimal arch-specific bits/alltypes.h.in.
this commit is intended to have no functional changes except:
- exposing additional symbols that POSIX allows but does not require
- changing the C++ name mangling for some types
- fixing the signedness of blksize_t on powerpc (POSIX requires signed)
- fixing the limit macros for sig_atomic_t on x86_64
- making dev_t an unsigned type (ABI matching goal, and more logical)
in addition, some types that were wrongly defined with long on 32-bit
archs were changed to int, and vice versa; this change is
non-functional except for the possibility of making pointer types
mismatch, and only affects programs that were using them incorrectly,
and only at build-time, not runtime.
the following changes were made in the interest of moving
non-arch-specific types out of the alltypes system and into the
headers they're associated with, and also will tend to improve
application compatibility:
- netdb.h now includes netinet/in.h (for socklen_t and uint32_t)
- netinet/in.h now includes sys/socket.h and inttypes.h
- sys/resource.h now includes sys/time.h (for struct timeval)
- sys/wait.h now includes signal.h (for siginfo_t)
- langinfo.h now includes nl_types.h (for nl_item)
for the types in stdint.h:
- types which are of no interest to other headers were moved out of
the alltypes system.
- fast types for 8- and 64-bit are hard-coded (at least for now); only
the 16- and 32-bit ones have reason to vary by arch.
and the following types have been changed for C++ ABI purposes;
- mbstate_t now has a struct tag, __mbstate_t
- FILE's struct tag has been changed to _IO_FILE
- DIR's struct tag has been changed to __dirstream
- locale_t's struct tag has been changed to __locale_struct
- pthread_t is defined as unsigned long in C++ mode only
- fpos_t now has a struct tag, _G_fpos64_t
- fsid_t's struct tag has been changed to __fsid_t
- idtype_t has been made an enum type (also required by POSIX)
- nl_catd has been changed from long to void *
- siginfo_t's struct tag has been removed
- sigset_t's has been given a struct tag, __sigset_t
- stack_t has been given a struct tag, sigaltstack
- suseconds_t has been changed to long on 32-bit archs
- [u]intptr_t have been changed from long to int rank on 32-bit archs
- dev_t has been made unsigned
summary of tests that have been performed against these changes:
- nsz's libc-test (diff -u before and after)
- C++ ABI check symbol dump (diff -u before, after, glibc)
- grepped for __NEED, made sure types needed are still in alltypes
- built gcc 3.4.6
2013-07-22 15:22:36 +00:00
|
|
|
#include <netinet/in.h>
|
2012-09-07 02:44:55 +00:00
|
|
|
|
2012-05-23 01:52:08 +00:00
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
2011-02-12 05:22:29 +00:00
|
|
|
#define __NEED_size_t
|
|
|
|
#include <bits/alltypes.h>
|
refactor headers, especially alltypes.h, and improve C++ ABI compat
the arch-specific bits/alltypes.h.sh has been replaced with a generic
alltypes.h.in and minimal arch-specific bits/alltypes.h.in.
this commit is intended to have no functional changes except:
- exposing additional symbols that POSIX allows but does not require
- changing the C++ name mangling for some types
- fixing the signedness of blksize_t on powerpc (POSIX requires signed)
- fixing the limit macros for sig_atomic_t on x86_64
- making dev_t an unsigned type (ABI matching goal, and more logical)
in addition, some types that were wrongly defined with long on 32-bit
archs were changed to int, and vice versa; this change is
non-functional except for the possibility of making pointer types
mismatch, and only affects programs that were using them incorrectly,
and only at build-time, not runtime.
the following changes were made in the interest of moving
non-arch-specific types out of the alltypes system and into the
headers they're associated with, and also will tend to improve
application compatibility:
- netdb.h now includes netinet/in.h (for socklen_t and uint32_t)
- netinet/in.h now includes sys/socket.h and inttypes.h
- sys/resource.h now includes sys/time.h (for struct timeval)
- sys/wait.h now includes signal.h (for siginfo_t)
- langinfo.h now includes nl_types.h (for nl_item)
for the types in stdint.h:
- types which are of no interest to other headers were moved out of
the alltypes system.
- fast types for 8- and 64-bit are hard-coded (at least for now); only
the 16- and 32-bit ones have reason to vary by arch.
and the following types have been changed for C++ ABI purposes;
- mbstate_t now has a struct tag, __mbstate_t
- FILE's struct tag has been changed to _IO_FILE
- DIR's struct tag has been changed to __dirstream
- locale_t's struct tag has been changed to __locale_struct
- pthread_t is defined as unsigned long in C++ mode only
- fpos_t now has a struct tag, _G_fpos64_t
- fsid_t's struct tag has been changed to __fsid_t
- idtype_t has been made an enum type (also required by POSIX)
- nl_catd has been changed from long to void *
- siginfo_t's struct tag has been removed
- sigset_t's has been given a struct tag, __sigset_t
- stack_t has been given a struct tag, sigaltstack
- suseconds_t has been changed to long on 32-bit archs
- [u]intptr_t have been changed from long to int rank on 32-bit archs
- dev_t has been made unsigned
summary of tests that have been performed against these changes:
- nsz's libc-test (diff -u before and after)
- C++ ABI check symbol dump (diff -u before, after, glibc)
- grepped for __NEED, made sure types needed are still in alltypes
- built gcc 3.4.6
2013-07-22 15:22:36 +00:00
|
|
|
#endif
|
2011-02-12 05:22:29 +00:00
|
|
|
|
2016-07-03 18:40:11 +00:00
|
|
|
struct addrinfo {
|
2011-02-12 05:22:29 +00:00
|
|
|
int ai_flags;
|
|
|
|
int ai_family;
|
|
|
|
int ai_socktype;
|
|
|
|
int ai_protocol;
|
|
|
|
socklen_t ai_addrlen;
|
|
|
|
struct sockaddr *ai_addr;
|
|
|
|
char *ai_canonname;
|
|
|
|
struct addrinfo *ai_next;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define AI_PASSIVE 0x01
|
|
|
|
#define AI_CANONNAME 0x02
|
|
|
|
#define AI_NUMERICHOST 0x04
|
|
|
|
#define AI_V4MAPPED 0x08
|
|
|
|
#define AI_ALL 0x10
|
|
|
|
#define AI_ADDRCONFIG 0x20
|
|
|
|
#define AI_NUMERICSERV 0x400
|
|
|
|
|
|
|
|
|
|
|
|
#define NI_NUMERICHOST 0x01
|
|
|
|
#define NI_NUMERICSERV 0x02
|
|
|
|
#define NI_NOFQDN 0x04
|
|
|
|
#define NI_NAMEREQD 0x08
|
|
|
|
#define NI_DGRAM 0x10
|
2014-06-04 06:24:38 +00:00
|
|
|
#define NI_NUMERICSCOPE 0x100
|
2011-02-12 05:22:29 +00:00
|
|
|
|
|
|
|
#define EAI_BADFLAGS -1
|
|
|
|
#define EAI_NONAME -2
|
|
|
|
#define EAI_AGAIN -3
|
|
|
|
#define EAI_FAIL -4
|
getaddrinfo: add EAI_NODATA error code to distinguish NODATA vs NxDomain
this was apparently omitted long ago out of a lack of understanding of
its importance and the fact that POSIX doesn't specify it. despite not
being officially standardized, however, it turns out that at least
AIX, glibc, NetBSD, OpenBSD, QNX, and Solaris document and support it.
in certain usage cases, such as implementing a DNS gateway on top of
the stub resolver interfaces, it's necessary to distinguish the case
where a name does not exit (NxDomain) from one where it exists but has
no addresses (or other records) of the requested type (NODATA). in
fact, even the legacy gethostbyname API had this distinction, which we
were previously unable to support correctly because the backend lacked
it.
apart from fixing an important functionality gap, adding this
distinction helps clarify to users how search domain fallback works
(falling back in cases corresponding to EAI_NONAME, not in ones
corresponding to EAI_NODATA), a topic that has been a source of
ongoing confusion and frustration.
as a result of this change, EAI_NONAME is no longer a valid universal
error code for getaddrinfo in the case where AI_ADDRCONFIG has
suppressed use of all address families. in order to return an accurate
result in this case, getaddrinfo is modified to still perform at least
one lookup. this will almost surely fail (with a network error, since
there is no v4 or v6 network to query DNS over) unless a result comes
from the hosts file or from ip literal parsing, but in case it does
succeed, the result is replaced by EAI_NODATA.
glibc has a related error code, EAI_ADDRFAMILY, that could be used for
the AI_ADDRCONFIG case and certain NODATA cases, but distinguishing
them properly in full generality seems to require additional DNS
queries that are otherwise not useful. on glibc, it is only used for
ip literals with mismatching family, not for DNS or hosts file results
where the name has addresses only in the opposite family. since this
seems misleading and inconsistent, and since EAI_NODATA already covers
the semantic case where the "name" exists but doesn't have any
addresses in the requested family, we do not adopt EAI_ADDRFAMILY at
this time. this could be changed at some point if desired, but the
logic for getting all the corner cases with AI_ADDRCONFIG right is
slightly nontrivial.
2022-09-20 00:10:10 +00:00
|
|
|
#define EAI_NODATA -5
|
2011-02-12 05:22:29 +00:00
|
|
|
#define EAI_FAMILY -6
|
|
|
|
#define EAI_SOCKTYPE -7
|
|
|
|
#define EAI_SERVICE -8
|
|
|
|
#define EAI_MEMORY -10
|
|
|
|
#define EAI_SYSTEM -11
|
|
|
|
#define EAI_OVERFLOW -12
|
|
|
|
|
2012-09-07 02:44:55 +00:00
|
|
|
int getaddrinfo (const char *__restrict, const char *__restrict, const struct addrinfo *__restrict, struct addrinfo **__restrict);
|
2011-02-12 05:22:29 +00:00
|
|
|
void freeaddrinfo (struct addrinfo *);
|
2012-09-07 02:44:55 +00:00
|
|
|
int getnameinfo (const struct sockaddr *__restrict, socklen_t, char *__restrict, socklen_t, char *__restrict, socklen_t, int);
|
2011-02-12 05:22:29 +00:00
|
|
|
const char *gai_strerror(int);
|
|
|
|
|
|
|
|
|
|
|
|
/* Legacy functions follow (marked OBsolete in SUS) */
|
|
|
|
|
2016-07-03 18:40:11 +00:00
|
|
|
struct netent {
|
2011-02-12 05:22:29 +00:00
|
|
|
char *n_name;
|
|
|
|
char **n_aliases;
|
|
|
|
int n_addrtype;
|
|
|
|
uint32_t n_net;
|
|
|
|
};
|
|
|
|
|
2016-07-03 18:40:11 +00:00
|
|
|
struct hostent {
|
2011-02-12 05:22:29 +00:00
|
|
|
char *h_name;
|
|
|
|
char **h_aliases;
|
|
|
|
int h_addrtype;
|
|
|
|
int h_length;
|
|
|
|
char **h_addr_list;
|
|
|
|
};
|
|
|
|
#define h_addr h_addr_list[0]
|
|
|
|
|
2016-07-03 18:40:11 +00:00
|
|
|
struct servent {
|
2011-02-12 05:22:29 +00:00
|
|
|
char *s_name;
|
|
|
|
char **s_aliases;
|
|
|
|
int s_port;
|
|
|
|
char *s_proto;
|
|
|
|
};
|
|
|
|
|
2016-07-03 18:40:11 +00:00
|
|
|
struct protoent {
|
2011-02-12 05:22:29 +00:00
|
|
|
char *p_name;
|
|
|
|
char **p_aliases;
|
|
|
|
int p_proto;
|
|
|
|
};
|
|
|
|
|
|
|
|
void sethostent (int);
|
|
|
|
void endhostent (void);
|
|
|
|
struct hostent *gethostent (void);
|
|
|
|
|
|
|
|
void setnetent (int);
|
|
|
|
void endnetent (void);
|
|
|
|
struct netent *getnetent (void);
|
|
|
|
struct netent *getnetbyaddr (uint32_t, int);
|
|
|
|
struct netent *getnetbyname (const char *);
|
|
|
|
|
|
|
|
void setservent (int);
|
|
|
|
void endservent (void);
|
|
|
|
struct servent *getservent (void);
|
|
|
|
struct servent *getservbyname (const char *, const char *);
|
|
|
|
struct servent *getservbyport (int, const char *);
|
|
|
|
|
|
|
|
void setprotoent (int);
|
|
|
|
void endprotoent (void);
|
|
|
|
struct protoent *getprotoent (void);
|
|
|
|
struct protoent *getprotobyname (const char *);
|
|
|
|
struct protoent *getprotobynumber (int);
|
|
|
|
|
2012-08-15 19:35:32 +00:00
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \
|
2012-11-01 07:49:43 +00:00
|
|
|
|| (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \
|
|
|
|
|| (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
|
2012-08-15 19:35:32 +00:00
|
|
|
struct hostent *gethostbyname (const char *);
|
|
|
|
struct hostent *gethostbyaddr (const void *, socklen_t, int);
|
2018-10-16 17:48:10 +00:00
|
|
|
#ifdef __GNUC__
|
|
|
|
__attribute__((const))
|
|
|
|
#endif
|
2012-08-15 19:35:32 +00:00
|
|
|
int *__h_errno_location(void);
|
|
|
|
#define h_errno (*__h_errno_location())
|
|
|
|
#define HOST_NOT_FOUND 1
|
|
|
|
#define TRY_AGAIN 2
|
|
|
|
#define NO_RECOVERY 3
|
|
|
|
#define NO_DATA 4
|
2014-01-13 11:36:03 +00:00
|
|
|
#define NO_ADDRESS NO_DATA
|
2012-08-15 19:35:32 +00:00
|
|
|
#endif
|
|
|
|
|
2012-05-23 01:52:08 +00:00
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
2013-12-20 16:56:16 +00:00
|
|
|
void herror(const char *);
|
2011-02-12 05:22:29 +00:00
|
|
|
const char *hstrerror(int);
|
|
|
|
int gethostbyname_r(const char *, struct hostent *, char *, size_t, struct hostent **, int *);
|
|
|
|
int gethostbyname2_r(const char *, int, struct hostent *, char *, size_t, struct hostent **, int *);
|
|
|
|
struct hostent *gethostbyname2(const char *, int);
|
|
|
|
int gethostbyaddr_r(const void *, socklen_t, int, struct hostent *, char *, size_t, struct hostent **, int *);
|
|
|
|
int getservbyport_r(int, const char *, struct servent *, char *, size_t, struct servent **);
|
|
|
|
int getservbyname_r(const char *, const char *, struct servent *, char *, size_t, struct servent **);
|
2012-05-13 03:31:52 +00:00
|
|
|
#define EAI_NODATA -5
|
|
|
|
#define EAI_ADDRFAMILY -9
|
|
|
|
#define EAI_INPROGRESS -100
|
|
|
|
#define EAI_CANCELED -101
|
|
|
|
#define EAI_NOTCANCELED -102
|
|
|
|
#define EAI_ALLDONE -103
|
|
|
|
#define EAI_INTR -104
|
|
|
|
#define EAI_IDN_ENCODE -105
|
2012-05-13 03:34:39 +00:00
|
|
|
#define NI_MAXHOST 255
|
|
|
|
#define NI_MAXSERV 32
|
2011-02-12 05:22:29 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|