2 * D header file for POSIX.
4 * Copyright: Copyright David Nadlinger 2011.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: David Nadlinger, Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
10 /* Copyright David Nadlinger 2011.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
15 module core.sys.posix.netdb;
17 private import core.sys.posix.config;
18 public import core.stdc.inttypes; // for uint32_t
19 public import core.sys.posix.netinet.in_; // for in_port_t, in_addr_t
20 public import core.sys.posix.sys.types; // for ino_t
21 public import core.sys.posix.sys.socket; // for socklen_t
29 else version (WatchOS)
125 void freeaddrinfo(addrinfo*);
126 const(char)* gai_strerror(int);
127 int getaddrinfo(const(char)*, const(char)*, const(addrinfo)*, addrinfo**);
128 hostent* gethostbyaddr(const(void)*, socklen_t, int);
129 hostent* gethostbyname(const(char)*);
130 hostent* gethostent();
131 int getnameinfo(const(sockaddr)*, socklen_t, char*, socklen_t, char*, socklen_t, int);
132 netent* getnetbyaddr(uint32_t, int);
133 netent* getnetbyname(const(char)*);
135 protoent* getprotobyname(const(char)*);
136 protoent* getprotobynumber(int);
137 protoent* getprotoent();
138 servent* getservbyname(const(char)*, const(char)*);
139 servent* getservbyport(int, const(char)*);
140 servent* getservent();
141 void sethostent(int);
143 void setprotoent(int);
144 void setservent(int);
147 version (CRuntime_Glibc)
156 char* h_addr() @property { return h_addr_list[0]; } // non-standard
182 enum IPPORT_RESERVED = 1024;
186 enum HOST_NOT_FOUND = 1;
188 enum NO_RECOVERY = 3;
197 socklen_t ai_addrlen;
203 enum AI_PASSIVE = 0x1;
204 enum AI_CANONNAME = 0x2;
205 enum AI_NUMERICHOST = 0x4;
206 enum AI_NUMERICSERV = 0x400;
207 enum AI_V4MAPPED = 0x8;
209 enum AI_ADDRCONFIG = 0x20;
212 enum NI_NUMERICHOST = 1;
213 enum NI_NAMEREQD = 8;
214 enum NI_NUMERICSERV = 2;
215 //enum NI_NUMERICSCOPE = ?;
217 enum NI_MAXHOST = 1025; // non-standard
218 enum NI_MAXSERV = 32; // non-standard
221 enum EAI_BADFLAGS = -1;
223 enum EAI_FAMILY = -6;
224 enum EAI_MEMORY = -10;
225 enum EAI_NONAME = -2;
226 enum EAI_SERVICE = -8;
227 enum EAI_SOCKTYPE = -7;
228 enum EAI_SYSTEM = -11;
229 enum EAI_OVERFLOW = -12;
231 else version (Darwin)
240 char* h_addr() @property { return h_addr_list[0]; } // non-standard
266 enum IPPORT_RESERVED = 1024;
270 enum HOST_NOT_FOUND = 1;
272 enum NO_RECOVERY = 3;
281 socklen_t ai_addrlen;
287 enum AI_PASSIVE = 0x1;
288 enum AI_CANONNAME = 0x2;
289 enum AI_NUMERICHOST = 0x4;
290 enum AI_NUMERICSERV = 0x1000;
291 enum AI_V4MAPPED = 0x800;
293 enum AI_ADDRCONFIG = 0x400;
295 enum NI_NOFQDN = 0x1;
296 enum NI_NUMERICHOST = 0x2;
297 enum NI_NAMEREQD = 0x4;
298 enum NI_NUMERICSERV = 0x8;
299 //enum NI_NUMERICSCOPE = ?;
300 enum NI_DGRAM = 0x10;
301 enum NI_MAXHOST = 1025; // non-standard
302 enum NI_MAXSERV = 32; // non-standard
305 enum EAI_BADFLAGS = 3;
310 enum EAI_SERVICE = 9;
311 enum EAI_SOCKTYPE = 10;
312 enum EAI_SYSTEM = 11;
313 enum EAI_OVERFLOW = 14;
315 else version (FreeBSD)
324 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
350 enum IPPORT_RESERVED = 1024;
354 enum HOST_NOT_FOUND = 1;
356 enum NO_RECOVERY = 3;
365 socklen_t ai_addrlen;
371 enum AI_PASSIVE = 0x1;
372 enum AI_CANONNAME = 0x2;
373 enum AI_NUMERICHOST = 0x4;
374 enum AI_NUMERICSERV = 0x8;
375 enum AI_V4MAPPED = 0x800;
377 enum AI_ADDRCONFIG = 0x400;
379 enum NI_NOFQDN = 0x1;
380 enum NI_NUMERICHOST = 0x2;
381 enum NI_NAMEREQD = 0x4;
382 enum NI_NUMERICSERV = 0x8;
383 //enum NI_NUMERICSCOPE = ?;
384 enum NI_DGRAM = 0x10;
385 enum NI_MAXHOST = 1025; // non-standard
386 enum NI_MAXSERV = 32; // non-standard
389 enum EAI_BADFLAGS = 3;
394 enum EAI_SERVICE = 9;
395 enum EAI_SOCKTYPE = 10;
396 enum EAI_SYSTEM = 11;
397 enum EAI_OVERFLOW = 14;
399 else version (NetBSD)
408 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
418 #if (defined(__sparc__) && defined(_LP64)) || \
419 (defined(__sh__) && defined(_LP64) && (_BYTE_ORDER == _BIG_ENDIAN))
420 int __n_pad0; /* ABI compatibility */
422 uint32_t n_net; /*%< network # */
423 #if defined(__alpha__) || (defined(__i386__) && defined(_LP64)) || \
424 (defined(__sh__) && defined(_LP64) && (_BYTE_ORDER == _LITTLE_ENDIAN))
425 int __n_pad0; /* ABI compatibility */
446 enum IPPORT_RESERVED = 1024;
450 enum HOST_NOT_FOUND = 1;
452 enum NO_RECOVERY = 3;
462 #if defined(__sparc__) && defined(_LP64)
463 int __ai_pad0; /* ABI compatibility */
466 socklen_t ai_addrlen;
468 #if defined(__alpha__) || (defined(__i386__) && defined(_LP64))
469 int __ai_pad0; /* ABI compatibility */
477 enum AI_PASSIVE = 0x1;
478 enum AI_CANONNAME = 0x2;
479 enum AI_NUMERICHOST = 0x4;
480 enum AI_NUMERICSERV = 0x8;
481 enum AI_V4MAPPED = 0x800;
483 enum AI_ADDRCONFIG = 0x400;
485 enum NI_NOFQDN = 0x1;
486 enum NI_NUMERICHOST = 0x2;
487 enum NI_NAMEREQD = 0x4;
488 enum NI_NUMERICSERV = 0x8;
489 enum NI_DGRAM = 0x10;
490 enum NI_WITHSCOPEID = 0x00000020;
491 enum NI_NUMERICSCOPE = 0x00000040;
492 enum NI_MAXHOST = 1025; // non-standard
493 enum NI_MAXSERV = 32; // non-standard
496 enum EAI_BADFLAGS = 3;
501 enum EAI_SERVICE = 9;
502 enum EAI_SOCKTYPE = 10;
503 enum EAI_SYSTEM = 11;
504 enum EAI_OVERFLOW = 14;
506 else version (OpenBSD)
515 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
541 enum IPPORT_RESERVED = 1024;
545 enum NETDB_INTERNAL = -1;
546 enum NETDB_SUCCESS = 0;
547 enum HOST_NOT_FOUND = 1;
549 enum NO_RECOVERY = 3;
558 socklen_t ai_addrlen;
564 enum AI_PASSIVE = 0x1;
565 enum AI_CANONNAME = 0x2;
566 enum AI_NUMERICHOST = 0x4;
568 enum AI_NUMERICSERV = 0x10;
570 enum AI_ADDRCONFIG = 0x40;
571 enum AI_MASK = AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_FQDN | AI_ADDRCONFIG;
573 enum NI_NUMERICHOST = 1;
574 enum NI_NUMERICSERV = 2;
576 enum NI_NAMEREQD = 8;
578 //enum NI_NUMERICSCOPE = 32;
579 enum NI_MAXHOST = 256; // non-standard
580 enum NI_MAXSERV = 32; // non-standard
582 enum EAI_NONAME = -1;
583 enum EAI_BADFLAGS = -2;
586 enum EAI_NODATA = -5;
587 enum EAI_FAMILY = -6;
588 enum EAI_SOCKTYPE = -7;
589 enum EAI_SERVICE = -8;
590 enum EAI_ADDRFAMILY = -9;
591 enum EAI_MEMORY = -10;
592 enum EAI_SYSTEM = -11;
593 enum EAI_BADHINTS = -12;
594 enum EAI_PROTOCOL = -13;
595 enum EAI_OVERFLOW = -14;
597 else version (DragonFlyBSD)
600 * Error return codes from gethostbyname() and gethostbyaddr()
610 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
640 int ai_socktype = SOCK_STREAM; /* socktype default value required to be able to perform getAddrInfo on DragonFlyBSD
641 * without socktype set, you get 'servname not supported for ai_socktype'
644 socklen_t ai_addrlen;
650 enum IPPORT_RESERVED = 1024;
652 enum NETDB_INTERNAL = -1;
653 enum NETDB_SUCCESS = 0;
654 enum HOST_NOT_FOUND = 1;
656 enum NO_RECOVERY = 3;
658 enum NO_ADDRESS = NO_DATA;
660 //enum EAI_ADDRFAMILY = 1; // deprecated
662 enum EAI_BADFLAGS = 3;
666 //enum EAI_NODATA = 7; // deprecated
668 enum EAI_SERVICE = 9;
669 enum EAI_SOCKTYPE = 10;
670 enum EAI_SYSTEM = 11;
671 enum EAI_BADHINTS = 12;
672 enum EAI_PROTOCOL = 13;
673 enum EAI_OVERFLOW = 14;
675 enum AI_PASSIVE = 0x001;
676 enum AI_CANONNAME = 0x002;
677 enum AI_NUMERICHOST = 0x004;
678 enum AI_NUMERICSERV = 0x008;
679 enum AI_MASK = (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_ADDRCONFIG); // valid flags for addrinfo (not a standard def, apps should not use it)
681 enum AI_V4MAPPED_CFG = 0x200;
682 enum AI_ADDRCONFIG = 0x400;
683 enum AI_V4MAPPED = 0x800;
684 enum AI_DEFAULT = (AI_V4MAPPED_CFG | AI_ADDRCONFIG);
686 enum NI_MAXHOST = 1025; // non-standard
687 enum NI_MAXSERV = 32; // non-standard
689 enum NI_NOFQDN = 0x01;
690 enum NI_NUMERICHOST = 0x02;
691 enum NI_NAMEREQD = 0x04;
692 enum NI_NUMERICSERV = 0x08;
693 enum NI_DGRAM = 0x10;
694 //enum NI_WITHSCOPEID = 0x20; // deprecated
695 enum NI_NUMERICSCOPE = 0x40;
698 else version (Solaris)
708 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
734 enum HOST_NOT_FOUND = 1;
736 enum NO_RECOVERY = 3;
748 else version (SPARC64)
751 socklen_t ai_addrlen;
757 enum AI_PASSIVE = 0x0008;
758 enum AI_CANONNAME = 0x0010;
759 enum AI_NUMERICHOST = 0x0020;
760 enum AI_NUMERICSERV = 0x0040;
761 enum AI_V4MAPPED = 0x0001;
762 enum AI_ALL = 0x0002;
763 enum AI_ADDRCONFIG = 0x0004;
765 enum NI_NOFQDN = 0x0001;
766 enum NI_NUMERICHOST = 0x0002;
767 enum NI_NAMEREQD = 0x0004;
768 enum NI_NUMERICSERV = 0x0008;
769 enum NI_DGRAM = 0x0010;
770 enum NI_WITHSCOPEID = 0x0020;
771 enum NI_NUMERICSCOPE = 0x0040;
772 enum NI_MAXHOST = 1025;
773 enum NI_MAXSERV = 32;
776 enum EAI_BADFLAGS = 3;
781 enum EAI_SERVICE = 9;
782 enum EAI_SOCKTYPE = 10;
783 enum EAI_SYSTEM = 11;
784 enum EAI_OVERFLOW = 14;
785 enum EAI_PROTOCOL = 13;
788 else version (CRuntime_Bionic)
797 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
823 enum IPPORT_RESERVED = 1024;
825 enum HOST_NOT_FOUND = 1;
827 enum NO_RECOVERY = 3;
836 socklen_t ai_addrlen;
842 enum AI_PASSIVE = 0x1;
843 enum AI_CANONNAME = 0x2;
844 enum AI_NUMERICHOST = 0x4;
845 enum AI_NUMERICSERV = 0x8;
846 enum AI_V4MAPPED = 0x800;
848 enum AI_ADDRCONFIG = 0x400;
850 enum NI_NOFQDN = 0x1;
851 enum NI_NUMERICHOST = 0x2;
852 enum NI_NAMEREQD = 0x4;
853 enum NI_NUMERICSERV = 0x8;
854 enum NI_DGRAM = 0x10;
855 enum NI_MAXHOST = 1025; // non-standard
856 enum NI_MAXSERV = 32; // non-standard
859 enum EAI_BADFLAGS = 3;
864 enum EAI_SERVICE = 9;
865 enum EAI_SOCKTYPE = 10;
866 enum EAI_SYSTEM = 11;
867 enum EAI_OVERFLOW = 14;
869 else version (CRuntime_Musl)
878 char* h_addr() @property { return h_addr_list[0]; } // non-standard
910 socklen_t ai_addrlen;
919 AI_NUMERICHOST = 0x4,
920 AI_NUMERICSERV = 0x400,
923 AI_ADDRCONFIG = 0x20,
947 else version (CRuntime_UClibc)
956 extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
982 enum IPPORT_RESERVED = 1024;
984 enum HOST_NOT_FOUND = 1;
986 enum NO_RECOVERY = 3;
995 socklen_t ai_addrlen;
1001 enum AI_PASSIVE = 0x1;
1002 enum AI_CANONNAME = 0x2;
1003 enum AI_NUMERICHOST = 0x4;
1004 enum AI_NUMERICSERV = 0x400;
1005 enum AI_V4MAPPED = 0x8;
1007 enum AI_ADDRCONFIG = 0x20;
1010 enum NI_NUMERICHOST = 1;
1011 enum NI_NAMEREQD = 8;
1012 enum NI_NUMERICSERV = 2;
1014 enum NI_MAXHOST = 1025; // non-standard
1015 enum NI_MAXSERV = 32; // non-standard
1017 enum EAI_AGAIN = -3;
1018 enum EAI_BADFLAGS = -1;
1020 enum EAI_FAMILY = -6;
1021 enum EAI_MEMORY = -10;
1022 enum EAI_NONAME = -2;
1023 enum EAI_SERVICE = -8;
1024 enum EAI_SOCKTYPE = -7;
1025 enum EAI_SYSTEM = -11;
1026 enum EAI_OVERFLOW = -12;
1028 enum EAI_NODATA = -5;
1029 enum EAI_ADDRFAMILY = -9;
1030 enum EAI_INPROGRESS = -100;
1031 enum EAI_CANCELED = -101;
1032 enum EAI_NOTCANCELED = -102;
1033 enum EAI_ALLDONE = -103;
1034 enum EAI_INTR = -104;
1035 enum EAI_IDN_ENCODE = -105;
1039 static assert(false, "Unsupported platform");
1046 void freeaddrinfo(addrinfo*);
1047 const(char)* gai_strerror(int);
1048 int getaddrinfo(const(char)*, const(char)*, const(addrinfo)*, addrinfo**);
1049 hostent* gethostbyaddr(const(void)*, socklen_t, int);
1050 hostent* gethostbyname(const(char)*);
1051 hostent* gethostent();
1052 int getnameinfo(const(sockaddr)*, socklen_t, char*, socklen_t, char*, socklen_t, int);
1053 netent* getnetbyaddr(uint32_t, int);
1054 netent* getnetbyname(const(char)*);
1055 netent* getnetent();
1056 protoent* getprotobyname(const(char)*);
1057 protoent* getprotobynumber(int);
1058 protoent* getprotoent();
1059 servent* getservbyname(const(char)*, const(char)*);
1060 servent* getservbyport(int, const(char)*);
1061 servent* getservent();
1062 void sethostent(int);
1063 void setnetent(int);
1064 void setprotoent(int);
1065 void setservent(int);