22#if defined(PHP_WIN32) || defined(__riscos__)
31# define MSG_DONTWAIT 0
40# define XP_SOCK_BUF_SIZE(sz) (((sz) > INT_MAX) ? INT_MAX : (int)(sz))
42# define XP_SOCK_BUF_SIZE(sz) (sz)
54static int php_tcp_sockop_set_option(
php_stream *stream,
int option,
int value,
void *ptrparam);
61 struct timeval *ptimeout;
63 if (!sock || sock->socket == -1) {
67 if (sock->timeout.tv_sec == -1)
70 ptimeout = &sock->timeout;
80 if (sock->is_blocked) {
83 sock->timeout_event = 0;
89 sock->timeout_event = 1;
99 }
while (
err == EINTR);
126 struct timeval *ptimeout, zero_timeout;
128 if (!sock || sock->
socket == -1) {
134 if (has_buffered_data) {
136 zero_timeout.tv_sec = 0;
137 zero_timeout.tv_usec = 0;
138 ptimeout = &zero_timeout;
139 }
else if (sock->
timeout.tv_sec == -1) {
163 if (!sock || sock->
socket == -1) {
173 bool dont_wait = has_buffered_data ||
177 if (dont_wait || sock->
timeout.tv_sec != -1) {
183 php_sock_stream_wait_for_data(stream, sock, has_buffered_data);
186 return has_buffered_data ? 0 : -1;
200 }
else if (nr_bytes == 0) {
212static int php_sockop_close(
php_stream *stream,
int close_handle)
255static int php_sockop_flush(
php_stream *stream)
298 int want_addr = textaddr ||
addr;
307 if (
ret == -1 && WSAGetLastError() == WSAEMSGSIZE) {
313 textaddr,
addr, addrlen);
331static int php_sockop_set_option(
php_stream *stream,
int option,
int value,
void *ptrparam)
349 if (sock->
timeout.tv_sec == -1) {
350 tv.tv_sec =
FG(default_socket_timeout);
381 }
else if (0 >
ret) {
401 sock->
timeout = *(
struct timeval*)ptrparam;
408 add_assoc_bool((
zval *)ptrparam,
"eof", stream->
eof);
414 switch (xparam->
op) {
415 case STREAM_XPORT_OP_LISTEN:
419 case STREAM_XPORT_OP_GET_NAME:
427 case STREAM_XPORT_OP_GET_PEER_NAME:
435 case STREAM_XPORT_OP_SEND:
453 case STREAM_XPORT_OP_RECV:
481 case STREAM_XPORT_OP_SHUTDOWN: {
497static int php_sockop_cast(
php_stream *stream,
int castas,
void **
ret)
533 php_sockop_write, php_sockop_read,
534 php_sockop_close, php_sockop_flush,
539 php_sockop_set_option,
544 php_sockop_write, php_sockop_read,
545 php_sockop_close, php_sockop_flush,
550 php_tcp_sockop_set_option,
554 php_sockop_write, php_sockop_read,
555 php_sockop_close, php_sockop_flush,
560 php_tcp_sockop_set_option,
565 php_sockop_write, php_sockop_read,
566 php_sockop_close, php_sockop_flush,
571 php_tcp_sockop_set_option,
574 php_sockop_write, php_sockop_read,
575 php_sockop_close, php_sockop_flush,
580 php_tcp_sockop_set_option,
590 memset(unix_addr, 0,
sizeof(*unix_addr));
591 unix_addr->sun_family =
AF_UNIX;
596 unsigned long max_length = is_abstract_ns ?
sizeof(unix_addr->sun_path) :
sizeof(unix_addr->sun_path) - 1;
606 xparam->inputs.namelen = max_length;
607 php_error_docref(NULL, E_NOTICE,
608 "socket path exceeded the maximum allowed length of %lu bytes "
609 "and was truncated", max_length);
618static inline char *parse_ip_address_ex(
const char *str,
size_t str_len,
int *portno,
int get_err,
zend_string **
err)
626 if (*(str) ==
'[' && str_len > 1) {
628 p = memchr(str + 1,
']', str_len - 2);
629 if (!
p || *(
p + 1) !=
':') {
631 *
err =
strpprintf(0,
"Failed to parse IPv6 address \"%s\"", str);
635 *portno = atoi(
p + 2);
640 colon = memchr(str,
':', str_len - 1);
645 *portno = atoi(colon + 1);
671 if (stream->
ops == &php_stream_unix_socket_ops || stream->
ops == &php_stream_unixdg_socket_ops) {
672 struct sockaddr_un unix_addr;
679 stream->
ops == &php_stream_unix_socket_ops ?
"" :
"datagram",
685 parse_unix_address(xparam, &unix_addr);
687 return bind(sock->
socket, (
const struct sockaddr *)&unix_addr,
692 host = parse_ip_address(xparam, &portno);
718 if (stream->
ops == &php_stream_udp_socket_ops
738 return sock->
socket == -1 ? -1 : 0;
745 int portno, bindport = 0;
752 if (stream->
ops == &php_stream_unix_socket_ops || stream->
ops == &php_stream_unixdg_socket_ops) {
753 struct sockaddr_un unix_addr;
764 parse_unix_address(xparam, &unix_addr);
778 host = parse_ip_address(xparam, &portno);
796 if (stream->
ops == &php_stream_udp_socket_ops
805 if (stream->
ops != &php_stream_udp_socket_ops
807 && stream->
ops != &php_stream_unix_socket_ops
808 && stream->
ops != &php_stream_unixdg_socket_ops
823 xparam->
op == STREAM_XPORT_OP_CONNECT_ASYNC,
881 memcpy(clisockdata, sock,
sizeof(*clisockdata));
882 clisockdata->
socket = clisock;
900static int php_tcp_sockop_set_option(
php_stream *stream,
int option,
int value,
void *ptrparam)
910 case STREAM_XPORT_OP_CONNECT:
911 case STREAM_XPORT_OP_CONNECT_ASYNC:
915 case STREAM_XPORT_OP_BIND:
920 case STREAM_XPORT_OP_ACCEPT:
928 return php_sockop_set_option(stream, option,
value, ptrparam);
933 const char *resourcename,
size_t resourcenamelen,
935 struct timeval *timeout,
943 if (
strncmp(proto,
"tcp", protolen) == 0) {
945 }
else if (
strncmp(proto,
"udp", protolen) == 0) {
946 ops = &php_stream_udp_socket_ops;
949 else if (
strncmp(proto,
"unix", protolen) == 0) {
950 ops = &php_stream_unix_socket_ops;
951 }
else if (
strncmp(proto,
"udg", protolen) == 0) {
952 ops = &php_stream_unixdg_socket_ops;
964 sock->
timeout.tv_sec =
FG(default_socket_timeout);
973 if (stream ==
NULL) {
974 pefree(sock, persistent_id ? 1 : 0);
sizeof(Countable|array $value, int $mode=COUNT_NORMAL)
count(Countable|array $value, int $mode=COUNT_NORMAL)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
const php_stream_filter_ops * ops
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHPAPI zend_result php_set_sock_blocking(php_socket_t socketd, bool block)
PHPAPI int php_network_connect_socket(php_socket_t sockfd, const struct sockaddr *addr, socklen_t addrlen, int asynchronous, struct timeval *timeout, zend_string **error_string, int *error_code)
PHPAPI char * php_socket_strerror(long err, char *buf, size_t bufsize)
PHPAPI void php_network_populate_name_from_sockaddr(struct sockaddr *sa, socklen_t sl, zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen)
PHPAPI int php_network_get_sock_name(php_socket_t sock, zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen)
PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen, struct timeval *timeout, zend_string **error_string, int *error_code, int tcp_nodelay)
php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port, int socktype, int asynchronous, struct timeval *timeout, zend_string **error_string, int *error_code, const char *bindto, unsigned short bindport, long sockopts)
php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port, int socktype, long sockopts, zend_string **error_string, int *error_code)
PHPAPI int php_network_get_peer_name(php_socket_t sock, zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen)
PHP_JSON_API size_t int options
struct _php_netstream_data_t php_netstream_data_t
#define STREAM_SOCKOP_IPV6_V6ONLY
const php_stream_ops php_stream_generic_socket_ops
#define STREAM_SOCKOP_IPV6_V6ONLY_ENABLED
#define STREAM_SOCKOP_TCP_NODELAY
#define STREAM_SOCKOP_SO_BROADCAST
PHPAPI const php_stream_ops php_stream_socket_ops
#define STREAM_SOCKOP_NONE
#define php_socket_errno()
#define PHP_IS_TRANSIENT_ERROR(err)
#define STREAM_SOCKOP_SO_REUSEPORT
#define php_stream_notify_progress_increment(context, dsofar, dmax)
PHPAPI zval * php_stream_context_get_option(php_stream_context *context, const char *wrappername, const char *optionname)
PHPAPI php_stream_transport_factory_func php_stream_generic_socket_factory
struct _php_stream_xport_param php_stream_xport_param
struct _php_stream php_stream
struct _php_stream_context php_stream_context
#define PHP_STREAM_OPTION_BLOCKING
#define PHP_STREAM_AS_FD_FOR_SELECT
#define php_stream_alloc_rel(ops, thisptr, persistent, mode)
#define PHP_STREAM_OPTION_XPORT_API
#define PHP_STREAM_FLAG_NO_IO
#define PHP_STREAM_OPTION_RETURN_NOTIMPL
#define PHP_STREAM_FLAG_SUPPRESS_ERRORS
#define PHP_STREAM_CONTEXT(stream)
#define php_stream_is_persistent(stream)
#define PHP_STREAM_OPTION_READ_TIMEOUT
struct _php_stream_ops php_stream_ops
#define PHP_STREAM_OPTION_META_DATA_API
#define PHP_STREAM_OPTION_RETURN_ERR
#define PHP_STREAM_OPTION_CHECK_LIVENESS
#define PHP_STREAM_AS_SOCKETD
#define PHP_STREAM_OPTION_RETURN_OK
#define PHP_STREAM_AS_STDIO
struct _php_stream_statbuf php_stream_statbuf
struct _php_stream_xport_param::@015355061030136034370173273234023140274215071026 inputs
struct _php_stream_xport_param::@000113327003134033162122300162113175151127354335 outputs
enum _php_stream_xport_param::@374135164235347147303334377011004260152245232316 op
unsigned int want_textaddr
unsigned int want_errortext
const php_stream_ops * ops
uint16_t has_buffered_data
#define XP_SOCK_BUF_SIZE(sz)
#define estrndup(s, length)
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
strncmp(string $string1, string $string2, int $length)
struct _zend_string zend_string
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
#define XtOffsetOf(s_type, field)
#define ZSTR_EMPTY_ALLOC()
#define Z_STRVAL_P(zval_p)
#define Z_STRLEN_P(zval_p)