X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-ares;a=blobdiff_plain;f=ares.c;h=7ace77565c39e3868d077b4611e16992785767b2;hp=2fb40a3f1d8fd3e2b371dcf359804b25b2c466c6;hb=c6304a3b720ed8f26eb1cad8c03720f9973c8767;hpb=85d6e849c929e94dd5c7a70693ad182cc4c3ed64 diff --git a/ares.c b/ares.c index 2fb40a3..7ace775 100644 --- a/ares.c +++ b/ares.c @@ -41,7 +41,7 @@ #define local inline #ifndef ZEND_ENGINE_2 -# define zend_is_callable(a,b,c) 1 +# define IS_CALLABLE(a,b,c) 1 # ifndef ZTS # undef TSRMLS_SET_CTX # define TSRMLS_SET_CTX @@ -49,6 +49,13 @@ # define TSRMLS_FETCH_FROM_CTX # endif #endif +#if (PHP_MAJOR_VERSION > 5) || ((PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION >= 3)) +# define ADDREF(z) Z_ADDREF_P(z) +# define IS_CALLABLE(a,b,c) zend_is_callable((a), (b), (c) TSRMLS_CC) +#else +# define ADDREF(z) ZVAL_ADDREF(z) +# define IS_CALLABLE(a,b,c) zend_is_callable((a), (b), (c)) +#endif #define PHP_ARES_LE_NAME "AsyncResolver" #define PHP_ARES_QUERY_LE_NAME "AsyncResolverQuery" @@ -109,8 +116,8 @@ typedef union _php_ares_query_packet_data { struct { char *name; int name_len; - int type; - int dnsclass; + long type; + long dnsclass; } search; struct { char *name; @@ -280,7 +287,7 @@ local php_ares_query *php_ares_query_ctor(php_ares_query *query, php_ares_query_ query->error = -1; if (callback) { - ZVAL_ADDREF(callback); + ADDREF(callback); query->callback = callback; } @@ -427,11 +434,11 @@ local php_ares_options *php_ares_options_ctor(php_ares_options *options, HashTab } if ((SUCCESS == zend_hash_find(ht, "udp_port", sizeof("udp_port"), (void *) &opt)) && (Z_TYPE_PP(opt) == IS_LONG)) { options->flags |= ARES_OPT_UDP_PORT; - options->strct.udp_port = Z_LVAL_PP(opt); + options->strct.udp_port = htons((unsigned short) Z_LVAL_PP(opt)); } if ((SUCCESS == zend_hash_find(ht, "tcp_port", sizeof("tcp_port"), (void *) &opt)) && (Z_TYPE_PP(opt) == IS_LONG)) { options->flags |= ARES_OPT_TCP_PORT; - options->strct.tcp_port = Z_LVAL_PP(opt); + options->strct.tcp_port = htons((unsigned short) Z_LVAL_PP(opt)); } if ((SUCCESS == zend_hash_find(ht, "servers", sizeof("servers"), (void *) &opt)) && (Z_TYPE_PP(opt) == IS_ARRAY) && (i = zend_hash_num_elements(Z_ARRVAL_PP(opt)))) { options->strct.servers = ecalloc(i, sizeof(struct in_addr)); @@ -499,7 +506,7 @@ local void php_ares_options_free(php_ares_options **options) /* {{{ */ /* }}} */ /* {{{ callbacks */ -static void php_ares_callback_func(void *aq, int status, unsigned char *abuf, int alen) +static void php_ares_callback_func_old(void *aq, int status, unsigned char *abuf, int alen) { php_ares_query *q = (php_ares_query *) aq; zval *params[3], *retval; @@ -534,7 +541,7 @@ static void php_ares_callback_func(void *aq, int status, unsigned char *abuf, in } } -static void php_ares_host_callback_func(void *aq, int status, struct hostent *hostent) +static void php_ares_host_callback_func_old(void *aq, int status, struct hostent *hostent) { php_ares_query *q = (php_ares_query *) aq; zval *params[3], *retval; @@ -570,7 +577,7 @@ static void php_ares_host_callback_func(void *aq, int status, struct hostent *ho } #ifdef HAVE_ARES_GETNAMEINFO -static void php_ares_nameinfo_callback_func(void *aq, int status, char *node, char *service) +static void php_ares_nameinfo_callback_func_old(void *aq, int status, char *node, char *service) { php_ares_query *q = (php_ares_query *) aq; zval *params[4], *retval; @@ -618,6 +625,35 @@ static void php_ares_nameinfo_callback_func(void *aq, int status, char *node, ch } } #endif + +#if PHP_ARES_NEW_CALLBACK_API +# define php_ares_callback_func php_ares_callback_func_new +static void php_ares_callback_func_new(void *aq, int status, int timeouts, unsigned char *abuf, int alen) +{ + php_ares_callback_func_old(aq, status, abuf, alen); +} + +# define php_ares_host_callback_func php_ares_host_callback_func_new +static void php_ares_host_callback_func_new(void *aq, int status, int timeouts, struct hostent *hostent) +{ + php_ares_host_callback_func_old(aq, status, hostent); +} + +# ifdef HAVE_ARES_GETNAMEINFO +# define php_ares_nameinfo_callback_func php_ares_nameinfo_callback_func_new +static void php_ares_nameinfo_callback_func_new(void *aq, int status, int timeouts, char *node, char *service) +{ + php_ares_nameinfo_callback_func_old(aq, status, node, service); +} +# endif + +#else +# define php_ares_callback_func php_ares_callback_func_old +# define php_ares_host_callback_func php_ares_host_callback_func_old +# ifdef HAVE_ARES_GETNAMEINFO +# define php_ares_nameinfo_callback_func php_ares_nameinfo_callback_func_old +# endif +#endif /* }}} */ local struct timeval *php_ares_timeout(php_ares *ares, long max_timeout, struct timeval *tv_buf) /* {{{ */ @@ -818,7 +854,7 @@ static PHP_FUNCTION(ares_mkquery) RETURN_FALSE; } - if (ARES_SUCCESS != (err = ares_mkquery(name_str, dnsclass, type, id, rd, &query_str, &query_len))) { + if (ARES_SUCCESS != (err = ares_mkquery(name_str, dnsclass, type, id, rd, (unsigned char **) &query_str, &query_len))) { RETURN_ARES_ERROR(err); } RETVAL_STRINGL(query_str, query_len, 1); @@ -842,7 +878,7 @@ static PHP_FUNCTION(ares_search) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { RETURN_ARES_CB_ERROR("second"); } @@ -869,7 +905,7 @@ static PHP_FUNCTION(ares_query) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { RETURN_ARES_CB_ERROR("second"); } @@ -895,7 +931,7 @@ static PHP_FUNCTION(ares_send) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { RETURN_ARES_CB_ERROR("second"); } @@ -922,7 +958,7 @@ static PHP_FUNCTION(ares_gethostbyname) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { RETURN_ARES_CB_ERROR("second"); } @@ -933,7 +969,7 @@ static PHP_FUNCTION(ares_gethostbyname) } /* }}} */ -/* {{{ proto resource ares_gethostbyaddr(resuorce ares, mixed callback, string address[, int family = AF_INET]) +/* {{{ proto resource ares_gethostbyaddr(resuorce ares, mixed callback, string address[, int family = ARES_AF_INET]) Get host by address */ static PHP_FUNCTION(ares_gethostbyaddr) { @@ -951,7 +987,7 @@ static PHP_FUNCTION(ares_gethostbyaddr) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { PHP_ARES_CB_ERROR("second"); RETURN_FALSE; } @@ -964,7 +1000,7 @@ static PHP_FUNCTION(ares_gethostbyaddr) sa = emalloc(sa_len = sizeof(struct in6_addr)); break; default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter family is neither AF_INET nor AF_INET6"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter family is neither ARES_AF_INET nor ARES_AF_INET6"); RETURN_FALSE; break; } @@ -983,7 +1019,7 @@ static PHP_FUNCTION(ares_gethostbyaddr) /* }}} */ #ifdef HAVE_ARES_GETNAMEINFO -/* {{{ proto resource ares_getnameinfo(resource ares, mixed callback, int flags, string addr[, int family[, int port]]) +/* {{{ proto resource ares_getnameinfo(resource ares, mixed callback, int flags, string addr[, int family = ARES_AF_INET[, int port = 0]]) Get name info */ static PHP_FUNCTION(ares_getnameinfo) { @@ -1003,7 +1039,7 @@ static PHP_FUNCTION(ares_getnameinfo) } ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); - if (cb && !zend_is_callable(cb, 0, NULL)) { + if (cb && !IS_CALLABLE(cb, 0, NULL)) { PHP_ARES_CB_ERROR("second"); RETURN_FALSE; } @@ -1011,9 +1047,9 @@ static PHP_FUNCTION(ares_getnameinfo) RETVAL_TRUE; switch (family) { case AF_INET: - in = emalloc(sa_len = sizeof(struct sockaddr_in)); + in = ecalloc(1, sa_len = sizeof(struct sockaddr_in)); in->sin_family = AF_INET; - in->sin_port = port; + in->sin_port = htons((unsigned short) port); if (1 > inet_pton(in->sin_family, addr, &in->sin_addr)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "inet_pton('%s') failed", addr); RETVAL_FALSE; @@ -1021,9 +1057,9 @@ static PHP_FUNCTION(ares_getnameinfo) sa = (struct sockaddr *) in; break; case AF_INET6: - in6 = emalloc(sa_len = sizeof(struct sockaddr_in6)); + in6 = ecalloc(1, sa_len = sizeof(struct sockaddr_in6)); in6->sin6_family = AF_INET6; - in6->sin6_port = port; + in6->sin6_port = htons((unsigned short) port); if (1 > inet_pton(in6->sin6_family, addr, &in6->sin6_addr)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "inet_pton('%s') failed", addr); RETVAL_FALSE; @@ -1330,117 +1366,6 @@ static PHP_FUNCTION(ares_fds) } /* }}} */ - -/* {{{ proto array ares_parse_a_reply(string reply) - Parse an A reply */ -static PHP_FUNCTION(ares_parse_a_reply) -{ - char *buf; - int len, err; - struct hostent *hostent; - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &len)) { - RETURN_FALSE; - } - - if (ARES_SUCCESS != (err = ares_parse_a_reply((const unsigned char *) buf, len, &hostent))) { - RETURN_ARES_ERROR(err); - } - - object_init(return_value); - php_ares_hostent_to_struct(hostent, HASH_OF(return_value)); - ares_free_hostent(hostent); -} -/* }}} */ - -#ifdef HAVE_ARES_PARSE_AAAA_REPLY -/* {{{ proto array ares_parse_aaaa_reply(string reply) - Parse an AAAA reply */ -static PHP_FUNCTION(ares_parse_aaaa_reply) -{ - char *buf; - int len, err; - struct hostent *hostent; - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &len)) { - RETURN_FALSE; - } - - if (ARES_SUCCESS != (err = ares_parse_aaaa_reply((const unsigned char *) buf, len, &hostent))) { - RETURN_ARES_ERROR(err); - } - - object_init(return_value); - php_ares_hostent_to_struct(hostent, HASH_OF(return_value)); - ares_free_hostent(hostent); -} -/* }}} */ -#endif - -/* {{{ proto array ares_parse_ptr_reply(string reply) - Parse a PTR reply */ -static PHP_FUNCTION(ares_parse_ptr_reply) -{ - char *buf; - int len, err; - struct hostent *hostent; - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &len)) { - RETURN_FALSE; - } - - if (ARES_SUCCESS != (err = ares_parse_ptr_reply((const unsigned char *) buf, len, NULL, 0, 0, &hostent))) { - RETURN_ARES_ERROR(err); - } - - object_init(return_value); - php_ares_hostent_to_struct(hostent, HASH_OF(return_value)); - ares_free_hostent(hostent); -} -/* }}} */ - -/* {{{ proto string ares_expand_name(string name) - Expand a DNS encoded name into a human readable dotted string */ -static PHP_FUNCTION(ares_expand_name) -{ - char *name_str, *exp_str; - int name_len,err; - PHP_ARES_EXPAND_LEN_TYPE exp_len; - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name_str, &name_len)) { - RETURN_FALSE; - } - - if (ARES_SUCCESS != (err = ares_expand_name((const unsigned char *) name_str, (const unsigned char *) name_str, name_len, &exp_str, &exp_len))) { - RETURN_ARES_ERROR(err); - } - RETVAL_STRINGL(exp_str, exp_len, 1); - ares_free_string(exp_str); -} -/* }}} */ - -#ifdef HAVE_ARES_EXPAND_STRING -/* {{{ proto string ares_expand_string(string buf) - Expand a DNS encoded string into a human readable */ -static PHP_FUNCTION(ares_expand_string) -{ - char *buf_str, *exp_str; - int buf_len, err; - PHP_ARES_EXPAND_LEN_TYPE exp_len; - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf_str, &buf_len)) { - RETURN_FALSE; - } - - if (ARES_SUCCESS != (err = ares_expand_string((const unsigned char *) buf_str, (const unsigned char *) buf_str, buf_len, &exp_str, &exp_len))) { - RETURN_ARES_ERROR(err); - } - RETVAL_STRINGL(exp_str, exp_len, 1); - ares_free_string(exp_str); -} -/* }}} */ -#endif - static ZEND_RSRC_DTOR_FUNC(php_ares_le_dtor) { php_ares *ares = (php_ares *) rsrc->ptr; @@ -1508,15 +1433,11 @@ static PHP_MINIT_FUNCTION(ares) REGISTER_LONG_CONSTANT("ARES_FLAG_NOALIASES", ARES_FLAG_NOALIASES, CONST_PERSISTENT|CONST_CS); REGISTER_LONG_CONSTANT("ARES_FLAG_NOCHECKRESP", ARES_FLAG_NOCHECKRESP, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_FLAGS", ARES_OPT_FLAGS, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_TIMEOUT", ARES_OPT_TIMEOUT, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_TRIES", ARES_OPT_TRIES, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_NDOTS", ARES_OPT_NDOTS, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_UDP_PORT", ARES_OPT_UDP_PORT, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_TCP_PORT", ARES_OPT_TCP_PORT, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_SERVERS", ARES_OPT_SERVERS, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_DOMAINS", ARES_OPT_DOMAINS, CONST_PERSISTENT|CONST_CS); - REGISTER_LONG_CONSTANT("ARES_OPT_LOOKUPS", ARES_OPT_LOOKUPS, CONST_PERSISTENT|CONST_CS); + /* + * Address Family Constants + */ + REGISTER_LONG_CONSTANT("ARES_AF_INET", AF_INET, CONST_PERSISTENT|CONST_CS); + REGISTER_LONG_CONSTANT("ARES_AF_INET6", AF_INET6, CONST_PERSISTENT|CONST_CS); /* * Name Info constants @@ -1738,6 +1659,7 @@ static PHP_MINFO_FUNCTION(ares) { php_info_print_table_start(); php_info_print_table_header(2, "AsyncResolver support", "enabled"); + php_info_print_table_row(2, "Version", PHP_ARES_VERSION); php_info_print_table_end(); php_info_print_table_start(); @@ -1811,15 +1733,6 @@ zend_function_entry ares_functions[] = { PHP_FE(ares_select, ai_ares_select) PHP_FE(ares_fds, ai_ares_fds) PHP_FE(ares_timeout, NULL) - PHP_FE(ares_parse_a_reply, NULL) -#ifdef HAVE_ARES_PARSE_AAAA_REPLY - PHP_FE(ares_parse_aaaa_reply, NULL) -#endif - PHP_FE(ares_parse_ptr_reply, NULL) - PHP_FE(ares_expand_name, NULL) -#ifdef HAVE_ARES_EXPAND_STRING - PHP_FE(ares_expand_string, NULL) -#endif {NULL, NULL, NULL} }; /* }}} */ @@ -1834,7 +1747,7 @@ zend_module_entry ares_module_entry = { NULL, NULL, PHP_MINFO(ares), - NO_VERSION_YET, + PHP_ARES_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */