Re: socket_create() doesn't expose error if one occurs [CVS HEAD]
| From: | Jason Greene | Date: | Mon, 29 Apr 2002 14:27:36 +0000 |
| Subject: | Re: socket_create() doesn't expose error if one occurs [CVS HEAD] | ||
| References: | 1 2 3 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-83492@lists.php.net to get a copy of this message | ||
The patch looks good to me, go ahead and apply it.
Thanks,
-Jason
On Mon, 2002-04-29 at 04:02, Markus Fischer wrote:
> Hi,
>
> attached is the patch I intend to commit later this day:
>
> - Stores last errno in a module global implicitely
> - Sets global last error explicitely for socket_select() and
> socket_create()
> - Modified socket_last_error() to return global modules last
> error if no socket resource is given
> - Added a couple of more E_WARNING messages in case something
> goes foobar so the user isn't left alone in the dark.
>
> regards,
> - Markus
>
> On Sun, Apr 28, 2002 at 10:53:42PM -0500, Jason Greene wrote :
> > This was something I was planning on adding, but it was not applied to
> > the 4.2.0 branch, because it introduces a feature enhancement (storing a
> > global last error) and not a bug fix. It is a very simple enhance, I
> > just have not had the time to work on it yet.
> >
> > -Jason
>
> --
> Please always Cc to me when replying to me on the lists.
> GnuPG Key: http://guru.josefine.at/~mfischer/C2272BD0.asc
> "Mind if I MFH ?" "What QA did you do on it?" "the usual?"
> "ah... none :)"
> ----
>
> ? sockets.diff
> Index: php_sockets.h
> ===================================================================
> RCS file: /repository/php4/ext/sockets/php_sockets.h,v
> retrieving revision 1.22
> diff -u -r1.22 php_sockets.h
> --- php_sockets.h 6 Mar 2002 20:19:09 -0000 1.22
> +++ php_sockets.h 29 Apr 2002 08:56:25 -0000
> @@ -102,12 +102,14 @@
> int accept_connect(php_socket *in_sock, php_socket **new_sock, struct sockaddr *la TSRMLS_DC);
> int php_read(int bsd_socket, void *buf, int maxlen);
>
> +ZEND_BEGIN_MODULE_GLOBALS(sockets)
> + int last_error;
> +ZEND_END_MODULE_GLOBALS(sockets)
> +
> #ifdef ZTS
> -#define SOCKETSG(v) (sockets_globals->v)
> -#define SOCKETSLS_FETCH() php_sockets_globals *sockets_globals =
> ts_resource(sockets_globals_id)
> +#define SOCKETS_G(v) TSRMG(sockets_globals_id, zend_sockets_globals *, v)
> #else
> -#define SOCKETSG(v) (sockets_globals.v)
> -#define SOCKETSLS_FETCH()
> +#define SOCKETS_G(v) (sockets_globals.v)
> #endif
>
> #else
> Index: sockets.c
> ===================================================================
> RCS file: /repository/php4/ext/sockets/sockets.c,v
> retrieving revision 1.98
> diff -u -r1.98 sockets.c
> --- sockets.c 11 Mar 2002 01:24:42 -0000 1.98
> +++ sockets.c 29 Apr 2002 08:56:25 -0000
> @@ -62,12 +62,7 @@
> # define IS_INVALID_SOCKET(a) (a->bsd_socket == INVALID_SOCKET)
> #endif
>
> -#ifdef ZTS
> -int sockets_globals_id;
> -#else
> -php_sockets_globals sockets_globals;
> -#endif
> -
> +ZEND_DECLARE_MODULE_GLOBALS(sockets)
>
> #ifndef MSG_WAITALL
> #ifdef LINUX
> @@ -90,7 +85,9 @@
> #define PHP_BINARY_READ 0x0002
>
> #define PHP_SOCKET_ERROR(socket,msg,errn) socket->error = errn; \
> - php_error(E_WARNING, "%s() %s [%d]: %s",
> get_active_function_name(TSRMLS_C), msg, errn, php_strerror(errn))
> + SOCKETS_G(last_error) = errn; \
> + php_error(E_WARNING, "%s() %s [%d]: %s", \
> + get_active_function_name(TSRMLS_C), msg, errn, php_strerror(errn))
>
> static int le_iov;
> #define le_iov_name "Socket I/O vector"
> @@ -374,12 +371,20 @@
> return 1;
> }
>
> +
> +static void php_sockets_init_globals(zend_sockets_globals *sockets_globals TSRMLS_DC)
> +{
> + sockets_globals->last_error = 0;
> +}
> +
> /* {{{ PHP_MINIT_FUNCTION
> */
> PHP_MINIT_FUNCTION(sockets)
> {
> struct protoent *pe;
>
> + ZEND_INIT_MODULE_GLOBALS(sockets, php_sockets_init_globals, NULL);
> +
> le_socket = zend_register_list_destructors_ex(destroy_socket, NULL, le_socket_name,
> module_number);
> le_iov = zend_register_list_destructors_ex(destroy_iovec, NULL, le_iov_name, module_number);
>
> @@ -526,6 +531,7 @@
> retval = select(max_fd+1, &rfds, &wfds, &efds, tv_p);
>
> if (retval == -1) {
> + SOCKETS_G(last_error) = errno;
> php_error(E_WARNING, "%s() %s [%d]: %s", get_active_function_name(TSRMLS_C),
> "unable to select", errno, php_strerror(errno));
> RETURN_FALSE;
> }
> @@ -570,6 +576,8 @@
> ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket);
>
> if (!accept_connect(php_sock, &new_sock, (struct sockaddr *) &sa TSRMLS_CC)) {
> + php_error(E_WARNING, "%s() unable to accept socket connection [%d]: %s",
> + get_active_function_name(TSRMLS_C), errno, php_strerror(errno));
> RETURN_FALSE;
> }
>
> @@ -798,6 +806,8 @@
> RETURN_TRUE;
>
> default:
> + php_error(E_WARNING, "%s() Unsupported address family %d",
> + get_active_function_name(TSRMLS_C), sa->sa_family);
> RETURN_FALSE;
> }
> }
> @@ -854,6 +864,8 @@
> RETURN_TRUE;
>
> default:
> + php_error(E_WARNING, "%s() Unsupported address family %d",
> + get_active_function_name(TSRMLS_C), sa->sa_family);
> RETURN_FALSE;
> }
> }
> @@ -885,6 +897,9 @@
> php_sock->type = arg1;
>
> if (IS_INVALID_SOCKET(php_sock)) {
> + SOCKETS_G(last_error) = errno;
> + php_error(E_WARNING, "%s() Unable to create socket [%d]: %s",
> + get_active_function_name(TSRMLS_C), errno, php_strerror(errno));
> efree(php_sock);
> RETURN_FALSE;
> }
> @@ -912,6 +927,8 @@
> switch(php_sock->type) {
> case AF_INET:
> if (ZEND_NUM_ARGS() != 3) {
> + php_error(E_WARNING, "%s() Socket of type AF_INET requires 3 arguments",
> + get_active_function_name(TSRMLS_C));
> RETURN_FALSE;
> }
>
> @@ -932,6 +949,8 @@
> break;
>
> default:
> + php_error(E_WARNING, "%s() Unsupported socket type %d",
> + get_active_function_name(TSRMLS_C), php_sock->type);
> RETURN_FALSE;
> }
>
> @@ -1370,6 +1389,8 @@
> break;
>
> default:
> + php_error(E_WARNING, "%s() Unsupported socket type %d",
> + get_active_function_name(TSRMLS_C), php_sock->type);
> RETURN_FALSE;
> }
>
> @@ -1420,6 +1441,8 @@
> break;
>
> default:
> + php_error(E_WARNING, "%s() Unsupported socket type %d",
> + get_active_function_name(TSRMLS_C), php_sock->type);
> RETURN_FALSE;
> }
>
> @@ -1565,6 +1588,8 @@
> }
>
> default:
> + php_error(E_WARNING, "%s() Unsupported address family %d",
> + get_active_function_name(TSRMLS_C), sa->sa_family);
> RETURN_FALSE;
> }
> }
> @@ -1649,6 +1674,8 @@
> }
>
> default:
> + php_error(E_WARNING, "%s() Unsupported address family %d",
> + get_active_function_name(TSRMLS_C), sa.sa_family);
> RETURN_FALSE;
> }
> }
> @@ -1895,19 +1922,19 @@
> Returns the last error on the socket */
> PHP_FUNCTION(socket_last_error)
> {
> - zval *arg1;
> + zval *arg1 = NULL;
> php_socket *php_sock;
> - int error;
>
> - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE)
> - return;
> -
> - ZEND_FETCH_RESOURCE(php_sock, php_socket*, &arg1, -1, le_socket_name, le_socket);
> -
> - error = php_sock->error;
> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg1) == FAILURE)
> + return;
>
> - RETURN_LONG(error);
> -}
> + if (arg1) {
> + ZEND_FETCH_RESOURCE(php_sock, php_socket*, &arg1, -1, le_socket_name, le_socket);
> + RETVAL_LONG(php_sock->error);
> + } else {
> + RETVAL_LONG(SOCKETS_G(last_error));
> + }
> +}
> /* }}} */
>
> /* {{{ proto void socket_clear_error(resource socket)
>
> ----
>
> --
> PHP Development Mailing List <http://www.php.net/>
> To unsubscribe, visit: http://www.php.net/unsub.php