xref: /PHP-7.2/ext/curl/share.c (revision 7a7ec01a)
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 	ZEND_PARSE_PARAMETERS_START(1,1)
63 		Z_PARAM_RESOURCE(z_sh)
64 	ZEND_PARSE_PARAMETERS_END();
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 	ZEND_PARSE_PARAMETERS_START(3,3)
108 		Z_PARAM_RESOURCE(zid)
109 		Z_PARAM_LONG(options)
110 		Z_PARAM_ZVAL(zvalue)
111 	ZEND_PARSE_PARAMETERS_END();
112 
113 	if ((sh = (php_curlsh *)zend_fetch_resource(Z_RES_P(zid), le_curl_share_handle_name, le_curl_share_handle)) == NULL) {
114 		RETURN_FALSE;
115 	}
116 
117 	if (!_php_curl_share_setopt(sh, options, zvalue, return_value)) {
118 		RETURN_TRUE;
119 	} else {
120 		RETURN_FALSE;
121 	}
122 }
123 /* }}} */
124 
_php_curl_share_close(zend_resource * rsrc)125 void _php_curl_share_close(zend_resource *rsrc) /* {{{ */
126 {
127 	php_curlsh *sh = (php_curlsh *)rsrc->ptr;
128 	if (sh) {
129 		curl_share_cleanup(sh->share);
130 		efree(sh);
131 		rsrc->ptr = NULL;
132 	}
133 }
134 /* }}} */
135 
136 /* {{{ proto int curl_share_errno(resource mh)
137          Return an integer containing the last share curl error number */
PHP_FUNCTION(curl_share_errno)138 PHP_FUNCTION(curl_share_errno)
139 {
140 	zval        *z_sh;
141 	php_curlsh  *sh;
142 
143 	ZEND_PARSE_PARAMETERS_START(1,1)
144 		Z_PARAM_RESOURCE(z_sh)
145 	ZEND_PARSE_PARAMETERS_END();
146 
147 	if ((sh = (php_curlsh *)zend_fetch_resource(Z_RES_P(z_sh), le_curl_share_handle_name, le_curl_share_handle)) == NULL) {
148 		RETURN_FALSE;
149 	}
150 
151 	RETURN_LONG(sh->err.no);
152 }
153 /* }}} */
154 
155 
156 #if LIBCURL_VERSION_NUM >= 0x070c00 /* Available since 7.12.0 */
157 /* {{{ proto bool curl_share_strerror(int code)
158          return string describing error code */
PHP_FUNCTION(curl_share_strerror)159 PHP_FUNCTION(curl_share_strerror)
160 {
161 	zend_long code;
162 	const char *str;
163 
164 	ZEND_PARSE_PARAMETERS_START(1,1)
165 		Z_PARAM_LONG(code)
166 	ZEND_PARSE_PARAMETERS_END();
167 
168 	str = curl_share_strerror(code);
169 	if (str) {
170 		RETURN_STRING(str);
171 	} else {
172 		RETURN_NULL();
173 	}
174 }
175 /* }}} */
176 #endif
177 
178 #endif
179 
180 /*
181  * Local variables:
182  * tab-width: 4
183  * c-basic-offset: 4
184  * End:
185  * vim600: noet sw=4 ts=4 fdm=marker
186  * vim<600: noet sw=4 ts=4
187  */
188