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