39static HANDLE fcgi_accept_mutex = INVALID_HANDLE_VALUE;
40static int is_impersonate = 0;
42#define FCGI_LOCK(fd) \
43 if (fcgi_accept_mutex != INVALID_HANDLE_VALUE) { \
45 while ((ret = WaitForSingleObject(fcgi_accept_mutex, 1000)) == WAIT_TIMEOUT) { \
46 if (in_shutdown) return -1; \
48 if (ret == WAIT_FAILED) { \
49 fprintf(stderr, "WaitForSingleObject() failed\n"); \
54#define FCGI_UNLOCK(fd) \
55 if (fcgi_accept_mutex != INVALID_HANDLE_VALUE) { \
56 ReleaseMutex(fcgi_accept_mutex); \
61# include <sys/types.h>
65# include <sys/socket.h>
67# include <netinet/in.h>
68# include <netinet/tcp.h>
69# include <arpa/inet.h>
73# if defined(HAVE_POLL_H) && defined(HAVE_POLL)
75# elif defined(HAVE_SYS_POLL_H) && defined(HAVE_POLL)
78# if defined(HAVE_SYS_SELECT_H)
79# include <sys/select.h>
83#define INADDR_NONE ((unsigned long) -1)
86# ifndef HAVE_SOCKLEN_T
91# define FCGI_LOCK(fd) \
94 lock.l_type = F_WRLCK; \
96 lock.l_whence = SEEK_SET; \
98 if (fcntl(fd, F_SETLKW, &lock) != -1) { \
100 } else if (errno != EINTR || in_shutdown) { \
105# define FCGI_UNLOCK(fd) \
107 int orig_errno = errno; \
110 lock.l_type = F_UNLCK; \
112 lock.l_whence = SEEK_SET; \
114 if (fcntl(fd, F_SETLK, &lock) != -1) { \
116 } else if (errno != EINTR) { \
120 errno = orig_errno; \
123# define FCGI_LOCK(fd)
124# define FCGI_UNLOCK(fd)
232#ifndef HAVE_ATTRIBUTE_WEAK
245static int is_initialized = 0;
246static int is_fastcgi = 0;
247static int in_shutdown = 0;
249static sa_t client_sa;
265static void fcgi_hash_destroy(
fcgi_hash *h)
306static inline char* fcgi_hash_strndup(
fcgi_hash *h,
char *str,
unsigned int str_len)
315 p->end =
p->pos + seg_size;
326static char* fcgi_hash_set(
fcgi_hash *h,
unsigned int hash_value,
char *var,
unsigned int var_len,
char *
val,
unsigned int val_len)
333 p->var_len == var_len &&
334 memcmp(
p->var, var, var_len) == 0) {
336 p->val_len = val_len;
337 p->val = fcgi_hash_strndup(h,
val, val_len);
353 p->list_next = h->
list;
355 p->hash_value = hash_value;
356 p->var_len = var_len;
357 p->var = fcgi_hash_strndup(h, var, var_len);
358 p->val_len = val_len;
359 p->val = fcgi_hash_strndup(h,
val, val_len);
363static void fcgi_hash_del(
fcgi_hash *h,
unsigned int hash_value,
char *var,
unsigned int var_len)
369 if ((*p)->hash_value == hash_value &&
370 (*p)->var_len == var_len &&
371 memcmp((*p)->var, var, var_len) == 0) {
382static char *fcgi_hash_get(
fcgi_hash *h,
unsigned int hash_value,
char *var,
unsigned int var_len,
unsigned int *val_len)
388 if (
p->hash_value == hash_value &&
389 p->var_len == var_len &&
390 memcmp(
p->var, var, var_len) == 0) {
391 *val_len =
p->val_len;
413static DWORD WINAPI fcgi_shutdown_thread(LPVOID
arg)
415 HANDLE shutdown_event = (HANDLE)
arg;
416 WaitForSingleObject(shutdown_event, INFINITE);
423static void fcgi_signal_handler(
int signo)
430static void fcgi_setup_signals(
void)
432 struct sigaction new_sa, old_sa;
434 sigemptyset(&new_sa.sa_mask);
436 new_sa.sa_handler = fcgi_signal_handler;
440 if (old_sa.sa_handler ==
SIG_DFL) {
448 in_shutdown = new_value;
463 req->
keep = new_value;
466#ifndef HAVE_ATTRIBUTE_WEAK
474 va_start(ap, format);
482 if (!is_initialized) {
488 fcgi_set_mgmt_var(
"FCGI_MPXS_CONNS",
sizeof(
"FCGI_MPXS_CONNS")-1,
"0",
sizeof(
"0")-1);
496 if (WSAStartup(MAKEWORD(2,0), &wsaData)) {
497 fprintf(stderr,
"Error starting Windows Sockets. Error: %d", WSAGetLastError());
501 if ((GetStdHandle(STD_OUTPUT_HANDLE) == INVALID_HANDLE_VALUE) &&
502 (GetStdHandle(STD_ERROR_HANDLE) == INVALID_HANDLE_VALUE) &&
503 (GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE)) {
505 DWORD pipe_mode = PIPE_READMODE_BYTE | PIPE_WAIT;
506 HANDLE pipe = GetStdHandle(STD_INPUT_HANDLE);
508 SetNamedPipeHandleState(pipe, &pipe_mode,
NULL,
NULL);
510 str =
getenv(
"_FCGI_SHUTDOWN_EVENT_");
513 HANDLE shutdown_event = (HANDLE) ev;
514 if (!CreateThread(
NULL, 0, fcgi_shutdown_thread,
515 shutdown_event, 0,
NULL)) {
519 str =
getenv(
"_FCGI_MUTEX_");
521 fcgi_accept_mutex = (HANDLE)
ZEND_ATOL(str);
523 return is_fastcgi = 1;
525 return is_fastcgi = 0;
529 if (getpeername(0, (
struct sockaddr *)&sa, &
len) != 0 &&
errno ==
ENOTCONN) {
530 fcgi_setup_signals();
531 return is_fastcgi = 1;
533 return is_fastcgi = 0;
543 if (!is_initialized) {
552 if (is_initialized) {
556 if (allowed_clients) {
557 free(allowed_clients);
569static PACL prepare_named_pipe_acl(PSECURITY_DESCRIPTOR sd, LPSECURITY_ATTRIBUTES sa)
572 char everyone_buf[32], owner_buf[32];
573 PSID sid_everyone, sid_owner;
574 SID_IDENTIFIER_AUTHORITY
575 siaWorld = SECURITY_WORLD_SID_AUTHORITY,
576 siaCreator = SECURITY_CREATOR_SID_AUTHORITY;
579 sid_everyone = (PSID)&everyone_buf;
580 sid_owner = (PSID)&owner_buf;
582 req_acl_size =
sizeof(ACL) +
583 (2 * ((
sizeof(ACCESS_ALLOWED_ACE) -
sizeof(
DWORD)) + GetSidLengthRequired(1)));
585 acl = malloc(req_acl_size);
591 if (!InitializeSid(sid_everyone, &siaWorld, 1)) {
594 *GetSidSubAuthority(sid_everyone, 0) = SECURITY_WORLD_RID;
596 if (!InitializeSid(sid_owner, &siaCreator, 1)) {
599 *GetSidSubAuthority(sid_owner, 0) = SECURITY_CREATOR_OWNER_RID;
601 if (!InitializeAcl(acl, req_acl_size, ACL_REVISION)) {
605 if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_GENERIC_READ | FILE_GENERIC_WRITE, sid_everyone)) {
609 if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, sid_owner)) {
613 if (!InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION)) {
617 if (!SetSecurityDescriptorDacl(sd,
TRUE, acl,
FALSE)) {
621 sa->lpSecurityDescriptor = sd;
631static int is_port_number(
const char *bindpath)
634 if (*bindpath <
'0' || *bindpath >
'9') {
662 strncpy(host, path,
s-path);
666 }
else if (is_port_number(path)) {
678 sa.
sa_inet.sin_port = htons(port);
681 if (!*host || !
strncmp(host,
"*",
sizeof(
"*")-1)) {
682 sa.
sa_inet.sin_addr.s_addr = htonl(INADDR_ANY);
692 if (!hep || hep->h_addrtype !=
AF_INET || !hep->h_addr_list[0]) {
693 fcgi_log(
FCGI_ERROR,
"Cannot resolve host name '%s'!\n", host);
695 }
else if (hep->h_addr_list[1]) {
696 fcgi_log(
FCGI_ERROR,
"Host '%s' has multiple addresses. You must choose one explicitly!\n", host);
699 sa.
sa_inet.sin_addr.s_addr = ((
struct in_addr*)hep->h_addr_list[0])->s_addr;
704 SECURITY_DESCRIPTOR sd;
705 SECURITY_ATTRIBUTES saw;
709 memset(&sa, 0,
sizeof(saw));
710 saw.nLength =
sizeof(saw);
711 saw.bInheritHandle =
FALSE;
712 acl = prepare_named_pipe_acl(&sd, &saw);
714 namedPipe = CreateNamedPipe(path,
715 PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
716 PIPE_TYPE_BYTE | PIPE_WAIT | PIPE_READMODE_BYTE,
717 PIPE_UNLIMITED_INSTANCES,
718 8192, 8192, 0, &saw);
719 if (namedPipe == INVALID_HANDLE_VALUE) {
722 listen_socket = _open_osfhandle((intptr_t)namedPipe, 0);
723 if (!is_initialized) {
727 return listen_socket;
730 size_t path_len =
strlen(path);
732 if (path_len >=
sizeof(sa.
sa_unix.sun_path)) {
733 fcgi_log(
FCGI_ERROR,
"Listening socket's path name is too long.\n");
740 sock_len =
XtOffsetOf(
struct sockaddr_un, sun_path) + path_len;
741#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
749 if ((listen_socket = socket(sa.
sa.sa_family,
SOCK_STREAM, 0)) < 0 ||
753 bind(listen_socket, (
struct sockaddr *) &sa, sock_len) < 0 ||
754 listen(listen_socket, backlog) < 0) {
755 close(listen_socket);
763 char *ip =
getenv(
"FCGI_WEB_SERVER_ADDRS");
772 if (*cur ==
',')
n++;
775 allowed_clients = malloc(
sizeof(
sa_t) * (
n+2));
785 allowed_clients[
n].sa.sa_family =
AF_INET;
789 allowed_clients[
n].sa.sa_family =
AF_INET6;
793 fcgi_log(
FCGI_ERROR,
"Wrong IP address '%s' in listen.allowed_clients", cur);
797 allowed_clients[
n].sa.sa_family = 0;
800 fcgi_log(
FCGI_ERROR,
"There are no allowed addresses");
806 if (!is_initialized) {
813 listen_socket = _open_osfhandle((intptr_t)listen_socket, 0);
816 fcgi_setup_signals();
818 return listen_socket;
831 if (*cur ==
',')
n++;
834 if (allowed_clients) free(allowed_clients);
835 allowed_clients = malloc(
sizeof(
sa_t) * (
n+2));
845 allowed_clients[
n].sa.sa_family =
AF_INET;
849 allowed_clients[
n].sa.sa_family =
AF_INET6;
853 fcgi_log(
FCGI_ERROR,
"Wrong IP address '%s' in listen.allowed_clients", cur);
857 allowed_clients[
n].sa.sa_family = 0;
860 fcgi_log(
FCGI_ERROR,
"There are no allowed addresses");
866static void fcgi_hook_dummy(
void) {
892 req->
hook.
on_accept = on_accept ? on_accept : fcgi_hook_dummy;
893 req->
hook.
on_read = on_read ? on_read : fcgi_hook_dummy;
894 req->
hook.
on_close = on_close ? on_close : fcgi_hook_dummy;
900 fcgi_hash_init(&req->
env);
906 fcgi_hash_destroy(&req->
env);
924 unsigned int out_len = tmp > UINT_MAX ? UINT_MAX : (
unsigned int)tmp;
926 ret = write(req->
fd, ((
char*)
buf)+
n, out_len);
930 ret = send(req->
fd, ((
char*)
buf)+
n, out_len, 0);
932 errno = WSAGetLastError();
961 unsigned int in_len = tmp >
INT_MAX ?
INT_MAX : (
unsigned int)tmp;
963 ret = _read(req->
fd, ((
char*)
buf)+
n, in_len);
967 ret = recv(req->
fd, ((
char*)
buf)+
n, in_len, 0);
969 errno = WSAGetLastError();
977 }
else if (
ret == 0 &&
errno == 0) {
988 int pad = ((
len + 7) & ~7) -
len;
1004static int fcgi_get_params(
fcgi_request *req,
unsigned char *
p,
unsigned char *
end)
1006 unsigned int name_len, val_len;
1012 name_len = ((name_len & 0x7f) << 24);
1013 name_len |= (*
p++ << 16);
1014 name_len |= (*
p++ << 8);
1021 val_len = ((val_len & 0x7f) << 24);
1022 val_len |= (*
p++ << 16);
1023 val_len |= (*
p++ << 8);
1030 fcgi_hash_set(&req->
env,
FCGI_HASH_FUNC(
p, name_len), (
char*)
p, name_len, (
char*)
p + name_len, val_len);
1031 p += name_len + val_len;
1049 fcgi_hash_clean(&req->
env);
1081 if (safe_read(req,
buf,
len+padding) !=
len+padding) {
1088 if (req->
keep && req->
tcp && !req->nodelay) {
1095 setsockopt(req->
fd, IPPROTO_TCP,
TCP_NODELAY, (
char*)&on,
sizeof(on));
1101 fcgi_hash_set(&req->
env,
FCGI_HASH_FUNC(
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1),
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1,
"RESPONDER",
sizeof(
"RESPONDER")-1);
1104 fcgi_hash_set(&req->
env,
FCGI_HASH_FUNC(
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1),
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1,
"AUTHORIZER",
sizeof(
"AUTHORIZER")-1);
1107 fcgi_hash_set(&req->
env,
FCGI_HASH_FUNC(
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1),
"FCGI_ROLE",
sizeof(
"FCGI_ROLE")-1,
"FILTER",
sizeof(
"FILTER")-1);
1126 if (safe_read(req,
buf,
len+padding) !=
len+padding) {
1131 if (!fcgi_get_params(req,
buf,
buf+
len)) {
1150 if (safe_read(req,
buf,
len+padding) !=
len+padding) {
1155 if (!fcgi_get_params(req,
buf,
buf+
len)) {
1173 *
p++ = ((q->
var_len >> 24) & 0xff) | 0x80;
1181 *
p++ = ((zlen >> 24) & 0xff) | 0x80;
1182 *
p++ = (zlen >> 16) & 0xff;
1183 *
p++ = (zlen >> 8) & 0xff;
1208 unsigned char buf[255];
1227 if (req->
in_len >= rest) {
1228 ret = (int)safe_read(req, str, rest);
1230 ret = (int)safe_read(req, str, req->
in_len);
1235 }
else if (
ret > 0) {
1259 if (destroy && req->
has_env) {
1260 fcgi_hash_clean(&req->
env);
1265 if (is_impersonate && !req->
tcp) {
1270 if ((force || !req->
keep) && req->
fd >= 0) {
1273 HANDLE pipe = (HANDLE)_get_osfhandle(req->
fd);
1276 FlushFileBuffers(pipe);
1278 DisconnectNamedPipe(pipe);
1285 while (recv(req->
fd,
buf,
sizeof(
buf), 0) > 0) {}
1295 while (recv(req->
fd,
buf,
sizeof(
buf), 0) > 0) {}
1310 return (req->
fd < 0);
1313static int fcgi_is_allowed(
void) {
1316 if (client_sa.sa.sa_family ==
AF_UNIX) {
1319 if (!allowed_clients) {
1322 if (client_sa.sa.sa_family ==
AF_INET) {
1323 for (i = 0; allowed_clients[i].sa.sa_family ; i++) {
1324 if (allowed_clients[i].sa.sa_family ==
AF_INET
1325 && !memcmp(&client_sa.sa_inet.sin_addr, &allowed_clients[i].sa_inet.sin_addr, 4)) {
1331 if (client_sa.sa.sa_family ==
AF_INET6) {
1332 for (i = 0; allowed_clients[i].sa.sa_family ; i++) {
1333 if (allowed_clients[i].sa.sa_family ==
AF_INET6
1334 && !memcmp(&client_sa.sa_inet6.sin6_addr, &allowed_clients[i].sa_inet6.sin6_addr, 12)) {
1337#ifdef IN6_IS_ADDR_V4MAPPED
1338 if (allowed_clients[i].sa.sa_family ==
AF_INET
1339 && IN6_IS_ADDR_V4MAPPED(&client_sa.sa_inet6.sin6_addr)
1340 && !memcmp(((
char *)&client_sa.sa_inet6.sin6_addr)+12, &allowed_clients[i].sa_inet.sin_addr, 4)) {
1371 if (!ConnectNamedPipe(pipe, &ov)) {
1372 errno = GetLastError();
1373 if (
errno == ERROR_IO_PENDING) {
1374 while (WaitForSingleObject(ov.hEvent, 1000) == WAIT_TIMEOUT) {
1376 CloseHandle(ov.hEvent);
1381 }
else if (
errno != ERROR_PIPE_CONNECTED) {
1384 CloseHandle(ov.hEvent);
1388 SOCKET listen_socket = (SOCKET)_get_osfhandle(req->
listen_socket);
1397 req->
fd = accept(listen_socket, (
struct sockaddr *)&sa, &
len);
1401 if (req->
fd >= 0 && !fcgi_is_allowed()) {
1410 if (req->
fd < 0 && (in_shutdown ||
errno != EINTR)) {
1417#if defined(F_SETFD) && defined(FD_CLOEXEC)
1418 int fd_attrs = fcntl(req->
fd, F_GETFD);
1420 fcgi_log(
FCGI_WARNING,
"failed to get attributes of the connection socket");
1422 if (0 > fcntl(req->
fd, F_SETFD, fd_attrs |
FD_CLOEXEC)) {
1423 fcgi_log(
FCGI_WARNING,
"failed to change attribute of the connection socket");
1431#if defined(HAVE_POLL)
1440 ret = poll(&fds, 1, 5000);
1441 }
while (
ret < 0 &&
errno == EINTR);
1442 if (
ret > 0 && (fds.revents &
POLLIN)) {
1447 if (req->
fd < FD_SETSIZE) {
1448 struct timeval
tv = {5,0};
1453 FD_SET(req->
fd, &set);
1457 }
while (
ret < 0 &&
errno == EINTR);
1458 if (
ret > 0 && FD_ISSET(req->
fd, &set)) {
1463 fcgi_log(
FCGI_ERROR,
"Too many open file descriptors. FD_SETSIZE limit exceeded.");
1470 }
else if (in_shutdown) {
1474 int read_result = fcgi_read_request(req);
1475 if (read_result == 1) {
1477 if (is_impersonate && !req->
tcp) {
1478 pipe = (HANDLE)_get_osfhandle(req->
fd);
1479 if (!ImpersonateNamedPipeClient(pipe)) {
1486 }
else if (read_result == 0) {
1563 open_packet(req,
type);
1585 if (limit < 0) limit = 0;
1590 open_packet(req,
type);
1596 open_packet(req,
type);
1604 open_packet(req,
type);
1612 while ((
len -
pos) > 0xffff) {
1613 open_packet(req,
type);
1619 if (safe_write(req, str +
pos, 0xfff8) != 0xfff8) {
1627 rest = pad ? 8 - pad : 0;
1629 open_packet(req,
type);
1635 if (safe_write(req, str +
pos, (
len -
pos) - rest) != (
len -
pos) - rest) {
1640 open_packet(req,
type);
1675 unsigned int val_len;
1677 if (!req)
return NULL;
1679 return fcgi_hash_get(&req->
env,
FCGI_HASH_FUNC(var, var_len), (
char*)var, var_len, &val_len);
1684 unsigned int val_len;
1686 return fcgi_hash_get(&req->
env, hash_value, (
char*)var, var_len, &val_len);
1691 if (!req)
return NULL;
1703 fcgi_hash_del(&req->
env, hash_value, var, var_len);
1706 return fcgi_hash_set(&req->
env, hash_value, var, var_len,
val, (
unsigned int)
strlen(
val));
1712 fcgi_hash_apply(&req->
env,
func, array);
1716void fcgi_impersonate(
void)
1721 if (os_name &&
stricmp(os_name,
"Windows_NT") == 0) {
1745 static char str[INET6_ADDRSTRLEN];
1748 if (client_sa.sa.sa_family ==
AF_INET) {
1749 return inet_ntop(client_sa.sa.sa_family, &client_sa.sa_inet.sin_addr, str, INET6_ADDRSTRLEN);
1752#ifdef IN6_IS_ADDR_V4MAPPED
1754 if (client_sa.sa.sa_family ==
AF_INET6
1755 && IN6_IS_ADDR_V4MAPPED(&client_sa.sa_inet6.sin6_addr)) {
1756 return inet_ntop(
AF_INET, ((
char *)&client_sa.sa_inet6.sin6_addr)+12, str, INET6_ADDRSTRLEN);
1760 if (client_sa.sa.sa_family ==
AF_INET6) {
1761 return inet_ntop(client_sa.sa.sa_family, &client_sa.sa_inet6.sin6_addr, str, INET6_ADDRSTRLEN);
unlink(string $filename, $context=null)
fprintf($stream, string $format, mixed ... $values)
getenv(?string $name=null, bool $local_only=false)
vfprintf($stream, string $format, array $values)
chmod(string $filename, int $permissions)
count(Countable|array $value, int $mode=COUNT_NORMAL)
strchr(string $haystack, string $needle, bool $before_needle=false)
struct _fcgi_hash_buckets fcgi_hash_buckets
int fcgi_is_fastcgi(void)
void fcgi_request_set_keep(fcgi_request *req, int new_value)
void fcgi_set_mgmt_var(const char *name, size_t name_len, const char *value, size_t value_len)
struct _fcgi_hash fcgi_hash
int fcgi_listen(const char *path, int backlog)
const char * fcgi_get_last_client_ip(void)
void fcgi_free_mgmt_var_cb(zval *zv)
int fcgi_accept_request(fcgi_request *req)
void fcgi_destroy_request(fcgi_request *req)
int fcgi_has_env(fcgi_request *req)
int fcgi_read(fcgi_request *req, char *str, int len)
struct _fcgi_begin_request fcgi_begin_request
int fcgi_flush(fcgi_request *req, int end)
struct _fcgi_header fcgi_header
fcgi_request * fcgi_init_request(int listen_socket, void(*on_accept)(void), void(*on_read)(void), void(*on_close)(void))
void fcgi_loadenv(fcgi_request *req, fcgi_apply_func func, zval *array)
void fcgi_terminate(void)
struct _fcgi_end_request_rec fcgi_end_request_rec
int fcgi_end(fcgi_request *req)
void fcgi_set_in_shutdown(int new_value)
struct _fcgi_hash_bucket fcgi_hash_bucket
int fcgi_is_closed(fcgi_request *req)
int fcgi_in_shutdown(void)
int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len)
struct _fcgi_req_hook fcgi_req_hook
char * fcgi_quick_putenv(fcgi_request *req, char *var, int var_len, unsigned int hash_value, char *val)
void fcgi_set_allowed_clients(char *ip)
struct _fcgi_begin_request_rec fcgi_begin_request_rec
char * fcgi_quick_getenv(fcgi_request *req, const char *var, int var_len, unsigned int hash_value)
char * fcgi_getenv(fcgi_request *req, const char *var, int var_len)
struct _fcgi_end_request fcgi_end_request
int fcgi_finish_request(fcgi_request *req, int force_close)
char * fcgi_putenv(fcgi_request *req, char *var, int var_len, char *val)
void fcgi_close(fcgi_request *req, int force, int destroy)
struct _fcgi_data_seg fcgi_data_seg
void void fcgi_set_logger(fcgi_logger lg)
void(* fcgi_logger)(int type, const char *fmt,...) ZEND_ATTRIBUTE_FORMAT(printf
#define FCGI_HASH_TABLE_SIZE
#define FCGI_HASH_TABLE_MASK
void(* fcgi_apply_func)(const char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg)
#define FCGI_HASH_SEG_SIZE
enum _fcgi_request_type fcgi_request_type
struct _fcgi_request fcgi_request
#define FCGI_HASH_FUNC(var, var_len)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
inet_ntop(AF_INET, addr, addr_str, sizeof(addr_str))
PHPAPI struct hostent * php_network_gethostbyname(const char *name)
unsigned const char * end
unsigned const char * pos
unsigned char key[REFLECTION_KEY_LEN]
unsigned char reserved[5]
struct _fcgi_data_seg * next
unsigned char reserved[3]
unsigned char appStatusB2
unsigned char appStatusB1
unsigned char appStatusB0
unsigned char protocolStatus
unsigned char appStatusB3
struct _fcgi_hash_bucket * list_next
struct _fcgi_hash_bucket * next
struct _fcgi_hash_buckets * next
struct _fcgi_hash_bucket data[FCGI_HASH_TABLE_SIZE]
fcgi_hash_buckets * buckets
fcgi_hash_bucket * hash_table[FCGI_HASH_TABLE_SIZE]
unsigned char reserved[sizeof(fcgi_end_request_rec)]
unsigned char out_buf[1024 *8]
struct sockaddr_in6 sa_inet6
struct sockaddr_in sa_inet
struct sockaddr_un sa_unix
#define pefree(ptr, persistent)
strncmp(string $string1, string $string2, int $length)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
struct _zend_string zend_string
#define EXPECTED(condition)
#define XtOffsetOf(s_type, field)
#define UNEXPECTED(condition)
#define Z_STRVAL_P(zval_p)
struct _zend_array HashTable
#define GC_MAKE_PERSISTENT_LOCAL(p)
#define Z_STRLEN_P(zval_p)
#define ZVAL_NEW_STR(z, s)