X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-ares;a=blobdiff_plain;f=php_ares.c;h=252c152520646e544503e1ab319ccf313d40d023;hp=ee6defacac635fa2b114b4f10563c52acf4a4b81;hb=d57d6211de6376ef0ad7277ca6c7dac448427e68;hpb=da29629a35d143dc564bf7997748ecff840f67d3 diff --git a/php_ares.c b/php_ares.c index ee6defa..252c152 100644 --- a/php_ares.c +++ b/php_ares.c @@ -553,11 +553,19 @@ 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)) && is_numeric(opt, &lval)) { options->flags |= ARES_OPT_UDP_PORT; +#ifdef PHP_ARES_CARES + options->strct.udp_port = (unsigned short) lval; +#else options->strct.udp_port = htons((unsigned short) lval); +#endif } if ((SUCCESS == zend_hash_find(ht, "tcp_port", sizeof("tcp_port"), (void *) &opt)) && is_numeric(opt, &lval)) { options->flags |= ARES_OPT_TCP_PORT; +#ifdef PHP_ARES_CARES + options->strct.tcp_port = (unsigned short) lval; +#else options->strct.tcp_port = htons((unsigned short) lval); +#endif } 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)); @@ -1093,11 +1101,11 @@ static PHP_FUNCTION(ares_init) php_ares *ares = NULL; int err; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &opt_array)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a/!", &opt_array)) { RETURN_FALSE; } - ares = emalloc(sizeof(php_ares)); + ares = ecalloc(1, sizeof(php_ares)); TSRMLS_SET_CTX(ares->tsrm_ls); zend_llist_init(&ares->queries, sizeof(php_ares_query *), (llist_dtor_func_t) php_ares_query_llist_dtor, 0); php_ares_options_ctor(&ares->options, opt_array ? Z_ARRVAL_P(opt_array) : NULL); @@ -1113,6 +1121,65 @@ static PHP_FUNCTION(ares_init) } /* }}} */ +#ifdef HAVE_ARES_SET_LOCAL_DEV +/* {{{ proto void ares_set_local_dev(resource ares, string dev) + Set the local interface name to bind to. */ +static PHP_FUNCTION(ares_set_local_dev) +{ + zval *rsrc; + char *dev_str = NULL; + int dev_len = 0; + php_ares *ares; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs!", &rsrc, &dev_str, &dev_len)) { + RETURN_FALSE; + } + ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); + + ares_set_local_dev(ares->channel, dev_str); +} +#endif + +#ifdef HAVE_ARES_SET_LOCAL_IP4 +/* {{{ proto void ares_set_local_ip4(resource ares, int addr) + Set the local IPv4 address to bind to. */ +static PHP_FUNCTION(ares_set_local_ip4) +{ + zval *rsrc; + long ip4_num; + php_ares *ares; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &rsrc, &ip4_num)) { + RETURN_FALSE; + } + ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); + + ares_set_local_ip4(ares->channel, (unsigned int) ip4_num); +} +#endif + +#ifdef HAVE_ARES_SET_LOCAL_IP6 +/* {{{ proto void ares_set_local_ip6(resource ares, string addr128bit) + Set the local IPv6 address to bind to. */ +static PHP_FUNCTION(ares_set_local_ip6) +{ + zval *rsrc; + char *ip6_str; + int ip6_len; + php_ares *ares; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &rsrc, &ip6_str, &ip6_len)) { + RETURN_FALSE; + } + if (16 != ip6_len) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Binary IPv6 address string must be exactly 16 bytes long"); + } + ZEND_FETCH_RESOURCE(ares, php_ares *, &rsrc, -1, PHP_ARES_LE_NAME, le_ares); + + ares_set_local_ip6(ares->channel, (unsigned char *) ip6_str); +} +#endif + /* {{{ proto void ares_destroy(resource ares) Destroy the ares handle */ static PHP_FUNCTION(ares_destroy) @@ -1770,6 +1837,9 @@ static PHP_MINIT_FUNCTION(ares) REGISTER_LONG_CONSTANT("ARES_FLAG_NOSEARCH", ARES_FLAG_NOSEARCH, CONST_PERSISTENT|CONST_CS); 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); +#ifdef ARES_FLAG_EDNS + REGISTER_LONG_CONSTANT("ARES_FLAG_EDNS", ARES_FLAG_EDNS, CONST_PERSISTENT|CONST_CS); +#endif /* * Address Family Constants