jason Sat Aug 16 02:34:36 2003 EDT
Modified files:
/php-src/ext/sockets php_sockets.h php_sockets_win.c
php_sockets_win.h sockets.c
Log:
Remove all vector based functions for the following reasons:
- This solves alot of platform compatibility problems
- The possible security issue of allocating an incredibly large vector
pool is prevented
- They are of little to no benefit in a high level language
- 99% of all things done with these functions can be done using
sendto/recvfrom
Index: php-src/ext/sockets/php_sockets.h
diff -u php-src/ext/sockets/php_sockets.h:1.32 php-src/ext/sockets/php_sockets.h:1.33
--- php-src/ext/sockets/php_sockets.h:1.32 Tue Jun 17 00:44:30 2003
+++ php-src/ext/sockets/php_sockets.h Sat Aug 16 02:34:36 2003
@@ -22,7 +22,7 @@
#ifndef PHP_SOCKETS_H
#define PHP_SOCKETS_H
-/* $Id: php_sockets.h,v 1.32 2003/06/17 04:44:30 sterling Exp $ */
+/* $Id: php_sockets.h,v 1.33 2003/08/16 06:34:36 jason Exp $ */
#if HAVE_SOCKETS
@@ -44,12 +44,6 @@
PHP_RINIT_FUNCTION(sockets);
PHP_RSHUTDOWN_FUNCTION(sockets);
-PHP_FUNCTION(socket_iovec_alloc);
-PHP_FUNCTION(socket_iovec_free);
-PHP_FUNCTION(socket_iovec_set);
-PHP_FUNCTION(socket_iovec_fetch);
-PHP_FUNCTION(socket_iovec_add);
-PHP_FUNCTION(socket_iovec_delete);
PHP_FUNCTION(socket_select);
PHP_FUNCTION(socket_create_listen);
PHP_FUNCTION(socket_create_pair);
@@ -70,22 +64,11 @@
PHP_FUNCTION(socket_send);
PHP_FUNCTION(socket_recvfrom);
PHP_FUNCTION(socket_sendto);
-#ifdef HAVE_CMSGHDR
-PHP_FUNCTION(socket_recvmsg);
-#endif
-PHP_FUNCTION(socket_sendmsg);
-PHP_FUNCTION(socket_readv);
-PHP_FUNCTION(socket_writev);
PHP_FUNCTION(socket_get_option);
PHP_FUNCTION(socket_set_option);
PHP_FUNCTION(socket_shutdown);
PHP_FUNCTION(socket_last_error);
PHP_FUNCTION(socket_clear_error);
-
-typedef struct php_iovec {
- struct iovec *iov_array;
- unsigned int count;
-} php_iovec_t;
#ifndef PHP_WIN32
typedef int PHP_SOCKET;
Index: php-src/ext/sockets/php_sockets_win.c
diff -u php-src/ext/sockets/php_sockets_win.c:1.9
php-src/ext/sockets/php_sockets_win.c:1.10
--- php-src/ext/sockets/php_sockets_win.c:1.9 Sat Jul 19 14:32:04 2003
+++ php-src/ext/sockets/php_sockets_win.c Sat Aug 16 02:34:36 2003
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_sockets_win.c,v 1.9 2003/07/19 18:32:04 andrey Exp $ */
+/* $Id: php_sockets_win.c,v 1.10 2003/08/16 06:34:36 jason Exp $ */
#ifdef PHP_WIN32
@@ -30,78 +30,6 @@
#include "php.h"
#include "php_sockets.h"
#include "php_sockets_win.h"
-
-ssize_t readv(SOCKET sock, const struct iovec *iov, int iovcnt) {
- size_t bytes, remain, len, pos = 0;
- ssize_t retval;
- int i;
- char *buffer = NULL;
-
- for(bytes=0, i=0; i<iovcnt; i++) {
- bytes += iov[i].iov_len;
- }
-
- buffer = (char*)emalloc(bytes);
- if (buffer == NULL) {
- return -1;
- }
-
- retval = recv(sock, buffer, bytes, 0);
-
- if(retval < 0) {
- efree(buffer);
- return retval;
- }
-
- remain = bytes = (size_t) retval;
-
- for(i=0; i<iovcnt; i++) {
- len = ((unsigned int)iov[i].iov_len < remain) ? iov[i].iov_len :
remain;
- memcpy(iov[i].iov_base, buffer+pos, len);
- pos += len;
- remain -= len;
- }
-
- efree(buffer);
- return bytes;
-}
-
-ssize_t writev(SOCKET sock, const struct iovec *iov, int iovcnt) {
- size_t bytes, pos = 0;
- ssize_t retval;
- int i;
- char *buffer = NULL;
-
- for(bytes=0, i=0; i<iovcnt; i++) {
- bytes += iov[i].iov_len;
- }
-
- buffer = (char*)emalloc(bytes);
-
- if(buffer == NULL) {
- return -1;
- }
-
- for(i=0; i<iovcnt; i++) {
- memcpy(buffer+pos, iov[i].iov_base, iov[i].iov_len);
- pos += iov[i].iov_len;
- }
-
- retval = send(sock, buffer, bytes, 0);
- efree(buffer);
-
- return retval;
-}
-
-ssize_t recvmsg(SOCKET sock, struct msghdr *msg, int flags) {
- set_errno(WSAEOPNOTSUPP);
- return -1;
-}
-
-ssize_t sendmsg(SOCKET sock, struct msghdr *msg, int flags) {
- set_errno(WSAEOPNOTSUPP);
- return -1;
-}
int socketpair(int domain, int type, int protocol, SOCKET sock[2]) {
struct sockaddr_in address;
Index: php-src/ext/sockets/php_sockets_win.h
diff -u php-src/ext/sockets/php_sockets_win.h:1.8
php-src/ext/sockets/php_sockets_win.h:1.9
--- php-src/ext/sockets/php_sockets_win.h:1.8 Sat Jul 19 14:32:04 2003
+++ php-src/ext/sockets/php_sockets_win.h Sat Aug 16 02:34:36 2003
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_sockets_win.h,v 1.8 2003/07/19 18:32:04 andrey Exp $ */
+/* $Id: php_sockets_win.h,v 1.9 2003/08/16 06:34:36 jason Exp $ */
#ifdef PHP_WIN32
@@ -43,41 +43,12 @@
#define set_errno(a) WSASetLastError(a)
#define set_h_errno(a) WSASetLastError(a)
#define close(a) closesocket(a)
-#define CMSG_DATA(cmsg) ((cmsg)->cmsg_data)
-
-typedef int ssize_t;
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
-struct iovec {
- char * iov_base;
- int iov_len;
-};
-
-struct msghdr {
- void* msg_name;
- socklen_t msg_namelen;
- struct iovec* msg_iov;
- int msg_iovlen;
- void* msg_control;
- socklen_t msg_controllen;
- int msg_flags;
-};
-
-struct cmsghdr {
- socklen_t cmsg_len;
- int cmsg_level;
- int cmsg_type;
- unsigned char cmsg_data[];
-};
-
-ssize_t readv(SOCKET sock, const struct iovec *iov, int iovcnt);
-ssize_t writev(SOCKET sock, const struct iovec *iov, int iovcnt);
-ssize_t recvmsg(SOCKET sock, struct msghdr *msg, int flags);
-ssize_t sendmsg(SOCKET sock, struct msghdr *msg, int flags);
int socketpair(int domain, int type, int protocol, SOCKET sock[2]);
int inet_aton(const char *cp, struct in_addr *inp);
int fcntl(int fd, int cmd, ...);
Index: php-src/ext/sockets/sockets.c
diff -u php-src/ext/sockets/sockets.c:1.150 php-src/ext/sockets/sockets.c:1.151
--- php-src/ext/sockets/sockets.c:1.150 Mon Aug 11 20:55:55 2003
+++ php-src/ext/sockets/sockets.c Sat Aug 16 02:34:36 2003
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sockets.c,v 1.150 2003/08/12 00:55:55 iliaa Exp $ */
+/* $Id: sockets.c,v 1.151 2003/08/16 06:34:36 jason Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -29,13 +29,6 @@
#if HAVE_SOCKETS
-#ifndef _XOPEN_SOURCE_EXTENDED
-#define _XOPEN_SOURCE_EXTENDED
-#endif
-
-#define _XPG4_2
-#define __EXTENSIONS__
-
#include "php_network.h"
#include "ext/standard/info.h"
#include "php_ini.h"
@@ -91,8 +84,6 @@
SOCKETS_G(last_error) = errn; \
php_error_docref(NULL TSRMLS_CC,
E_WARNING, "%s [%d]: %s", msg, errn, php_strerror(errn TSRMLS_CC))
-static int le_iov;
-#define le_iov_name "Socket I/O vector"
static int le_socket;
#define le_socket_name "Socket"
@@ -134,12 +125,6 @@
/* {{{ sockets_functions[]
*/
function_entry sockets_functions[] = {
- PHP_FE(socket_iovec_alloc, NULL)
- PHP_FE(socket_iovec_free, NULL)
- PHP_FE(socket_iovec_set, NULL)
- PHP_FE(socket_iovec_fetch, NULL)
- PHP_FE(socket_iovec_add, NULL)
- PHP_FE(socket_iovec_delete, NULL)
PHP_FE(socket_select, first_through_third_args_force_ref)
PHP_FE(socket_create, NULL)
PHP_FE(socket_create_listen, NULL)
@@ -160,12 +145,6 @@
PHP_FE(socket_send, NULL)
PHP_FE(socket_recvfrom, second_fifth_and_sixth_args_force_ref)
PHP_FE(socket_sendto, NULL)
-#ifdef HAVE_CMSGHDR
- PHP_FE(socket_recvmsg, third_through_seventh_args_force_ref)
-#endif
- PHP_FE(socket_sendmsg, NULL)
- PHP_FE(socket_readv, NULL)
- PHP_FE(socket_writev, NULL)
PHP_FE(socket_get_option, NULL)
PHP_FE(socket_set_option, NULL)
PHP_FE(socket_shutdown, NULL)
@@ -201,21 +180,6 @@
/* inet_ntop should be used instead of inet_ntoa */
int inet_ntoa_lock = 0;
-static void php_destroy_iovec(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- unsigned int i;
- php_iovec_t *iov = (php_iovec_t *) rsrc->ptr;
-
- if (iov->count && iov->iov_array) {
- for (i = 0; i < iov->count; i++) {
- efree(iov->iov_array[i].iov_base);
- }
-
- efree(iov->iov_array);
- efree(iov);
- }
-}
-
static void php_destroy_socket(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
php_socket *php_sock = (php_socket *) rsrc->ptr;
@@ -480,7 +444,6 @@
ZEND_INIT_MODULE_GLOBALS(sockets, php_sockets_init_globals, NULL);
le_socket = zend_register_list_destructors_ex(php_destroy_socket, NULL,
le_socket_name, module_number);
- le_iov = zend_register_list_destructors_ex(php_destroy_iovec, NULL,
le_iov_name, module_number);
REGISTER_LONG_CONSTANT("AF_UNIX", AF_UNIX,
CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("AF_INET", AF_INET,
CONST_CS | CONST_PERSISTENT);
@@ -1255,229 +1218,6 @@
}
/* }}} */
-/* {{{ proto resource socket_iovec_alloc(int num_vectors [, int ...])
- Builds a 'struct iovec' for use with sendmsg, recvmsg, writev, and readv */
-/* First parameter is number of vectors, each additional parameter is the
- length of the vector to create.
- */
-PHP_FUNCTION(socket_iovec_alloc)
-{
- zval ***args = (zval ***)NULL;
- php_iovec_t *vector;
- struct iovec *vector_array;
- int i, j, num_vectors, argc = ZEND_NUM_ARGS();
-
- args = safe_emalloc(argc, sizeof(zval**), 0);
-
- if (argc < 1 || zend_get_parameters_array_ex(argc, args) == FAILURE) {
- efree(args);
- WRONG_PARAM_COUNT;
- }
-
- convert_to_long_ex(args[0]);
- num_vectors = Z_LVAL_PP(args[0]);
-
- vector_array = safe_emalloc(sizeof(struct iovec), (num_vectors+1), 0);
-
- for (i = 0, j = 1; i < num_vectors; i++, j++) {
- convert_to_long_ex(args[j]);
-
- vector_array[i].iov_base = (char*)emalloc(Z_LVAL_PP(args[j]));
- vector_array[i].iov_len = Z_LVAL_PP(args[j]);
- }
-
- efree(args);
-
- vector = emalloc(sizeof(php_iovec_t));
- vector->iov_array = vector_array;
- vector->count = num_vectors;
-
- ZEND_REGISTER_RESOURCE(return_value, vector, le_iov);
-}
-/* }}} */
-
-/* {{{ proto string socket_iovec_fetch(resource iovec, int iovec_position)
- Returns the data held in the iovec specified by iovec_id[iovec_position] */
-PHP_FUNCTION(socket_iovec_fetch)
-{
- zval *iovec_id;
- php_iovec_t *vector;
- unsigned long iovec_position;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &iovec_id,
&iovec_position) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &iovec_id, -1, le_iov_name, le_iov);
-
- if (iovec_position >= vector->count) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "can't access a vector
position past the amount of vectors set in the array");
- RETURN_EMPTY_STRING();
- }
-
- RETURN_STRINGL(vector->iov_array[iovec_position].iov_base,
vector->iov_array[iovec_position].iov_len, 1);
-}
-/* }}} */
-
-/* {{{ proto bool socket_iovec_set(resource iovec, int iovec_position, string new_val)
- Sets the data held in iovec_id[iovec_position] to new_val */
-PHP_FUNCTION(socket_iovec_set)
-{
- zval *iovec_id;
- php_iovec_t *vector;
- int new_val_len;
- unsigned long iovec_position;
- char *new_val;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rls", &iovec_id,
&iovec_position, &new_val, &new_val_len) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &iovec_id, -1, le_iov_name, le_iov);
-
- if (iovec_position >= vector->count) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "can't access a vector
position outside of the vector array bounds");
- RETURN_FALSE;
- }
-
- if (vector->iov_array[iovec_position].iov_base) {
- efree(vector->iov_array[iovec_position].iov_base);
- }
-
- vector->iov_array[iovec_position].iov_base = estrdup(new_val);
- vector->iov_array[iovec_position].iov_len = strlen(new_val);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool socket_iovec_add(resource iovec, int iov_len)
- Adds a new vector to the scatter/gather array */
-PHP_FUNCTION(socket_iovec_add)
-{
- zval *iovec_id;
- php_iovec_t *vector;
- struct iovec *vector_array;
- long iov_len;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &iovec_id,
&iov_len) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &iovec_id, -1, le_iov_name, le_iov);
-
- vector_array = (struct iovec*)safe_emalloc(sizeof(struct iovec),
(vector->count + 2), 0);
- memcpy(vector_array, vector->iov_array, sizeof(struct iovec) * vector->count);
-
- vector_array[vector->count].iov_base = (char*)emalloc(iov_len);
- vector_array[vector->count].iov_len = iov_len;
- efree(vector->iov_array);
- vector->iov_array = vector_array;
- vector->count++;
-
- RETURN_TRUE;
-}
-
-/* }}} */
-
-/* {{{ proto bool socket_iovec_delete(resource iovec, int iov_pos)
- Deletes a vector from an array of vectors */
-PHP_FUNCTION(socket_iovec_delete)
-{
- zval *iovec_id;
- php_iovec_t *vector;
- struct iovec *vector_array;
- unsigned int i;
- unsigned long iov_pos;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &iovec_id,
&iov_pos) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &iovec_id, -1, le_iov_name, le_iov);
-
- if (iov_pos > vector->count) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "can't delete an IO vector
that is out of array bounds");
- RETURN_FALSE;
- }
-
- vector_array = safe_emalloc(vector->count, sizeof(struct iovec), 0);
-
- for (i = 0; i < vector->count; i++) {
- if (i < iov_pos) {
- memcpy(&(vector->iov_array[i]), &(vector_array[i]),
sizeof(struct iovec));
- } else if (i > iov_pos) {
- memcpy(&(vector->iov_array[i]), &(vector_array[i - 1]),
sizeof(struct iovec));
- }
- }
-
- efree(vector->iov_array);
- vector->iov_array = vector_array;
-
- RETURN_TRUE;
-}
-
-/* }}} */
-
-/* {{{ proto bool socket_iovec_free(resource iovec)
- Frees the iovec specified by iovec_id */
-PHP_FUNCTION(socket_iovec_free)
-{
- zval *iovec_id;
- php_iovec_t *vector;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &iovec_id) ==
FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &iovec_id, -1, le_iov_name, le_iov);
-
- zend_list_delete(Z_RESVAL_P(iovec_id));
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool socket_readv(resource socket, resource iovec_id)
- Reads from an fd, using the scatter-gather array defined by iovec_id */
-PHP_FUNCTION(socket_readv)
-{
- zval *arg1, *arg2;
- php_iovec_t *vector;
- php_socket *php_sock;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &arg1, &arg2) ==
FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name,
le_socket);
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &arg2, -1, le_iov_name, le_iov);
-
- if (readv(php_sock->bsd_socket, vector->iov_array, vector->count) != 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to read from socket", errno);
- RETURN_FALSE;
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool socket_writev(resource socket, resource iovec_id)
- Writes to a file descriptor, fd, using the scatter-gather array defined by
iovec_id */
-PHP_FUNCTION(socket_writev)
-{
- zval *arg1, *arg2;
- php_iovec_t *vector;
- php_socket *php_sock;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &arg1, &arg2) ==
FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name,
le_socket);
- ZEND_FETCH_RESOURCE(vector, php_iovec_t *, &arg2, -1, le_iov_name, le_iov);
-
- if (writev(php_sock->bsd_socket, vector->iov_array, vector->count) != 0) {
- PHP_SOCKET_ERROR(php_sock, "Unable to write to socket", errno);
- RETURN_FALSE;
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
/* {{{ proto int socket_recv(resource socket, string &buf, int len, int flags)
Receives data from a connected socket */
PHP_FUNCTION(socket_recv)
@@ -1730,334 +1470,6 @@
}
RETURN_LONG(retval);
-}
-/* }}} */
-
-/* {{{ proto bool socket_recvmsg(resource socket, resource iovec, array &control, int
&controllen, int &flags, string &addr [, int &port])
- Used to receive messages on a socket, whether connection-oriented or not */
-#ifdef HAVE_CMSGHDR
-PHP_FUNCTION(socket_recvmsg)
-{
- zval *arg1, *arg2, *arg3, *arg4, *arg5,
*arg6, *arg7 = NULL;
- php_iovec_t *iov;
- struct msghdr hdr;
- php_sockaddr_storage sa_storage;
- php_socket *php_sock;
- struct cmsghdr *ctl_buf;
- struct sockaddr *sa = (struct sockaddr *) &sa_storage;
- struct sockaddr_in *sin = (struct sockaddr_in *) sa;
-#ifdef HAVE_IPV6
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
-#endif
- struct sockaddr_un *s_un = (struct sockaddr_un *) sa;
- socklen_t salen = sizeof(sa_storage);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrzzzz|z", &arg1, &arg2,
&arg3, &arg4, &arg5, &arg6, &arg7) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name,
le_socket);
- ZEND_FETCH_RESOURCE(iov, php_iovec_t *, &arg2, -1, le_iov_name, le_iov);
-
- if (getsockname(php_sock->bsd_socket, sa, &salen) != 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to receive message", errno);
- RETURN_FALSE;
- }
-
- ctl_buf = (Z_LVAL_P(arg4) > sizeof(struct cmsghdr)) ? (struct
cmsghdr*)emalloc(Z_LVAL_P(arg4)) : NULL;
-
- switch (sa->sa_family) {
-#ifdef HAVE_IPV6
- case AF_INET6:
-
- if (arg7 == NULL) {
- efree(ctl_buf);
- WRONG_PARAM_COUNT;
- }
-
- memset(sa, 0, sizeof(sa_storage));
- hdr.msg_name = (void *) sin6;
- hdr.msg_namelen = sizeof(sa_storage);
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- hdr.msg_control = ctl_buf ? (void *) ctl_buf : NULL;
- hdr.msg_controllen = ctl_buf ? Z_LVAL_P(arg4) : 0;
-#ifndef MISSING_MSGHDR_MSGFLAGS
- hdr.msg_flags = 0;
-#endif
-
- if (recvmsg(php_sock->bsd_socket, &hdr, Z_LVAL_P(arg5)) < 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to receive
message", errno);
- RETURN_FALSE;
- } else {
- struct cmsghdr *mhdr = (struct cmsghdr *)
hdr.msg_control;
-
- zval_dtor(arg3);
- zval_dtor(arg4);
- zval_dtor(arg5);
- zval_dtor(arg6);
- zval_dtor(arg7);
-
- ZVAL_LONG(arg4, hdr.msg_controllen);
-#ifndef MISSING_MSGHDR_MSGFLAGS
- ZVAL_LONG(arg5, hdr.msg_flags);
-#endif
- ZVAL_LONG(arg7, ntohs(sin6->sin6_port));
-
- array_init(arg3);
-
- if (mhdr != NULL) {
- add_assoc_long(arg3, "cmsg_level",
mhdr->cmsg_level);
- add_assoc_long(arg3, "cmsg_type",
mhdr->cmsg_type);
- add_assoc_string(arg3, "cmsg_data",
CMSG_DATA(mhdr), 1);
- }
-
- {
- char tmp[INET6_ADDRSTRLEN+1];
- if (inet_ntop(AF_INET6, &sin6->sin6_addr, tmp,
INET6_ADDRSTRLEN)) {
- ZVAL_STRING(arg6, tmp, 1);
- } else {
- ZVAL_STRING(arg6, "::", 1);
- }
- }
-
- RETURN_TRUE;
- }
- break;
-#endif
- case AF_INET:
-
- if (arg7 == NULL) {
- efree(ctl_buf);
- WRONG_PARAM_COUNT;
- }
-
- memset(sa, 0, sizeof(sa_storage));
- hdr.msg_name = (void *) sin;
- hdr.msg_namelen = sizeof(sa_storage);
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- hdr.msg_control = ctl_buf ? (void *) ctl_buf : NULL;
- hdr.msg_controllen = ctl_buf ? Z_LVAL_P(arg4) : 0;
-#ifndef MISSING_MSGHDR_MSGFLAGS
- hdr.msg_flags = 0;
-#endif
-
- if (recvmsg(php_sock->bsd_socket, &hdr, Z_LVAL_P(arg5)) < 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to receive
message", errno);
- RETURN_FALSE;
- } else {
- struct cmsghdr *mhdr = (struct cmsghdr *)
hdr.msg_control;
-
- zval_dtor(arg3);
- zval_dtor(arg4);
- zval_dtor(arg5);
- zval_dtor(arg6);
- zval_dtor(arg7);
-
- ZVAL_LONG(arg4, hdr.msg_controllen);
-#ifndef MISSING_MSGHDR_MSGFLAGS
- ZVAL_LONG(arg5, hdr.msg_flags);
-#endif
- ZVAL_LONG(arg7, ntohs(sin->sin_port));
-
- array_init(arg3);
-
- if (mhdr != NULL) {
- add_assoc_long(arg3, "cmsg_level",
mhdr->cmsg_level);
- add_assoc_long(arg3, "cmsg_type",
mhdr->cmsg_type);
- add_assoc_string(arg3, "cmsg_data",
CMSG_DATA(mhdr), 1);
- }
-
- {
- char *tmp = inet_ntoa(sin->sin_addr);
- if (tmp == NULL) {
- ZVAL_STRING(arg6, "0.0.0.0", 1);
- } else {
- ZVAL_STRING(arg6, tmp, 1);
- }
- }
-
- RETURN_TRUE;
- }
- break;
-
- case AF_UNIX:
- memset(sa, 0, sizeof(sa_storage));
- hdr.msg_name = (void *) s_un;
- hdr.msg_namelen = sizeof(struct sockaddr_un);
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- if (ctl_buf) {
- hdr.msg_control = (void *) ctl_buf;
- hdr.msg_controllen = Z_LVAL_P(arg4);
- } else {
- hdr.msg_control = NULL;
- hdr.msg_controllen = 0;
- }
-#ifndef MISSING_MSGHDR_MSGFLAGS
- hdr.msg_flags = 0;
-#endif
-
-
- if (recvmsg(php_sock->bsd_socket, &hdr, Z_LVAL_P(arg5)) != 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to receive message", errno);
- RETURN_FALSE;
- } else {
- struct cmsghdr *mhdr = (struct cmsghdr *) hdr.msg_control;
-
- if (mhdr != NULL) {
-
- zval_dtor(arg3);
- zval_dtor(arg4);
- zval_dtor(arg5);
- zval_dtor(arg6);
-
- ZVAL_LONG(arg4, hdr.msg_controllen);
-#ifndef MISSING_MSGHDR_MSGFLAGS
- ZVAL_LONG(arg5, hdr.msg_flags);
-#endif
-
- array_init(arg3);
-
- add_assoc_long(arg3, "cmsg_level", mhdr->cmsg_level);
- add_assoc_long(arg3, "cmsg_type", mhdr->cmsg_type);
- add_assoc_string(arg3, "cmsg_data", CMSG_DATA(mhdr),
1);
- }
-
-
- ZVAL_STRING(arg6, s_un->sun_path, 1);
- RETURN_TRUE;
- }
- break;
-
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported address
family %d", sa->sa_family);
- RETURN_FALSE;
- }
-}
-#endif
-/* }}} */
-
-/* {{{ proto bool socket_sendmsg(resource socket, resource iovec, int flags, string
addr [, int port])
- Sends a message to a socket, regardless of whether it is connection-oriented or
not */
-PHP_FUNCTION(socket_sendmsg)
-{
- zval *arg1, *arg2;
- php_iovec_t *iov;
- php_socket *php_sock;
- struct sockaddr sa;
- char *addr;
- socklen_t salen;
- int addr_len;
- long flags, port;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrls|l", &arg1, &arg2,
&flags, &addr, &addr_len, &port) == FAILURE)
- return;
-
- ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name,
le_socket);
- ZEND_FETCH_RESOURCE(iov, php_iovec_t *, &arg2, -1, le_iov_name, le_iov);
-
- salen = sizeof(sa);
- if (getsockname(php_sock->bsd_socket, &sa, &salen) != 0) {
- PHP_SOCKET_ERROR(php_sock, "unable to send messge", errno);
- RETURN_FALSE;
- }
-
- switch(sa.sa_family) {
-#ifdef HAVE_IPV6
- case AF_INET6:
- {
- struct msghdr hdr;
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
&sa;
-
- set_h_errno(0);
- set_errno(0);
-
- memset(&hdr, 0, sizeof(hdr));
- hdr.msg_name = (void *) &sa;
- hdr.msg_namelen = sizeof(sa);
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- memset(sin6, 0, sizeof(sa));
-
- sin6->sin6_family = AF_INET6;
- sin6->sin6_port = htons((unsigned short)port);
-
- if (! php_set_inet6_addr(sin6, addr, php_sock
TSRMLS_CC)) {
- RETURN_FALSE;
- }
-
- if (sendmsg(php_sock->bsd_socket, &hdr, flags) == -1) {
- PHP_SOCKET_ERROR(php_sock, "unable to send
message", errno);
- }
-
- RETURN_TRUE;
- }
- break;
-#endif
- case AF_INET:
- {
- struct msghdr hdr;
- struct sockaddr_in *sin = (struct sockaddr_in *) &sa;
-
- set_h_errno(0);
- set_errno(0);
-
- memset(&hdr, 0, sizeof(hdr));
- hdr.msg_name = (void *) &sa;
- hdr.msg_namelen = sizeof(sa);
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- memset(sin, 0, sizeof(sa));
-
- sin->sin_family = AF_INET;
- sin->sin_port = htons((unsigned short)port);
-
- if (! php_set_inet_addr(sin, addr, php_sock
TSRMLS_CC)) {
- RETURN_FALSE;
- }
-
- if (sendmsg(php_sock->bsd_socket, &hdr, flags) == -1) {
- PHP_SOCKET_ERROR(php_sock, "unable to send
message", errno);
- }
-
- RETURN_TRUE;
- }
- break;
-
- case AF_UNIX:
- {
- struct msghdr hdr;
- struct sockaddr_un *s_un = (struct sockaddr_un *) &sa;
-
- set_errno(0);
-
- hdr.msg_name = (void *) s_un;
- hdr.msg_iov = iov->iov_array;
- hdr.msg_iovlen = iov->count;
-
- snprintf(s_un->sun_path, 108, "%s", addr);
-
- hdr.msg_namelen = SUN_LEN(s_un);
-
- if (sendmsg(php_sock->bsd_socket, &hdr, flags) == -1) {
- PHP_SOCKET_ERROR(php_sock, "unable to send
message", errno);
- RETURN_FALSE;
- }
-
- RETURN_TRUE;
- }
- break;
-
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported
address family %d", sa.sa_family);
- RETURN_FALSE;
- }
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php