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

Reply via email to