23#ifdef HAVE_SYS_SOCKET_H
24#include <sys/socket.h>
32#include <netinet/in.h>
33#ifdef HAVE_ARPA_INET_H
41#ifdef HAVE_ARPA_NAMESER_H
43# define BIND_8_COMPAT 1
45#include <arpa/nameser.h>
50extern void __res_ndestroy(res_state statp);
51#define res_ndestroy __res_ndestroy
60#define MAXHOSTNAMELEN 255
66#define HOST_NAME_MAX 255
106#define DNS_T_NAPTR 35
123#ifdef HAVE_GETHOSTNAME
156 hostname = php_gethostbyaddr(
addr);
158 if (hostname ==
NULL) {
175 struct sockaddr_in sa4;
176 struct sockaddr_in6 sa6;
177 char out[NI_MAXHOST];
178 memset(&sa4, 0,
sizeof(
struct sockaddr_in));
179 memset(&sa6, 0,
sizeof(
struct sockaddr_in6));
184 if (getnameinfo((
struct sockaddr *)&sa6,
sizeof(sa6),
out,
sizeof(
out),
NULL, 0, NI_NAMEREQD) != 0) {
185 return zend_string_init(ip,
strlen(ip), 0);
191 if (getnameinfo((
struct sockaddr *)&sa4,
sizeof(sa4),
out,
sizeof(
out),
NULL, 0, NI_NAMEREQD) != 0) {
192 return zend_string_init(ip,
strlen(ip), 0);
201 addr.s_addr = inet_addr(ip);
203 if (
addr.s_addr == -1) {
209 if (!hp || hp->h_name ==
NULL || hp->h_name[0] ==
'\0') {
210 return zend_string_init(ip,
strlen(ip), 0);
213 return zend_string_init(hp->h_name,
strlen(hp->h_name), 0);
235 if (!(ipaddr = php_gethostbyname(hostname))) {
252 char addr4[INET_ADDRSTRLEN];
274 struct in_addr *h_addr_entry;
275 memcpy(&h_addr_entry, &hp->h_addr_list[i],
sizeof(
struct in_addr *));
296 struct in_addr *h_addr_0;
298 char addr4[INET_ADDRSTRLEN];
307 memcpy(&h_addr_0, &hp->h_addr_list[0],
sizeof(
struct in_addr *));
312 memcpy(&in.s_addr, h_addr_0,
sizeof(in.s_addr));
318 return zend_string_init(address,
strlen(address), 0);
323#if !defined(PHP_WIN32) && defined(HAVE_DNS_SEARCH_FUNC)
334#define MAXHOSTNAMELEN 1024
336#ifndef MAXRESOURCERECORDS
337#define MAXRESOURCERECORDS 64
351#if defined(__GLIBC__) && !defined(HAVE_DEPRECATED_DNS_FUNCS)
352#define php_dns_free_res(__res__) _php_dns_free_res(__res__)
353static void _php_dns_free_res(
struct __res_state *
res) {
355 for (ns = 0; ns < MAXNS; ns++) {
356 if (
res->_u._ext.nsaddrs[ns] !=
NULL) {
357 free (
res->_u._ext.nsaddrs[ns]);
358 res->_u._ext.nsaddrs[ns] =
NULL;
363#define php_dns_free_res(__res__)
370 querybuf answer = {0};
375#if defined(HAVE_DNS_SEARCH)
376 struct sockaddr_storage from;
377 uint32_t fromsize =
sizeof(from);
379#elif defined(HAVE_RES_NSEARCH)
380 struct __res_state
state;
415#if defined(HAVE_DNS_SEARCH)
420#elif defined(HAVE_RES_NSEARCH)
429 i = php_dns_search(
handle, hostname, C_IN,
type, answer.qb2,
sizeof answer);
430 php_dns_free_handle(
handle);
435 hp = (HEADER *)&answer;
440#ifdef HAVE_FULL_DNS_FUNCS
442#define CHECKCP(n) do { \
443 if (cp + n > end) { \
449static uint8_t *php_parserr(uint8_t *
cp, uint8_t *
end, querybuf *answer,
int type_to_fetch,
int store,
bool raw,
zval *subarray)
451 u_short
type,
class, dlen;
457 int have_v6_break = 0, in_v6_break = 0;
489 add_assoc_string(subarray,
"host",
name);
490 add_assoc_string(subarray,
"class",
"IN");
491 add_assoc_long(subarray,
"ttl", ttl);
495 add_assoc_long(subarray,
"type",
type);
496 add_assoc_stringl(subarray,
"data", (
char*)
cp, (uint32_t) dlen);
504 add_assoc_string(subarray,
"type",
"A");
506 add_assoc_string(subarray,
"ip",
name);
511 add_assoc_string(subarray,
"type",
"MX");
513 add_assoc_long(subarray,
"pri",
n);
517 add_assoc_string(subarray,
"type",
"CNAME");
522 add_assoc_string(subarray,
"type",
"NS");
527 add_assoc_string(subarray,
"type",
"PTR");
534 add_assoc_string(subarray,
"target",
name);
538 add_assoc_string(subarray,
"type",
"HINFO");
543 add_assoc_stringl(subarray,
"cpu", (
char*)
cp,
n);
549 add_assoc_stringl(subarray,
"os", (
char*)
cp,
n);
554 add_assoc_string(subarray,
"type",
"CAA");
558 add_assoc_long(subarray,
"flags",
n);
565 add_assoc_stringl(subarray,
"tag", (
char*)
cp,
n);
567 if ( (
size_t) dlen < ((
size_t)
n) + 2 ) {
572 add_assoc_stringl(subarray,
"value", (
char*)
cp,
n);
581 add_assoc_string(subarray,
"type",
"TXT");
582 tp = zend_string_alloc(dlen, 0);
588 if ((l1 +
n) >= dlen) {
603 add_assoc_str(subarray,
"txt", tp);
604 add_assoc_zval(subarray,
"entries", &entries);
608 add_assoc_string(subarray,
"type",
"SOA");
614 add_assoc_string(subarray,
"mname",
name);
620 add_assoc_string(subarray,
"rname",
name);
623 add_assoc_long(subarray,
"serial",
n);
625 add_assoc_long(subarray,
"refresh",
n);
627 add_assoc_long(subarray,
"retry",
n);
629 add_assoc_long(subarray,
"expire",
n);
631 add_assoc_long(subarray,
"minimum-ttl",
n);
636 for(i=0; i < 8; i++) {
639 if (tp > (uint8_t *)
name) {
646 if (!have_v6_break) {
651 }
else if (!in_v6_break) {
659 if (have_v6_break && in_v6_break) {
664 add_assoc_string(subarray,
"type",
"AAAA");
665 add_assoc_string(subarray,
"ipv6",
name);
669 add_assoc_string(subarray,
"type",
"A6");
671 n = ((int)
cp[0]) & 0xFF;
673 add_assoc_long(subarray,
"masklen",
n);
684 if (tp > (uint8_t *)
name) {
691 if (!have_v6_break) {
696 }
else if (!in_v6_break) {
705 for (i = (
n + 8) / 16; i < 8; i++) {
709 if (tp > (uint8_t *)
name) {
716 if (!have_v6_break) {
721 }
else if (!in_v6_break) {
729 if (have_v6_break && in_v6_break) {
734 add_assoc_string(subarray,
"ipv6",
name);
741 add_assoc_string(subarray,
"chain",
name);
746 add_assoc_string(subarray,
"type",
"SRV");
748 add_assoc_long(subarray,
"pri",
n);
750 add_assoc_long(subarray,
"weight",
n);
752 add_assoc_long(subarray,
"port",
n);
758 add_assoc_string(subarray,
"target",
name);
762 add_assoc_string(subarray,
"type",
"NAPTR");
764 add_assoc_long(subarray,
"order",
n);
766 add_assoc_long(subarray,
"pref",
n);
772 add_assoc_stringl(subarray,
"flags", (
char*)
cp,
n);
779 add_assoc_stringl(subarray,
"services", (
char*)
cp,
n);
786 add_assoc_stringl(subarray,
"regex", (
char*)
cp,
n);
794 add_assoc_string(subarray,
"replacement",
name);
816#if defined(HAVE_DNS_SEARCH)
817 struct sockaddr_storage from;
818 uint32_t fromsize =
sizeof(from);
820#elif defined(HAVE_RES_NSEARCH)
821 struct __res_state
state;
825 querybuf answer = {0};
827 int n, qd, an, ns = 0, ar = 0;
828 int type, first_query = 1, store_results = 1;
841 authns = zend_try_array_init(authns);
847 addtl = zend_try_array_init(addtl);
859 if ((type_param < 1) || (type_param > 0xFFFF)) {
892 type_to_fetch = type_param;
933 type_to_fetch = type_param&PHP_DNS_CAA ?
DNS_T_CAA : 0;
945#if defined(HAVE_DNS_SEARCH)
951#elif defined(HAVE_RES_NSEARCH)
961 n = php_dns_search(
handle, hostname, C_IN, type_to_fetch, answer.qb2,
sizeof answer);
964 dns_errno = php_dns_errno(
handle);
965 php_dns_free_handle(
handle);
986 cp = answer.qb2 + HFIXEDSZ;
987 end = answer.qb2 +
n;
988 hp = (HEADER *)&answer;
989 qd = ntohs(hp->qdcount);
990 an = ntohs(hp->ancount);
991 ns = ntohs(hp->nscount);
992 ar = ntohs(hp->arcount);
1000 php_dns_free_handle(
handle);
1007 while (an-- &&
cp &&
cp <
end) {
1010 cp = php_parserr(
cp,
end, &answer, type_to_fetch, store_results, raw, &
retval);
1016 if (authns || addtl) {
1020 while (ns-- > 0 &&
cp &&
cp <
end) {
1025 add_next_index_zval(authns, &
retval);
1032 while (ar-- > 0 &&
cp &&
cp <
end) {
1037 add_next_index_zval(addtl, &
retval);
1041 php_dns_free_handle(
handle);
1054 u_short
type, weight;
1055 querybuf answer = {0};
1060#if defined(HAVE_DNS_SEARCH)
1061 struct sockaddr_storage from;
1062 uint32_t fromsize =
sizeof(from);
1064#elif defined(HAVE_RES_NSEARCH)
1065 struct __res_state
state;
1088#if defined(HAVE_DNS_SEARCH)
1093#elif defined(HAVE_RES_NSEARCH)
1102 i = php_dns_search(
handle, hostname, C_IN,
DNS_T_MX, answer.qb2,
sizeof(answer));
1104 php_dns_free_handle(
handle);
1107 hp = (HEADER *)&answer;
1108 cp = answer.qb2 + HFIXEDSZ;
1109 end = answer.qb2 + i;
1110 for (qdc = ntohs((
unsigned short)hp->qdcount); qdc--;
cp += i + QFIXEDSZ) {
1111 if ((i = dn_skipname(
cp,
end)) < 0 ) {
1112 php_dns_free_handle(
handle);
1116 count = ntohs((
unsigned short)hp->ancount);
1118 if ((i = dn_skipname(
cp,
end)) < 0 ) {
1119 php_dns_free_handle(
handle);
1130 GETSHORT(weight,
cp);
1131 if ((i = dn_expand(answer.qb2,
end,
cp,
buf,
sizeof(
buf)-1)) < 0) {
1132 php_dns_free_handle(
handle);
1141 php_dns_free_handle(
handle);
gethostbyaddr(string $ip)
gethostbynamel(string $hostname)
dns_get_mx(string $hostname, &$hosts, &$weights=null)
count(Countable|array $value, int $mode=COUNT_NORMAL)
gethostbyname(string $hostname)
dns_check_record(string $hostname, string $type="MX")
dns_get_record(string $hostname, int $type=DNS_ANY, &$authoritative_name_servers=null, &$additional_records=null, bool $raw=false)
#define PHP_DNS_NUM_TYPES
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
foreach($dp as $el) foreach( $dp as $el) if( $pass2< 2) echo ""
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
inet_ntop(AF_INET, addr, addr_str, sizeof(addr_str))
PHPAPI struct hostent * php_network_gethostbyname(const char *name)
unsigned const char * end
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length)
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n)
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API zend_result add_next_index_string(zval *arg, const char *str)
#define RETURN_STRINGL(s, l)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_NONE()
#define Z_PARAM_STRING(dest, dest_len)
#define Z_PARAM_STR(dest)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define Z_PARAM_BOOL(dest)
#define Z_PARAM_PATH(dest, dest_len)
#define Z_PARAM_ZVAL(dest)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
struct _zend_string zend_string
#define zend_string_equals_literal_ci(str, c)
#define Z_ARRVAL_P(zval_p)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)