#ifndef PHP_PSI_H
#define PHP_PSI_H
+#include "php.h"
+
extern zend_module_entry psi_module_entry;
#define phpext_psi_ptr &psi_module_entry
static inline int psi_check_env(const char *var) {
char *set = getenv(var);
- return (set && *set && '0' != *set);
+ return (set && *set && (*set != '0' || set[1]));
+}
+
+#include <fcntl.h>
+#include "php_network.h"
+
+static inline int psi_fdopen(const char *desc)
+{
+ int fd = -1;
+
+ if (desc) {
+ char *addr = strstr(desc, "://");
+
+ if (addr) {
+ addr += 3;
+ }
+ if (addr && *addr) {
+ struct sockaddr_storage sa = {0};
+ socklen_t ss = 0;
+ int rc = php_network_parse_network_address_with_port(addr,
+ strlen(addr), (struct sockaddr *) &sa, &ss);
+
+ if (SUCCESS == rc) {
+ int styp = strncmp(desc, "udp:", 4)
+ ? SOCK_STREAM
+ : SOCK_DGRAM;
+ int sfam = sa.ss_family == AF_INET6
+ ? ((struct sockaddr_in6 *) &sa)->sin6_family
+ : ((struct sockaddr_in *) &sa)->sin_family;
+
+ fd = socket(sfam, styp, 0);
+
+ if (fd > 0 && 0 != connect(fd, (struct sockaddr *) &sa, ss)) {
+ perror(desc);
+ close(fd);
+ fd = -1;
+ }
+ }
+ } else if (!strcmp(desc, "stdout")) {
+ fd = STDOUT_FILENO;
+ } else if (!strcmp(desc, "stderr")) {
+ fd = STDERR_FILENO;
+ } else if (!(fd = atoi(desc)) || -1 == fcntl(fd, F_GETFD)) {
+ fd = open(desc, O_WRONLY|O_APPEND|O_CREAT|O_CLOEXEC, 0664);
+ }
+ }
+ return fd;
}
typedef struct psi_object {
ZEND_BEGIN_MODULE_GLOBALS(psi)
char *engine;
char *directory;
+ char *search_path;
+ struct psi_context_ops *ops;
struct psi_context *context;
+ struct {
+ struct psi_plist *decls;
+ struct psi_plist *vars;
+ } blacklist;
ZEND_END_MODULE_GLOBALS(psi);
ZEND_EXTERN_MODULE_GLOBALS(psi);