Annotation of embedaddon/php/main/php_network.h, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 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:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 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)
1.1.1.2 misho 197: # define PHP_SAFE_FD_CLR(fd, set) FD_CLR(fd, set)
1.1 misho 198: # define PHP_SAFE_FD_ISSET(fd, set) FD_ISSET(fd, set)
199: # define PHP_SAFE_MAX_FD(m, n) do { if (n + 1 >= FD_SETSIZE) { _php_emit_fd_setsize_warning(n); }} while(0)
200: #else
201: # define PHP_SAFE_FD_SET(fd, set) do { if (fd < FD_SETSIZE) FD_SET(fd, set); } while(0)
1.1.1.2 misho 202: # define PHP_SAFE_FD_CLR(fd, set) do { if (fd < FD_SETSIZE) FD_CLR(fd, set); } while(0)
1.1 misho 203: # define PHP_SAFE_FD_ISSET(fd, set) ((fd < FD_SETSIZE) && FD_ISSET(fd, set))
204: # define PHP_SAFE_MAX_FD(m, n) do { if (m >= FD_SETSIZE) { _php_emit_fd_setsize_warning(m); m = FD_SETSIZE - 1; }} while(0)
205: #endif
206:
207:
208: #define PHP_SOCK_CHUNK_SIZE 8192
209:
210: #ifdef HAVE_SOCKADDR_STORAGE
211: typedef struct sockaddr_storage php_sockaddr_storage;
212: #else
213: typedef struct {
214: #ifdef HAVE_SOCKADDR_SA_LEN
215: unsigned char ss_len;
216: unsigned char ss_family;
217: #else
218: unsigned short ss_family;
219: #endif
220: char info[126];
221: } php_sockaddr_storage;
222: #endif
223:
224: BEGIN_EXTERN_C()
1.1.1.2 misho 225: PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC);
226: PHPAPI void php_network_freeaddresses(struct sockaddr **sal);
227:
1.1 misho 228: PHPAPI php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port,
229: int socktype, int asynchronous, struct timeval *timeout, char **error_string,
230: int *error_code, char *bindto, unsigned short bindport
231: TSRMLS_DC);
232:
233: PHPAPI int php_network_connect_socket(php_socket_t sockfd,
234: const struct sockaddr *addr,
235: socklen_t addrlen,
236: int asynchronous,
237: struct timeval *timeout,
238: char **error_string,
239: int *error_code);
240:
241: #define php_connect_nonb(sock, addr, addrlen, timeout) \
242: php_network_connect_socket((sock), (addr), (addrlen), 0, (timeout), NULL, NULL)
243:
244: PHPAPI php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port,
245: int socktype, char **error_string, int *error_code
246: TSRMLS_DC);
247:
248: PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
249: char **textaddr, long *textaddrlen,
250: struct sockaddr **addr,
251: socklen_t *addrlen,
252: struct timeval *timeout,
253: char **error_string,
254: int *error_code
255: TSRMLS_DC);
256:
257: PHPAPI int php_network_get_sock_name(php_socket_t sock,
258: char **textaddr, long *textaddrlen,
259: struct sockaddr **addr,
260: socklen_t *addrlen
261: TSRMLS_DC);
262:
263: PHPAPI int php_network_get_peer_name(php_socket_t sock,
264: char **textaddr, long *textaddrlen,
265: struct sockaddr **addr,
266: socklen_t *addrlen
267: TSRMLS_DC);
268:
269: PHPAPI void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port);
270: PHPAPI int php_sockaddr_size(php_sockaddr_storage *addr);
271: END_EXTERN_C()
272:
273: struct _php_netstream_data_t {
274: php_socket_t socket;
275: char is_blocked;
276: struct timeval timeout;
277: char timeout_event;
278: size_t ownsize;
279: };
280: typedef struct _php_netstream_data_t php_netstream_data_t;
281: PHPAPI extern php_stream_ops php_stream_socket_ops;
282: extern php_stream_ops php_stream_generic_socket_ops;
283: #define PHP_STREAM_IS_SOCKET (&php_stream_socket_ops)
284:
285: BEGIN_EXTERN_C()
286: PHPAPI php_stream *_php_stream_sock_open_from_socket(php_socket_t socket, const char *persistent_id STREAMS_DC TSRMLS_DC );
287: /* open a connection to a host using php_hostconnect and return a stream */
288: PHPAPI php_stream *_php_stream_sock_open_host(const char *host, unsigned short port,
289: int socktype, struct timeval *timeout, const char *persistent_id STREAMS_DC TSRMLS_DC);
290: PHPAPI void php_network_populate_name_from_sockaddr(
291: /* input address */
292: struct sockaddr *sa, socklen_t sl,
293: /* output readable address */
294: char **textaddr, long *textaddrlen,
295: /* output address */
296: struct sockaddr **addr,
297: socklen_t *addrlen
298: TSRMLS_DC);
299:
300: PHPAPI int php_network_parse_network_address_with_port(const char *addr,
301: long addrlen, struct sockaddr *sa, socklen_t *sl TSRMLS_DC);
302: END_EXTERN_C()
303:
304: #define php_stream_sock_open_from_socket(socket, persistent) _php_stream_sock_open_from_socket((socket), (persistent) STREAMS_CC TSRMLS_CC)
305: #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)
306:
307: /* {{{ memory debug */
308: #define php_stream_sock_open_from_socket_rel(socket, persistent) _php_stream_sock_open_from_socket((socket), (persistent) STREAMS_REL_CC TSRMLS_CC)
309: #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)
310: #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)
311:
312: /* }}} */
313:
314: #endif /* _PHP_NETWORK_H */
315:
316: /*
317: * Local variables:
318: * tab-width: 8
319: * c-basic-offset: 8
320: * End:
321: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>