]> granicus.if.org Git - php/commitdiff
Added prototypes for socketpair() and shutdown(), and corrected an obvious
authorChris Vandomelen <chrisv@php.net>
Wed, 13 Sep 2000 23:33:39 +0000 (23:33 +0000)
committerChris Vandomelen <chrisv@php.net>
Wed, 13 Sep 2000 23:33:39 +0000 (23:33 +0000)
bug in socketpair (causing it to not return the created sockets to the PHP
script.)

ext/sockets/sockets.c

index 98d477c7888ed8ce58eb04a2cc61992658c835be..c1b473bb612fd1af5ad98a0935bad756bedb1b02 100644 (file)
@@ -1863,7 +1863,10 @@ PHP_FUNCTION(setsockopt)
 
        RETURN_LONG(((ret < 0) ? -errno : ret));
 }
+/* }}} */
 
+/* {{{ proto int socketpair(int domain, int type, int protocol, array &fds)
+   Creates a pair of indistinguishable sockets and stores them in fds. */
 PHP_FUNCTION(socketpair)
 {
        zval **domain, **type, **protocol, **fds, **fd;
@@ -1874,6 +1877,7 @@ PHP_FUNCTION(socketpair)
            zend_get_parameters_ex(4, &domain, &type, &protocol, &fds) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+
        v_convert_to_long_ex(3, domain, type, protocol);
 
        if (Z_LVAL_PP(domain) != AF_INET && Z_LVAL_PP(domain) != AF_UNIX) {
@@ -1886,32 +1890,30 @@ PHP_FUNCTION(socketpair)
                Z_LVAL_PP(type) = SOCK_STREAM;
        }
        
-       fd_ar = HASH_OF(*fds);
-       zend_hash_internal_pointer_reset(fd_ar);
-       
-       if (zend_hash_get_current_data(fd_ar, (void **)&fd) == FAILURE) {
-               php_error(E_WARNING, "Can't access data from fds array");
-               RETURN_FALSE;
-       }
-       SEPARATE_ZVAL(fd);
-       
-       convert_to_long_ex(fd);
-       fds_ar[0] = Z_LVAL_PP(fd);
-       
-       zend_hash_move_forward(fd_ar);
-       if (zend_hash_get_current_data(fd_ar, (void **)&fd) == FAILURE) {
-               php_error(E_WARNING, "Can't access data from fds array");
+       /* Initialize the array */
+       if (array_init(*fds) == FAILURE) {
+               php_error(E_WARNING, "Can't initialize fds array");
                RETURN_FALSE;
        }
-       SEPARATE_ZVAL(fd);
-       
-       convert_to_long_ex(fd);
-       fds_ar[1] = Z_LVAL_PP(fd);      
        
+       /* Get the sockets */
        ret = socketpair(Z_LVAL_PP(domain), Z_LVAL_PP(type), Z_LVAL_PP(protocol), fds_ar);
        
-       RETURN_LONG(((ret < 0) ? -errno : ret));
+       if (ret < 0) {
+               RETURN_LONG(-errno);
+       }
+
+       /* Put them into the array */
+       add_index_long(*fds, 0, fds_ar[0]);
+       add_index_long(*fds, 1, fds_ar[1]);
+
+       /* ... and return */
+       RETURN_LONG(ret);
 }
+/* }}} */
+
+/* {{{ proto int shutdown(int fd, int how)
+   Shuts down a socket for receiving, sending, or both. */
 
 PHP_FUNCTION(shutdown)
 {
@@ -1933,7 +1935,6 @@ PHP_FUNCTION(shutdown)
        
        RETURN_LONG(((ret < 0) ? -errno : ret));
 }
-
 /* }}} */
 
 #endif                         /* HAVE_SOCKETS */