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