PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - main - php_network.h (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 19 20 95.0 %
Date: 2014-08-04 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    +----------------------------------------------------------------------+
       3             :    | PHP Version 5                                                        |
       4             :    +----------------------------------------------------------------------+
       5             :    | Copyright (c) 1997-2014 The PHP Group                                |
       6             :    +----------------------------------------------------------------------+
       7             :    | This source file is subject to version 3.01 of the PHP license,      |
       8             :    | that is bundled with this package in the file LICENSE, and is        |
       9             :    | available through the world-wide-web at the following url:           |
      10             :    | http://www.php.net/license/3_01.txt                                  |
      11             :    | If you did not receive a copy of the PHP license and are unable to   |
      12             :    | obtain it through the world-wide-web, please send a note to          |
      13             :    | license@php.net so we can mail you a copy immediately.               |
      14             :    +----------------------------------------------------------------------+
      15             :    | Author: Stig Venaas <venaas@uninett.no>                              |
      16             :    +----------------------------------------------------------------------+
      17             :  */
      18             : 
      19             : /* $Id$ */
      20             : 
      21             : #ifndef _PHP_NETWORK_H
      22             : #define _PHP_NETWORK_H
      23             : 
      24             : #include <php.h>
      25             : 
      26             : #ifdef PHP_WIN32
      27             : # include "win32/inet.h"
      28             : #else
      29             : # undef closesocket
      30             : # define closesocket close
      31             : #endif
      32             : 
      33             : #ifndef HAVE_SHUTDOWN
      34             : #undef shutdown
      35             : #define shutdown(s,n)   /* nothing */
      36             : #endif
      37             : 
      38             : #ifdef PHP_WIN32
      39             : # ifdef EWOULDBLOCK
      40             : #  undef EWOULDBLOCK
      41             : # endif
      42             : # ifdef EINPROGRESS
      43             : #  undef EINPROGRESS
      44             : # endif
      45             : # define EWOULDBLOCK WSAEWOULDBLOCK
      46             : # define EINPROGRESS    WSAEWOULDBLOCK
      47             : # define fsync _commit
      48             : # define ftruncate(a, b) chsize(a, b)
      49             : #endif /* defined(PHP_WIN32) */
      50             : 
      51             : #ifndef EWOULDBLOCK
      52             : # define EWOULDBLOCK EAGAIN
      53             : #endif
      54             : 
      55             : #ifdef PHP_WIN32
      56             : #define php_socket_errno() WSAGetLastError()
      57             : #else
      58             : #define php_socket_errno() errno
      59             : #endif
      60             : 
      61             : /* like strerror, but caller must efree the returned string,
      62             :  * unless buf is not NULL.
      63             :  * Also works sensibly for win32 */
      64             : BEGIN_EXTERN_C()
      65             : PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize);
      66             : END_EXTERN_C()
      67             : 
      68             : #ifdef HAVE_NETINET_IN_H
      69             : # include <netinet/in.h>
      70             : #endif
      71             : 
      72             : #ifdef HAVE_SYS_SOCKET_H
      73             : #include <sys/socket.h>
      74             : #endif
      75             : 
      76             : /* These are here, rather than with the win32 counterparts above,
      77             :  * since <sys/socket.h> defines them. */
      78             : #ifndef SHUT_RD
      79             : # define SHUT_RD 0
      80             : # define SHUT_WR 1
      81             : # define SHUT_RDWR 2
      82             : #endif
      83             : 
      84             : #ifdef HAVE_SYS_TIME_H
      85             : #include <sys/time.h>
      86             : #endif
      87             : 
      88             : #ifdef HAVE_STDDEF_H
      89             : #include <stddef.h>
      90             : #endif
      91             : 
      92             : #ifdef PHP_WIN32
      93             : typedef SOCKET php_socket_t;
      94             : #else
      95             : typedef int php_socket_t;
      96             : #endif
      97             : 
      98             : #ifdef PHP_WIN32
      99             : # define SOCK_ERR INVALID_SOCKET
     100             : # define SOCK_CONN_ERR SOCKET_ERROR
     101             : # define SOCK_RECV_ERR SOCKET_ERROR
     102             : #else
     103             : # define SOCK_ERR -1
     104             : # define SOCK_CONN_ERR -1
     105             : # define SOCK_RECV_ERR -1
     106             : #endif
     107             : 
     108             : /* uncomment this to debug poll(2) emulation on systems that have poll(2) */
     109             : /* #define PHP_USE_POLL_2_EMULATION 1 */
     110             : 
     111             : #if defined(HAVE_SYS_POLL_H) && defined(HAVE_POLL)
     112             : # include <sys/poll.h>
     113             : typedef struct pollfd php_pollfd;
     114             : #else
     115             : typedef struct _php_pollfd {
     116             :         php_socket_t fd;
     117             :         short events;
     118             :         short revents;
     119             : } php_pollfd;
     120             : 
     121             : PHPAPI int php_poll2(php_pollfd *ufds, unsigned int nfds, int timeout);
     122             : 
     123             : #ifndef POLLIN
     124             : # define POLLIN      0x0001    /* There is data to read */
     125             : # define POLLPRI     0x0002    /* There is urgent data to read */
     126             : # define POLLOUT     0x0004    /* Writing now will not block */
     127             : # define POLLERR     0x0008    /* Error condition */
     128             : # define POLLHUP     0x0010    /* Hung up */
     129             : # define POLLNVAL    0x0020    /* Invalid request: fd not open */
     130             : #endif
     131             : 
     132             : # ifndef PHP_USE_POLL_2_EMULATION
     133             : #  define PHP_USE_POLL_2_EMULATION 1
     134             : # endif
     135             : #endif
     136             : 
     137             : #define PHP_POLLREADABLE        (POLLIN|POLLERR|POLLHUP)
     138             : 
     139             : #ifndef PHP_USE_POLL_2_EMULATION
     140             : # define php_poll2(ufds, nfds, timeout)         poll(ufds, nfds, timeout)
     141             : #endif
     142             : 
     143             : /* timeval-to-timeout (for poll(2)) */
     144      119969 : static inline int php_tvtoto(struct timeval *timeouttv)
     145             : {
     146      119969 :         if (timeouttv) {
     147      119969 :                 return (timeouttv->tv_sec * 1000) + (timeouttv->tv_usec / 1000);
     148             :         }
     149           0 :         return -1;
     150             : }
     151             : 
     152             : /* hybrid select(2)/poll(2) for a single descriptor.
     153             :  * timeouttv follows same rules as select(2), but is reduced to millisecond accuracy.
     154             :  * Returns 0 on timeout, -1 on error, or the event mask (ala poll(2)).
     155             :  */
     156      119969 : static inline int php_pollfd_for(php_socket_t fd, int events, struct timeval *timeouttv)
     157             : {
     158             :         php_pollfd p;
     159             :         int n;
     160             : 
     161      119969 :         p.fd = fd;
     162      119969 :         p.events = events;
     163      119969 :         p.revents = 0;
     164             : 
     165      119969 :         n = php_poll2(&p, 1, php_tvtoto(timeouttv));
     166             : 
     167      119969 :         if (n > 0) {
     168      119856 :                 return p.revents;
     169             :         }
     170             : 
     171         113 :         return n;
     172             : }
     173             : 
     174         567 : static inline int php_pollfd_for_ms(php_socket_t fd, int events, int timeout)
     175             : {
     176             :         php_pollfd p;
     177             :         int n;
     178             : 
     179         567 :         p.fd = fd;
     180         567 :         p.events = events;
     181         567 :         p.revents = 0;
     182             : 
     183         567 :         n = php_poll2(&p, 1, timeout);
     184             : 
     185         567 :         if (n > 0) {
     186         566 :                 return p.revents;
     187             :         }
     188             : 
     189           1 :         return n;
     190             : }
     191             : 
     192             : /* emit warning and suggestion for unsafe select(2) usage */
     193             : PHPAPI void _php_emit_fd_setsize_warning(int max_fd);
     194             : 
     195             : #ifdef PHP_WIN32
     196             : /* it is safe to FD_SET too many fd's under win32; the macro will simply ignore
     197             :  * descriptors that go beyond the default FD_SETSIZE */
     198             : # define PHP_SAFE_FD_SET(fd, set)       FD_SET(fd, set)
     199             : # define PHP_SAFE_FD_CLR(fd, set)       FD_CLR(fd, set)
     200             : # define PHP_SAFE_FD_ISSET(fd, set)     FD_ISSET(fd, set)
     201             : # define PHP_SAFE_MAX_FD(m, n)          do { if (n + 1 >= FD_SETSIZE) { _php_emit_fd_setsize_warning(n); }} while(0)
     202             : #else
     203             : # define PHP_SAFE_FD_SET(fd, set)       do { if (fd < FD_SETSIZE) FD_SET(fd, set); } while(0)
     204             : # define PHP_SAFE_FD_CLR(fd, set)       do { if (fd < FD_SETSIZE) FD_CLR(fd, set); } while(0)
     205             : # define PHP_SAFE_FD_ISSET(fd, set)     ((fd < FD_SETSIZE) && FD_ISSET(fd, set))
     206             : # define PHP_SAFE_MAX_FD(m, n)          do { if (m >= FD_SETSIZE) { _php_emit_fd_setsize_warning(m); m = FD_SETSIZE - 1; }} while(0)
     207             : #endif
     208             : 
     209             : 
     210             : #define PHP_SOCK_CHUNK_SIZE     8192
     211             : 
     212             : #ifdef HAVE_SOCKADDR_STORAGE
     213             : typedef struct sockaddr_storage php_sockaddr_storage;
     214             : #else
     215             : typedef struct {
     216             : #ifdef HAVE_SOCKADDR_SA_LEN
     217             :                 unsigned char ss_len;
     218             :                 unsigned char ss_family;
     219             : #else
     220             :         unsigned short ss_family;
     221             : #endif
     222             :         char info[126];
     223             : } php_sockaddr_storage;
     224             : #endif
     225             : 
     226             : BEGIN_EXTERN_C()
     227             : PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC);
     228             : PHPAPI void php_network_freeaddresses(struct sockaddr **sal);
     229             : 
     230             : PHPAPI php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port,
     231             :                 int socktype, int asynchronous, struct timeval *timeout, char **error_string,
     232             :                 int *error_code, char *bindto, unsigned short bindport 
     233             :                 TSRMLS_DC);
     234             : 
     235             : PHPAPI int php_network_connect_socket(php_socket_t sockfd,
     236             :                 const struct sockaddr *addr,
     237             :                 socklen_t addrlen,
     238             :                 int asynchronous,
     239             :                 struct timeval *timeout,
     240             :                 char **error_string,
     241             :                 int *error_code);
     242             : 
     243             : #define php_connect_nonb(sock, addr, addrlen, timeout) \
     244             :         php_network_connect_socket((sock), (addr), (addrlen), 0, (timeout), NULL, NULL)
     245             : 
     246             : PHPAPI php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port,
     247             :                 int socktype, char **error_string, int *error_code
     248             :                 TSRMLS_DC);
     249             : 
     250             : PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
     251             :                 char **textaddr, long *textaddrlen,
     252             :                 struct sockaddr **addr,
     253             :                 socklen_t *addrlen,
     254             :                 struct timeval *timeout,
     255             :                 char **error_string,
     256             :                 int *error_code
     257             :                 TSRMLS_DC);
     258             : 
     259             : PHPAPI int php_network_get_sock_name(php_socket_t sock, 
     260             :                 char **textaddr, long *textaddrlen,
     261             :                 struct sockaddr **addr,
     262             :                 socklen_t *addrlen
     263             :                 TSRMLS_DC);
     264             :         
     265             : PHPAPI int php_network_get_peer_name(php_socket_t sock, 
     266             :                 char **textaddr, long *textaddrlen,
     267             :                 struct sockaddr **addr,
     268             :                 socklen_t *addrlen
     269             :                 TSRMLS_DC);
     270             : 
     271             : PHPAPI void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port);
     272             : PHPAPI int php_sockaddr_size(php_sockaddr_storage *addr);
     273             : END_EXTERN_C()
     274             : 
     275             : struct _php_netstream_data_t    {
     276             :         php_socket_t socket;
     277             :         char is_blocked;
     278             :         struct timeval timeout;
     279             :         char timeout_event;
     280             :         size_t ownsize;
     281             : };
     282             : typedef struct _php_netstream_data_t php_netstream_data_t;
     283             : PHPAPI extern php_stream_ops php_stream_socket_ops;
     284             : extern php_stream_ops php_stream_generic_socket_ops;
     285             : #define PHP_STREAM_IS_SOCKET    (&php_stream_socket_ops)
     286             : 
     287             : BEGIN_EXTERN_C()
     288             : PHPAPI php_stream *_php_stream_sock_open_from_socket(php_socket_t socket, const char *persistent_id STREAMS_DC TSRMLS_DC );
     289             : /* open a connection to a host using php_hostconnect and return a stream */
     290             : PHPAPI php_stream *_php_stream_sock_open_host(const char *host, unsigned short port,
     291             :                 int socktype, struct timeval *timeout, const char *persistent_id STREAMS_DC TSRMLS_DC);
     292             : PHPAPI void php_network_populate_name_from_sockaddr(
     293             :                 /* input address */
     294             :                 struct sockaddr *sa, socklen_t sl,
     295             :                 /* output readable address */
     296             :                 char **textaddr, long *textaddrlen,
     297             :                 /* output address */
     298             :                 struct sockaddr **addr,
     299             :                 socklen_t *addrlen
     300             :                 TSRMLS_DC);
     301             : 
     302             : PHPAPI int php_network_parse_network_address_with_port(const char *addr,
     303             :                 long addrlen, struct sockaddr *sa, socklen_t *sl TSRMLS_DC);
     304             : END_EXTERN_C()
     305             : 
     306             : #define php_stream_sock_open_from_socket(socket, persistent)    _php_stream_sock_open_from_socket((socket), (persistent) STREAMS_CC TSRMLS_CC)
     307             : #define php_stream_sock_open_host(host, port, socktype, timeout, persistent)    _php_stream_sock_open_host((host), (port), (socktype), (timeout), (persistent) STREAMS_CC TSRMLS_CC)
     308             : 
     309             : /* {{{ memory debug */
     310             : #define php_stream_sock_open_from_socket_rel(socket, persistent)        _php_stream_sock_open_from_socket((socket), (persistent) STREAMS_REL_CC TSRMLS_CC)
     311             : #define php_stream_sock_open_host_rel(host, port, socktype, timeout, persistent)        _php_stream_sock_open_host((host), (port), (socktype), (timeout), (persistent) STREAMS_REL_CC TSRMLS_CC)
     312             : #define php_stream_sock_open_unix_rel(path, pathlen, persistent, timeval)       _php_stream_sock_open_unix((path), (pathlen), (persistent), (timeval) STREAMS_REL_CC TSRMLS_CC)
     313             : 
     314             : /* }}} */
     315             : 
     316             : #endif /* _PHP_NETWORK_H */
     317             : 
     318             : /*
     319             :  * Local variables:
     320             :  * tab-width: 8
     321             :  * c-basic-offset: 8
     322             :  * End:
     323             :  */

Generated by: LCOV version 1.10

Generated at Mon, 04 Aug 2014 15:49:19 +0000 (28 days ago)

Copyright © 2005-2014 The PHP Group
All rights reserved.