diff options
Diffstat (limited to 'ext/curl/share.c')
-rw-r--r-- | ext/curl/share.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/ext/curl/share.c b/ext/curl/share.c new file mode 100644 index 0000000000..d1aed87940 --- /dev/null +++ b/ext/curl/share.c @@ -0,0 +1,136 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Pierrick Charron <pierrick@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" + +#if HAVE_CURL + +#include "php_curl.h" + +#include <curl/curl.h> + +/* {{{ proto void curl_share_init() + Initialize a share curl handle */ +PHP_FUNCTION(curl_share_init) +{ + php_curlsh *sh; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + sh = ecalloc(1, sizeof(php_curlsh)); + + sh->share = curl_share_init(); + + ZEND_REGISTER_RESOURCE(return_value, sh, le_curl_share_handle); +} +/* }}} */ + +/* {{{ proto void curl_share_close(resource sh) + Close a set of cURL handles */ +PHP_FUNCTION(curl_share_close) +{ + zval *z_sh; + php_curlsh *sh; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_sh) == FAILURE) { + return; + } + + ZEND_FETCH_RESOURCE(sh, php_curlsh *, &z_sh, -1, le_curl_share_handle_name, le_curl_share_handle); + zend_list_delete(Z_LVAL_P(z_sh)); +} +/* }}} */ + +static int _php_curl_share_setopt(php_curlsh *sh, long option, zval **zvalue, zval *return_value TSRMLS_DC) /* {{{ */ +{ + CURLSHcode error = CURLSHE_OK; + + switch (option) { + case CURLSHOPT_SHARE: + case CURLSHOPT_UNSHARE: + convert_to_long_ex(zvalue); + error = curl_share_setopt(sh->share, option, Z_LVAL_PP(zvalue)); + break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid curl share configuration option"); + error = CURLSHE_BAD_OPTION; + break; + } + + if (error != CURLSHE_OK) { + return 1; + } else { + return 0; + } +} +/* }}} */ + +/* {{{ proto bool curl_share_setopt(resource sh, int option, mixed value) + Set an option for a cURL transfer */ +PHP_FUNCTION(curl_share_setopt) +{ + zval *zid, **zvalue; + long options; + php_curlsh *sh; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlZ", &zid, &options, &zvalue) == FAILURE) { + return; + } + + ZEND_FETCH_RESOURCE(sh, php_curlsh *, &zid, -1, le_curl_share_handle_name, le_curl_share_handle); + + if (!_php_curl_share_setopt(sh, options, zvalue, return_value TSRMLS_CC)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +void _php_curl_share_close(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */ +{ + php_curlsh *sh = (php_curlsh *) rsrc->ptr; + if (sh) { + curl_share_cleanup(sh->share); + efree(sh); + rsrc->ptr = NULL; + } +} +/* }}} */ + +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ |