1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
|
/*
+----------------------------------------------------------------------+
| Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| https://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Chris Vandomelen <chrisv@b0rked.dhs.org> |
| Sterling Hughes <sterling@php.net> |
| |
| WinSock: Daniel Beulshausen <daniel@php4win.de> |
+----------------------------------------------------------------------+
*/
#ifndef PHP_SOCKETS_H
#define PHP_SOCKETS_H
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#ifdef HAVE_SOCKETS
#include <php.h>
#ifdef PHP_WIN32
# include "windows_common.h"
#else
# define IS_INVALID_SOCKET(a) (a->bsd_socket < 0)
#endif
#define PHP_SOCKETS_VERSION PHP_VERSION
extern zend_module_entry sockets_module_entry;
#define phpext_sockets_ptr &sockets_module_entry
#ifdef PHP_WIN32
#include <Winsock2.h>
#else
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#endif
#ifndef PHP_WIN32
typedef int PHP_SOCKET;
#else
typedef SOCKET PHP_SOCKET;
#endif
#ifdef PHP_WIN32
# ifdef PHP_SOCKETS_EXPORTS
# define PHP_SOCKETS_API __declspec(dllexport)
# else
# define PHP_SOCKETS_API __declspec(dllimport)
# endif
#elif defined(__GNUC__) && __GNUC__ >= 4
# define PHP_SOCKETS_API __attribute__ ((visibility("default")))
#else
# define PHP_SOCKETS_API
#endif
/* Socket class */
typedef struct {
PHP_SOCKET bsd_socket;
int type;
int error;
int blocking;
zval zstream;
zend_object std;
} php_socket;
extern PHP_SOCKETS_API zend_class_entry *socket_ce;
static inline php_socket *socket_from_obj(zend_object *obj) {
return (php_socket *)((char *)(obj) - XtOffsetOf(php_socket, std));
}
#define Z_SOCKET_P(zv) socket_from_obj(Z_OBJ_P(zv))
#define ENSURE_SOCKET_VALID(php_sock) do { \
if (IS_INVALID_SOCKET(php_sock)) { \
zend_argument_error(NULL, 1, "has already been closed"); \
RETURN_THROWS(); \
} \
} while (0)
#ifdef PHP_WIN32
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
#endif
#define PHP_SOCKET_ERROR(socket, msg, errn) \
do { \
int _err = (errn); /* save value to avoid repeated calls to WSAGetLastError() on Windows */ \
(socket)->error = _err; \
SOCKETS_G(last_error) = _err; \
if (_err != EAGAIN && _err != EWOULDBLOCK && _err != EINPROGRESS) { \
php_error_docref(NULL, E_WARNING, "%s [%d]: %s", msg, _err, sockets_strerror(_err)); \
} \
} while (0)
ZEND_BEGIN_MODULE_GLOBALS(sockets)
int last_error;
char *strerror_buf;
#ifdef PHP_WIN32
uint32_t wsa_child_count;
HashTable wsa_info;
#endif
ZEND_END_MODULE_GLOBALS(sockets)
PHP_SOCKETS_API ZEND_EXTERN_MODULE_GLOBALS(sockets)
#define SOCKETS_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(sockets, v)
enum sockopt_return {
SOCKOPT_ERROR,
SOCKOPT_CONTINUE,
SOCKOPT_SUCCESS
};
PHP_SOCKETS_API char *sockets_strerror(int error);
PHP_SOCKETS_API bool socket_import_file_descriptor(PHP_SOCKET socket, php_socket *retsock);
#else
#define phpext_sockets_ptr NULL
#endif
#if defined(_AIX) && !defined(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
# define ss_family __ss_family
#endif
#ifndef MSG_EOF
#ifdef MSG_FIN
#define MSG_EOF MSG_FIN
#endif
#endif
#ifndef MSG_WAITALL
#ifdef LINUX
#define MSG_WAITALL 0x00000100
#else
#define MSG_WAITALL 0x00000000
#endif
#endif
#define PHP_NORMAL_READ 0x0001
#define PHP_BINARY_READ 0x0002
#ifdef PHP_WIN32
#define PHP_SOCKET_EINTR WSAEINTR
#elif defined(EINTR)
#define PHP_SOCKET_EINTR EINTR
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EBADF WSAEBADF
#elif defined(EBADF)
#define PHP_SOCKET_EBADF EBADF
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EACCES WSAEACCES
#elif defined(EACCES)
#define PHP_SOCKET_EACCES EACCES
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EFAULT WSAEFAULT
#elif defined(EFAULT)
#define PHP_SOCKET_EFAULT EFAULT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EINVAL WSAEINVAL
#elif defined(EINVAL)
#define PHP_SOCKET_EINVAL EINVAL
#endif
#ifdef ENFILE
#define PHP_SOCKET_ENFILE ENFILE
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EMFILE WSAEMFILE
#elif defined(EMFILE)
#define PHP_SOCKET_EMFILE EMFILE
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EWOULDBLOCK WSAEWOULDBLOCK
#elif defined(EWOULDBLOCK)
#define PHP_SOCKET_EWOULDBLOCK EWOULDBLOCK
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EINPROGRESS WSAEINPROGRESS
#elif defined(EINPROGRESS)
#define PHP_SOCKET_EINPROGRESS EINPROGRESS
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EALREADY WSAEALREADY
#elif defined(EALREADY)
#define PHP_SOCKET_EALREADY EALREADY
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENOTSOCK WSAENOTSOCK
#elif defined(ENOTSOCK)
#define PHP_SOCKET_ENOTSOCK ENOTSOCK
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EDESTADDRREQ WSAEDESTADDRREQ
#elif defined(EDESTADDRREQ)
#define PHP_SOCKET_EDESTADDRREQ EDESTADDRREQ
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EMSGSIZE WSAEMSGSIZE
#elif defined(EMSGSIZE)
#define PHP_SOCKET_EMSGSIZE EMSGSIZE
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EPROTOTYPE WSAEPROTOTYPE
#elif defined(EPROTOTYPE)
#define PHP_SOCKET_EPROTOTYPE EPROTOTYPE
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENOPROTOOPT WSAENOPROTOOPT
#elif defined(ENOPROTOOPT)
#define PHP_SOCKET_ENOPROTOOPT ENOPROTOOPT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EPROTONOSUPPORT WSAEPROTONOSUPPORT
#elif defined(EPROTONOSUPPORT)
#define PHP_SOCKET_EPROTONOSUPPORT EPROTONOSUPPORT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
#elif defined(ESOCKTNOSUPPORT)
#define PHP_SOCKET_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EOPNOTSUPP WSAEOPNOTSUPP
#elif defined(EOPNOTSUPP)
#define PHP_SOCKET_EOPNOTSUPP EOPNOTSUPP
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EPFNOSUPPORT WSAEPFNOSUPPORT
#elif defined(EPFNOSUPPORT)
#define PHP_SOCKET_EPFNOSUPPORT EPFNOSUPPORT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EAFNOSUPPORT WSAEAFNOSUPPORT
#elif defined(EAFNOSUPPORT)
#define PHP_SOCKET_EAFNOSUPPORT EAFNOSUPPORT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EADDRINUSE WSAEADDRINUSE
#elif defined(EADDRINUSE)
#define PHP_SOCKET_EADDRINUSE EADDRINUSE
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EADDRNOTAVAIL WSAEADDRNOTAVAIL
#elif defined(EADDRNOTAVAIL)
#define PHP_SOCKET_EADDRNOTAVAIL EADDRNOTAVAIL
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENETDOWN WSAENETDOWN
#elif defined(ENETDOWN)
#define PHP_SOCKET_ENETDOWN ENETDOWN
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENETUNREACH WSAENETUNREACH
#elif defined(ENETUNREACH)
#define PHP_SOCKET_ENETUNREACH ENETUNREACH
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENETRESET WSAENETRESET
#elif defined(ENETRESET)
#define PHP_SOCKET_ENETRESET ENETRESET
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ECONNABORTED WSAECONNABORTED
#elif defined(ECONNABORTED)
#define PHP_SOCKET_ECONNABORTED ECONNABORTED
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ECONNRESET WSAECONNRESET
#elif defined(ECONNRESET)
#define PHP_SOCKET_ECONNRESET ECONNRESET
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENOBUFS WSAENOBUFS
#elif defined(ENOBUFS)
#define PHP_SOCKET_ENOBUFS ENOBUFS
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EISCONN WSAEISCONN
#elif defined(EISCONN)
#define PHP_SOCKET_EISCONN EISCONN
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENOTCONN WSAENOTCONN
#elif defined(ENOTCONN)
#define PHP_SOCKET_ENOTCONN ENOTCONN
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ESHUTDOWN WSAESHUTDOWN
#elif defined(ESHUTDOWN)
#define PHP_SOCKET_ESHUTDOWN ESHUTDOWN
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ETOOMANYREFS WSAETOOMANYREFS
#elif defined(ETOOMANYREFS)
#define PHP_SOCKET_ETOOMANYREFS ETOOMANYREFS
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ETIMEDOUT WSAETIMEDOUT
#elif defined(ETIMEDOUT)
#define PHP_SOCKET_ETIMEDOUT ETIMEDOUT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ECONNREFUSED WSAECONNREFUSED
#elif defined(ECONNREFUSED)
#define PHP_SOCKET_ECONNREFUSED ECONNREFUSED
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ELOOP WSAELOOP
#elif defined(ELOOP)
#define PHP_SOCKET_ELOOP ELOOP
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENAMETOOLONG WSAENAMETOOLONG
#elif defined(ENAMETOOLONG)
#define PHP_SOCKET_ENAMETOOLONG ENAMETOOLONG
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EHOSTDOWN WSAEHOSTDOWN
#elif defined(EHOSTDOWN)
#define PHP_SOCKET_EHOSTDOWN EHOSTDOWN
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EHOSTUNREACH WSAEHOSTUNREACH
#elif defined(EHOSTUNREACH)
#define PHP_SOCKET_EHOSTUNREACH EHOSTUNREACH
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_ENOTEMPTY WSAENOTEMPTY
#elif defined(ENOTEMPTY)
#define PHP_SOCKET_ENOTEMPTY ENOTEMPTY
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EUSERS WSAEUSERS
#elif defined(EUSERS)
#define PHP_SOCKET_EUSERS EUSERS
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EDQUOT WSAEDQUOT
#elif defined(EDQUOT)
#define PHP_SOCKET_EDQUOT EDQUOT
#endif
#ifdef PHP_WIN32
#define PHP_SOCKET_EREMOTE WSAEREMOTE
#elif defined(EREMOTE)
#define PHP_SOCKET_EREMOTE EREMOTE
#endif
#endif
|