xref: /PHP-7.1/ext/curl/share.c (revision ccd4716e)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 7                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2018 The PHP Group                                |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 3.01 of the PHP license,      |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.php.net/license/3_01.txt                                  |
11    | If you did not receive a copy of the PHP license and are unable to   |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@php.net so we can mail you a copy immediately.               |
14    +----------------------------------------------------------------------+
15    | Author: Pierrick Charron <pierrick@php.net>                          |
16    +----------------------------------------------------------------------+
17 */
18 
19 /* $Id$ */
20 
21 #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
22 
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26 
27 #include "php.h"
28 
29 #if HAVE_CURL
30 
31 #include "php_curl.h"
32 
33 #include <curl/curl.h>
34 
35 #define SAVE_CURLSH_ERROR(__handle, __err) (__handle)->err.no = (int) __err;
36 
37 /* {{{ proto void curl_share_init()
38    Initialize a share curl handle */
PHP_FUNCTION(curl_share_init)39 PHP_FUNCTION(curl_share_init)
40 {
41 	php_curlsh *sh;
42 
43 	if (zend_parse_parameters_none() == FAILURE) {
44 		return;
45 	}
46 
47 	sh = ecalloc(1, sizeof(php_curlsh));
48 
49 	sh->share = curl_share_init();
50 
51 	RETURN_RES(zend_register_resource(sh, le_curl_share_handle));
52 }
53 /* }}} */
54 
55 /* {{{ proto void curl_share_close(resource sh)
56    Close a set of cURL handles */
PHP_FUNCTION(curl_share_close)57 PHP_FUNCTION(curl_share_close)
58 {
59 	zval *z_sh;
60 	php_curlsh *sh;
61 
62 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_sh) == FAILURE) {
63 		return;
64 	}
65 
66 	if ((sh = (php_curlsh *)zend_fetch_resource(Z_RES_P(z_sh), le_curl_share_handle_name, le_curl_share_handle)) == NULL) {
67 		RETURN_FALSE;
68 	}
69 
70 	zend_list_close(Z_RES_P(z_sh));
71 }
72 /* }}} */
73 
_php_curl_share_setopt(php_curlsh * sh,zend_long option,zval * zvalue,zval * return_value)74 static int _php_curl_share_setopt(php_curlsh *sh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */
75 {
76 	CURLSHcode error = CURLSHE_OK;
77 
78 	switch (option) {
79 		case CURLSHOPT_SHARE:
80 		case CURLSHOPT_UNSHARE:
81 			error = curl_share_setopt(sh->share, option, zval_get_long(zvalue));
82 			break;
83 
84 		default:
85 			php_error_docref(NULL, E_WARNING, "Invalid curl share configuration option");
86 			error = CURLSHE_BAD_OPTION;
87 			break;
88 	}
89 
90 	SAVE_CURLSH_ERROR(sh, error);
91 	if (error != CURLSHE_OK) {
92 		return 1;
93 	} else {
94 		return 0;
95 	}
96 }
97 /* }}} */
98 
99 /* {{{ proto bool curl_share_setopt(resource sh, int option, mixed value)
100       Set an option for a cURL transfer */
PHP_FUNCTION(curl_share_setopt)101 PHP_FUNCTION(curl_share_setopt)
102 {
103 	zval       *zid, *zvalue;
104 	zend_long        options;
105 	php_curlsh *sh;
106 
107 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &zid, &options, &zvalue) == FAILURE) {
108 		return;
109 	}
110 
111 	if ((sh = (php_curlsh *)zend_fetch_resource(Z_RES_P(zid), le_curl_share_handle_name, le_curl_share_handle)) == NULL) {
112 		RETURN_FALSE;
113 	}
114 
115 	if (!_php_curl_share_setopt(sh, options, zvalue, return_value)) {
116 		RETURN_TRUE;
117 	} else {
118 		RETURN_FALSE;
119 	}
120 }
121 /* }}} */
122 
_php_curl_share_close(zend_resource * rsrc)123 void _php_curl_share_close(zend_resource *rsrc) /* {{{ */
124 {
125 	php_curlsh *sh = (php_curlsh *)rsrc->ptr;
126 	if (sh) {
127 		curl_share_cleanup(sh->share);
128 		efree(sh);
129 		rsrc->ptr = NULL;
130 	}
131 }
132 /* }}} */
133 
134 /* {{{ proto int curl_share_errno(resource mh)
135          Return an integer containing the last share curl error number */
PHP_FUNCTION(curl_share_errno)136 PHP_FUNCTION(curl_share_errno)
137 {
138 	zval        *z_sh;
139 	php_curlsh  *sh;
140 
141 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_sh) == FAILURE) {
142 		return;
143 	}
144 
145 	if ((sh = (php_curlsh *)zend_fetch_resource(Z_RES_P(z_sh), le_curl_share_handle_name, le_curl_share_handle)) == NULL) {
146 		RETURN_FALSE;
147 	}
148 
149 	RETURN_LONG(sh->err.no);
150 }
151 /* }}} */
152 
153 
154 #if LIBCURL_VERSION_NUM >= 0x070c00 /* Available since 7.12.0 */
155 /* {{{ proto bool curl_share_strerror(int code)
156          return string describing error code */
PHP_FUNCTION(curl_share_strerror)157 PHP_FUNCTION(curl_share_strerror)
158 {
159 	zend_long code;
160 	const char *str;
161 
162 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &code) == FAILURE) {
163 		return;
164 	}
165 
166 	str = curl_share_strerror(code);
167 	if (str) {
168 		RETURN_STRING(str);
169 	} else {
170 		RETURN_NULL();
171 	}
172 }
173 /* }}} */
174 #endif
175 
176 #endif
177 
178 /*
179  * Local variables:
180  * tab-width: 4
181  * c-basic-offset: 4
182  * End:
183  * vim600: noet sw=4 ts=4 fdm=marker
184  * vim<600: noet sw=4 ts=4
185  */
186