Skip to content

Commit f17de63

Browse files
committed
Convert resources to objects in ext/sockets
1 parent 226617d commit f17de63

29 files changed

+525
-486
lines changed

UPGRADING

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,18 @@ PHP 8.0 UPGRADE NOTES
399399
. ReflectionType::isBuiltin() method has been moved to ReflectionNamedType.
400400
ReflectionUnionType does not have it.
401401

402-
- Socket:
402+
- Sockets:
403403
. The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
404404
flags for socket_addrinfo_lookup() have been removed.
405+
. socket_create(), socket_create_listen(), socket_accept(),
406+
socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(),
407+
and socket_wsaprotocol_info_import() will now return a Socket object rather
408+
than a resource. Return value checks using is_resource() should be replaced
409+
with checks for `false`. The socket_close() function is deprecated and no
410+
longer has an effect, instead the Socket instance is automatically
411+
destroyed if it is no longer referenced.
412+
. socket_addrinfo_lookup() will now return an array of AddressInfo objects
413+
rather than resources.
405414

406415
- SPL:
407416
. SplFileObject::fgetss() has been removed.

ext/sockets/conversions.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,29 +1339,26 @@ static void from_zval_write_fd_array_aux(zval *elem, unsigned i, void **args, se
13391339
{
13401340
int *iarr = args[0];
13411341

1342-
if (Z_TYPE_P(elem) == IS_RESOURCE) {
1343-
php_stream *stream;
1344-
php_socket *sock;
1342+
if (Z_TYPE_P(elem) != IS_OBJECT || Z_OBJCE_P(elem) != socket_ce) {
1343+
php_socket *sock = Z_SOCKET_P(elem);
1344+
iarr[i] = sock->bsd_socket;
13451345

1346-
sock = (php_socket *)zend_fetch_resource_ex(elem, NULL, php_sockets_le_socket());
1347-
if (sock) {
1348-
iarr[i] = sock->bsd_socket;
1349-
return;
1350-
}
1346+
return;
1347+
} else if (Z_TYPE_P(elem) == IS_RESOURCE) {
1348+
php_stream *stream;
13511349

13521350
stream = (php_stream *)zend_fetch_resource2_ex(elem, NULL, php_file_le_stream(), php_file_le_pstream());
13531351
if (stream == NULL) {
1354-
do_from_zval_err(ctx, "resource is not a stream or a socket");
1352+
do_from_zval_err(ctx, "resource is not a stream");
13551353
return;
13561354
}
13571355

1358-
if (php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&iarr[i - 1],
1359-
REPORT_ERRORS) == FAILURE) {
1356+
if (php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&iarr[i - 1], REPORT_ERRORS) == FAILURE) {
13601357
do_from_zval_err(ctx, "cast stream to file descriptor failed");
13611358
return;
13621359
}
13631360
} else {
1364-
do_from_zval_err(ctx, "expected a resource variable");
1361+
do_from_zval_err(ctx, "expected a Socket object or a stream resource");
13651362
}
13661363
}
13671364
void from_zval_write_fd_array(const zval *arr, char *int_arr, ser_context *ctx)
@@ -1412,8 +1409,11 @@ void to_zval_read_fd_array(const char *data, zval *zv, res_context *ctx)
14121409
return;
14131410
}
14141411
if (S_ISSOCK(statbuf.st_mode)) {
1415-
php_socket *sock = socket_import_file_descriptor(fd);
1416-
ZVAL_RES(&elem, zend_register_resource(sock, php_sockets_le_socket()));
1412+
1413+
object_init_ex(&elem, socket_ce);
1414+
php_socket *sock = Z_SOCKET_P(&elem);
1415+
1416+
socket_import_file_descriptor(fd, sock);
14171417
} else {
14181418
php_stream *stream = php_stream_fopen_from_fd(fd, "rw", NULL);
14191419
php_stream_to_zval(stream, &elem);

ext/sockets/php_sockets.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,29 +52,33 @@ typedef int PHP_SOCKET;
5252
typedef SOCKET PHP_SOCKET;
5353
#endif
5454

55+
/* Socket class */
56+
5557
typedef struct {
5658
PHP_SOCKET bsd_socket;
5759
int type;
5860
int error;
5961
int blocking;
6062
zval zstream;
63+
zend_object std;
6164
} php_socket;
6265

66+
zend_class_entry *socket_ce;
67+
68+
static inline php_socket *socket_from_obj(zend_object *obj) {
69+
return (php_socket *)((char *)(obj) - XtOffsetOf(php_socket, std));
70+
}
71+
72+
#define Z_SOCKET_P(zv) socket_from_obj(Z_OBJ_P(zv))
73+
74+
6375
#ifdef PHP_WIN32
6476
struct sockaddr_un {
6577
short sun_family;
6678
char sun_path[108];
6779
};
6880
#endif
6981

70-
PHP_SOCKETS_API int php_sockets_le_socket(void);
71-
PHP_SOCKETS_API php_socket *php_create_socket(void);
72-
PHP_SOCKETS_API void php_destroy_socket(zend_resource *rsrc);
73-
PHP_SOCKETS_API void php_destroy_sockaddr(zend_resource *rsrc);
74-
75-
#define php_sockets_le_socket_name "Socket"
76-
#define php_sockets_le_addrinfo_name "AddressInfo"
77-
7882
#define PHP_SOCKET_ERROR(socket, msg, errn) \
7983
do { \
8084
int _err = (errn); /* save value to avoid repeated calls to WSAGetLastError() on Windows */ \
@@ -104,7 +108,7 @@ enum sockopt_return {
104108
};
105109

106110
char *sockets_strerror(int error);
107-
php_socket *socket_import_file_descriptor(PHP_SOCKET sock);
111+
int socket_import_file_descriptor(PHP_SOCKET socket, php_socket *retsock);
108112

109113
#else
110114
#define phpext_sockets_ptr NULL

ext/sockets/sendrecvmsg.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,13 @@ PHP_FUNCTION(socket_sendmsg)
172172
ssize_t res;
173173

174174
/* zmsg should be passed by ref */
175-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra|l", &zsocket, &zmsg, &flags) == FAILURE) {
175+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa|l", &zsocket, socket_ce, &zmsg, &flags) == FAILURE) {
176176
RETURN_THROWS();
177177
}
178178

179179
LONG_CHECK_VALID_INT(flags, 3);
180180

181-
if ((php_sock = (php_socket *)zend_fetch_resource(Z_RES_P(zsocket),
182-
php_sockets_le_socket_name, php_sockets_le_socket())) == NULL) {
183-
RETURN_THROWS();
184-
}
181+
php_sock = Z_SOCKET_P(zsocket);
185182

186183
msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_send,
187184
sizeof(*msghdr), "msghdr", &allocations, &err);
@@ -216,17 +213,13 @@ PHP_FUNCTION(socket_recvmsg)
216213
struct err_s err = {0};
217214

218215
//ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
219-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra|l",
220-
&zsocket, &zmsg, &flags) == FAILURE) {
216+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa|l", &zsocket, socket_ce, &zmsg, &flags) == FAILURE) {
221217
RETURN_THROWS();
222218
}
223219

224220
LONG_CHECK_VALID_INT(flags, 3);
225221

226-
if ((php_sock = (php_socket *)zend_fetch_resource(Z_RES_P(zsocket),
227-
php_sockets_le_socket_name, php_sockets_le_socket())) == NULL) {
228-
RETURN_THROWS();
229-
}
222+
php_sock = Z_SOCKET_P(zsocket);
230223

231224
msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_recv,
232225
sizeof(*msghdr), "msghdr", &allocations, &err);

0 commit comments

Comments
 (0)