Skip to content

Commit 489da59

Browse files
committed
Refactoring socket (only compilable now)
1 parent bcb4fcd commit 489da59

File tree

8 files changed

+288
-299
lines changed

8 files changed

+288
-299
lines changed

ext/sockets/conversions.c

+95-106
Large diffs are not rendered by default.

ext/sockets/conversions.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,6 @@ zval *to_zval_run_conversions(const char *structure,
7979
to_zval_read_field *reader,
8080
const char *top_name,
8181
const struct key_value *key_value_pairs,
82-
struct err_s *err);
82+
struct err_s *err, zval *zv);
8383

8484
#endif

ext/sockets/multicast.c

+29-27
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,12 @@ static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC)
100100
ret = SUCCESS;
101101
}
102102
} else {
103-
zval_add_ref(&val);
104-
convert_to_string_ex(&val);
103+
if (Z_REFCOUNTED_P(val)) {
104+
Z_ADDREF_P(val);
105+
}
106+
convert_to_string_ex(val);
105107
ret = php_string_to_if_index(Z_STRVAL_P(val), out TSRMLS_CC);
106-
zval_ptr_dtor(&val);
108+
zval_ptr_dtor(val);
107109
}
108110

109111
return ret;
@@ -114,38 +116,38 @@ static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC)
114116
static int php_get_if_index_from_array(const HashTable *ht, const char *key,
115117
php_socket *sock, unsigned int *if_index TSRMLS_DC)
116118
{
117-
zval **val;
119+
zval *val;
118120

119-
if (zend_hash_find(ht, key, strlen(key) + 1, (void **)&val) == FAILURE) {
121+
if ((val = zend_hash_str_find(ht, key, strlen(key))) == NULL) {
120122
*if_index = 0; /* default: 0 */
121123
return SUCCESS;
122124
}
123125

124-
return php_get_if_index_from_zval(*val, if_index TSRMLS_CC);
126+
return php_get_if_index_from_zval(val, if_index TSRMLS_CC);
125127
}
126128

127129
static int php_get_address_from_array(const HashTable *ht, const char *key,
128130
php_socket *sock, php_sockaddr_storage *ss, socklen_t *ss_len TSRMLS_DC)
129131
{
130-
zval **val,
131-
*valcp;
132+
zval *val;
132133

133-
if (zend_hash_find(ht, key, strlen(key) + 1, (void **)&val) == FAILURE) {
134+
if ((val = zend_hash_str_find(ht, key, strlen(key))) == NULL) {
134135
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no key \"%s\" passed in optval", key);
135136
return FAILURE;
136137
}
137-
valcp = *val;
138-
zval_add_ref(&valcp);
138+
if (Z_REFCOUNTED_P(val)) {
139+
Z_ADDREF_P(val);
140+
}
139141
convert_to_string_ex(val);
140-
if (!php_set_inet46_addr(ss, ss_len, Z_STRVAL_P(valcp), sock TSRMLS_CC)) {
141-
zval_ptr_dtor(&valcp);
142+
if (!php_set_inet46_addr(ss, ss_len, Z_STRVAL_P(val), sock TSRMLS_CC)) {
143+
zval_ptr_dtor(val);
142144
return FAILURE;
143145
}
144-
zval_ptr_dtor(&valcp);
146+
zval_ptr_dtor(val);
145147
return SUCCESS;
146148
}
147149

148-
static int php_do_mcast_opt(php_socket *php_sock, int level, int optname, zval **arg4 TSRMLS_DC)
150+
static int php_do_mcast_opt(php_socket *php_sock, int level, int optname, zval *arg4 TSRMLS_DC)
149151
{
150152
HashTable *opt_ht;
151153
unsigned int if_index;
@@ -169,7 +171,7 @@ static int php_do_mcast_opt(php_socket *php_sock, int level, int optname, zval *
169171
mcast_req_fun = &php_mcast_leave;
170172
mcast_req_fun:
171173
convert_to_array_ex(arg4);
172-
opt_ht = HASH_OF(*arg4);
174+
opt_ht = HASH_OF(arg4);
173175

174176
if (php_get_address_from_array(opt_ht, "group", php_sock, &group,
175177
&glen TSRMLS_CC) == FAILURE) {
@@ -205,7 +207,7 @@ static int php_do_mcast_opt(php_socket *php_sock, int level, int optname, zval *
205207
mcast_sreq_fun = &php_mcast_leave_source;
206208
mcast_sreq_fun:
207209
convert_to_array_ex(arg4);
208-
opt_ht = HASH_OF(*arg4);
210+
opt_ht = HASH_OF(arg4);
209211

210212
if (php_get_address_from_array(opt_ht, "group", php_sock, &group,
211213
&glen TSRMLS_CC) == FAILURE) {
@@ -244,7 +246,7 @@ static int php_do_mcast_opt(php_socket *php_sock, int level, int optname, zval *
244246
int php_do_setsockopt_ip_mcast(php_socket *php_sock,
245247
int level,
246248
int optname,
247-
zval **arg4 TSRMLS_DC)
249+
zval *arg4 TSRMLS_DC)
248250
{
249251
unsigned int if_index;
250252
struct in_addr if_addr;
@@ -269,7 +271,7 @@ int php_do_setsockopt_ip_mcast(php_socket *php_sock,
269271
}
270272

271273
case IP_MULTICAST_IF:
272-
if (php_get_if_index_from_zval(*arg4, &if_index TSRMLS_CC) == FAILURE) {
274+
if (php_get_if_index_from_zval(arg4, &if_index TSRMLS_CC) == FAILURE) {
273275
return FAILURE;
274276
}
275277

@@ -282,17 +284,17 @@ int php_do_setsockopt_ip_mcast(php_socket *php_sock,
282284

283285
case IP_MULTICAST_LOOP:
284286
convert_to_boolean_ex(arg4);
285-
ipv4_mcast_ttl_lback = (unsigned char) (Z_TYPE_PP(arg4) == IS_TRUE);
287+
ipv4_mcast_ttl_lback = (unsigned char) (Z_TYPE_P(arg4) == IS_TRUE);
286288
goto ipv4_loop_ttl;
287289

288290
case IP_MULTICAST_TTL:
289291
convert_to_long_ex(arg4);
290-
if (Z_LVAL_PP(arg4) < 0L || Z_LVAL_PP(arg4) > 255L) {
292+
if (Z_LVAL_P(arg4) < 0L || Z_LVAL_P(arg4) > 255L) {
291293
php_error_docref(NULL TSRMLS_CC, E_WARNING,
292294
"Expected a value between 0 and 255");
293295
return FAILURE;
294296
}
295-
ipv4_mcast_ttl_lback = (unsigned char) Z_LVAL_PP(arg4);
297+
ipv4_mcast_ttl_lback = (unsigned char) Z_LVAL_P(arg4);
296298
ipv4_loop_ttl:
297299
opt_ptr = &ipv4_mcast_ttl_lback;
298300
optlen = sizeof(ipv4_mcast_ttl_lback);
@@ -314,7 +316,7 @@ int php_do_setsockopt_ip_mcast(php_socket *php_sock,
314316
int php_do_setsockopt_ipv6_mcast(php_socket *php_sock,
315317
int level,
316318
int optname,
317-
zval **arg4 TSRMLS_DC)
319+
zval *arg4 TSRMLS_DC)
318320
{
319321
unsigned int if_index;
320322
void *opt_ptr;
@@ -338,7 +340,7 @@ int php_do_setsockopt_ipv6_mcast(php_socket *php_sock,
338340
}
339341

340342
case IPV6_MULTICAST_IF:
341-
if (php_get_if_index_from_zval(*arg4, &if_index TSRMLS_CC) == FAILURE) {
343+
if (php_get_if_index_from_zval(arg4, &if_index TSRMLS_CC) == FAILURE) {
342344
return FAILURE;
343345
}
344346

@@ -348,16 +350,16 @@ int php_do_setsockopt_ipv6_mcast(php_socket *php_sock,
348350

349351
case IPV6_MULTICAST_LOOP:
350352
convert_to_boolean_ex(arg4);
351-
ov = (int) Z_TYPE_PP(arg4) == IS_TRUE;
353+
ov = (int) Z_TYPE_P(arg4) == IS_TRUE;
352354
goto ipv6_loop_hops;
353355
case IPV6_MULTICAST_HOPS:
354356
convert_to_long_ex(arg4);
355-
if (Z_LVAL_PP(arg4) < -1L || Z_LVAL_PP(arg4) > 255L) {
357+
if (Z_LVAL_P(arg4) < -1L || Z_LVAL_P(arg4) > 255L) {
356358
php_error_docref(NULL TSRMLS_CC, E_WARNING,
357359
"Expected a value between -1 and 255");
358360
return FAILURE;
359361
}
360-
ov = (int) Z_LVAL_PP(arg4);
362+
ov = (int) Z_LVAL_P(arg4);
361363
ipv6_loop_hops:
362364
opt_ptr = &ov;
363365
optlen = sizeof(ov);

ext/sockets/multicast.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@
4848
int php_do_setsockopt_ip_mcast(php_socket *php_sock,
4949
int level,
5050
int optname,
51-
zval **arg4 TSRMLS_DC);
51+
zval *arg4 TSRMLS_DC);
5252

5353
int php_do_setsockopt_ipv6_mcast(php_socket *php_sock,
5454
int level,
5555
int optname,
56-
zval **arg4 TSRMLS_DC);
56+
zval *arg4 TSRMLS_DC);
5757

5858
int php_if_index_to_addr4(
5959
unsigned if_index,

ext/sockets/php_sockets.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ typedef struct {
5959
int type;
6060
int error;
6161
int blocking;
62-
zval *zstream;
62+
zval zstream;
6363
} php_socket;
6464

6565
#ifdef PHP_WIN32

ext/sockets/sendrecvmsg.c

+15-14
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ static struct {
8383
} ancillary_registry;
8484

8585

86+
static void ancillary_registery_free_elem(zval *el) {
87+
pefree(Z_PTR_P(el), 1);
88+
}
89+
8690
#ifdef ZTS
8791
static MUTEX_T ancillary_mutex;
8892
#endif
@@ -92,7 +96,7 @@ static void init_ancillary_registry(void)
9296
anc_reg_key key;
9397
ancillary_registry.initialized = 1;
9498

95-
zend_hash_init(&ancillary_registry.ht, 32, NULL, NULL, 1);
99+
zend_hash_init(&ancillary_registry.ht, 32, NULL, ancillary_registery_free_elem, 1);
96100

97101
#define PUT_ENTRY(sizev, var_size, calc, from, to, level, type) \
98102
entry.size = sizev; \
@@ -102,8 +106,7 @@ static void init_ancillary_registry(void)
102106
entry.to_array = to; \
103107
key.cmsg_level = level; \
104108
key.cmsg_type = type; \
105-
zend_hash_update(&ancillary_registry.ht, (char*)&key, sizeof(key), \
106-
(void*)&entry, sizeof(entry), NULL)
109+
zend_hash_str_update_mem(&ancillary_registry.ht, (char*)&key, sizeof(key) - 1, (void*)&entry, sizeof(entry))
107110

108111
#if defined(IPV6_PKTINFO) && HAVE_IPV6
109112
PUT_ENTRY(sizeof(struct in6_pktinfo), 0, 0, from_zval_write_in6_pktinfo,
@@ -153,8 +156,7 @@ ancillary_reg_entry *get_ancillary_reg_entry(int cmsg_level, int msg_type)
153156
tsrm_mutex_unlock(ancillary_mutex);
154157
#endif
155158

156-
if (zend_hash_find(&ancillary_registry.ht, (char*)&key, sizeof(key),
157-
(void**)&entry) == SUCCESS) {
159+
if ((entry = zend_hash_str_find_ptr(&ancillary_registry.ht, (char*)&key, sizeof(key) - 1)) != NULL) {
158160
return entry;
159161
} else {
160162
return NULL;
@@ -179,7 +181,7 @@ PHP_FUNCTION(socket_sendmsg)
179181

180182
LONG_CHECK_VALID_INT(flags);
181183

182-
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &zsocket, -1,
184+
ZEND_FETCH_RESOURCE(php_sock, php_socket *, zsocket, -1,
183185
php_sockets_le_socket_name, php_sockets_le_socket());
184186

185187
msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_send,
@@ -222,7 +224,7 @@ PHP_FUNCTION(socket_recvmsg)
222224

223225
LONG_CHECK_VALID_INT(flags);
224226

225-
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &zsocket, -1,
227+
ZEND_FETCH_RESOURCE(php_sock, php_socket *, zsocket, -1,
226228
php_sockets_le_socket_name, php_sockets_le_socket());
227229

228230
msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_recv,
@@ -236,15 +238,15 @@ PHP_FUNCTION(socket_recvmsg)
236238
res = recvmsg(php_sock->bsd_socket, msghdr, (int)flags);
237239

238240
if (res != -1) {
239-
zval *zres;
241+
zval *zres, tmp;
240242
struct key_value kv[] = {
241243
{KEY_RECVMSG_RET, sizeof(KEY_RECVMSG_RET), &res},
242244
{0}
243245
};
244246

245247

246248
zres = to_zval_run_conversions((char *)msghdr, to_zval_read_msghdr,
247-
"msghdr", kv, &err);
249+
"msghdr", kv, &err, &tmp);
248250

249251
/* we don;t need msghdr anymore; free it */
250252
msghdr = NULL;
@@ -253,7 +255,6 @@ PHP_FUNCTION(socket_recvmsg)
253255
zval_dtor(zmsg);
254256
if (!err.has_error) {
255257
ZVAL_COPY_VALUE(zmsg, zres);
256-
efree(zres); /* only shallow destruction */
257258
} else {
258259
err_msg_dispose(&err TSRMLS_CC);
259260
ZVAL_FALSE(zmsg);
@@ -311,7 +312,7 @@ PHP_FUNCTION(socket_cmsg_space)
311312
}
312313

313314
#if HAVE_IPV6
314-
int php_do_setsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname, zval **arg4 TSRMLS_DC)
315+
int php_do_setsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname, zval *arg4 TSRMLS_DC)
315316
{
316317
struct err_s err = {0};
317318
zend_llist *allocations = NULL;
@@ -336,7 +337,7 @@ int php_do_setsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname,
336337
return 1;
337338
}
338339
#endif
339-
opt_ptr = from_zval_run_conversions(*arg4, php_sock, from_zval_write_in6_pktinfo,
340+
opt_ptr = from_zval_run_conversions(arg4, php_sock, from_zval_write_in6_pktinfo,
340341
sizeof(struct in6_pktinfo), "in6_pktinfo", &allocations, &err);
341342
if (err.has_error) {
342343
err_msg_dispose(&err TSRMLS_CC);
@@ -388,14 +389,14 @@ int php_do_getsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname,
388389
if (res != 0) {
389390
PHP_SOCKET_ERROR(php_sock, "unable to get socket option", errno);
390391
} else {
392+
zval tmp;
391393
zval *zv = to_zval_run_conversions(buffer, reader, "in6_pktinfo",
392-
empty_key_value_list, &err);
394+
empty_key_value_list, &err, &tmp);
393395
if (err.has_error) {
394396
err_msg_dispose(&err TSRMLS_CC);
395397
res = -1;
396398
} else {
397399
ZVAL_COPY_VALUE(result, zv);
398-
efree(zv);
399400
}
400401
}
401402
efree(buffer);

ext/sockets/sendrecvmsg.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ PHP_FUNCTION(socket_cmsg_space);
1212
void php_socket_sendrecvmsg_init(INIT_FUNC_ARGS);
1313
void php_socket_sendrecvmsg_shutdown(SHUTDOWN_FUNC_ARGS);
1414

15-
int php_do_setsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname, zval **arg4 TSRMLS_DC);
15+
int php_do_setsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname, zval *arg4 TSRMLS_DC);
1616
int php_do_getsockopt_ipv6_rfc3542(php_socket *php_sock, int level, int optname, zval *result TSRMLS_DC);
1717

1818
/* for conversions.c */

0 commit comments

Comments
 (0)