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: 2016-09-18 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10

Generated at Sun, 18 Sep 2016 08:20:21 +0000 (7 days ago)

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