From: Sascha Schumann Date: Sat, 25 Sep 1999 00:32:25 +0000 (+0000) Subject: Initial AOLserver support. Note that the current way of creating X-Git-Tag: before-sapi-split~27 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e8c8fd99247f1e50fbda5b0301153dbb527f453;p=php Initial AOLserver support. Note that the current way of creating the shared library works only with GNU utilities. Some features have to be added yet (i.e. POST and cookie support). --- diff --git a/Makefile.in b/Makefile.in index 9fc5c8a6ac..a5b2c0a582 100644 --- a/Makefile.in +++ b/Makefile.in @@ -73,7 +73,9 @@ LIBOBJS=@LIBOBJS@ SOURCE = main.c internal_functions.c snprintf.c php3_sprintf.c \ configuration-parser.c configuration-scanner.c request_info.c \ safe_mode.c fopen-wrappers.c php3_realpath.c alloca.c output.c \ - php_ini.c SAPI.c cgi_main.c rfc1867.c dlist.c php_content_types.c + php_ini.c SAPI.c cgi_main.c rfc1867.c dlist.c php_content_types.c \ + aolserver.c + OBJS = $(SOURCE:.c=.o) $(LIBOBJS) PHPLIBS = -Llibzend -lzend -Lext -lphpext LIBS = $(PHPLIBS) $(EXTRA_LIBS) @LIBS@ @@ -113,6 +115,9 @@ libphp4.so: $(srcdir)/mod_php4.c libmodphp4-so.a @REGEX_LIB@ -@test -f ./mod_php4.c || test -h ./mod_php4.c || $(LN_S) $(srcdir)/mod_php4.c ./mod_php4.c $(APXS) $(INCLUDE) -c -o libphp4.so @VERSION_SCRIPT@ @RPATHS@ ./mod_php4.c libmodphp4-so.a $(APXS_LDFLAGS) $(APXS_EXP) +php4_aol.so: libmodphp4-so.a + g++ $(LDFLAGS) aolserver.o -rdynamic -shared -o $@ libmodphp4-so.a $(LIBS) @TSRM_LIB@ + regex/libregex.a: (cd regex; $(MAKE) lib) diff --git a/acconfig.h.in b/acconfig.h.in index 9d5f579304..6c5744f358 100644 --- a/acconfig.h.in +++ b/acconfig.h.in @@ -4,6 +4,8 @@ #undef PACKAGE #undef VERSION +#undef HAVE_AOLSERVER + #undef HAVE_STRUCT_FLOCK #undef HAVE_TM_GMTOFF diff --git a/aolserver.c b/aolserver.c new file mode 100644 index 0000000000..976c1d9b1d --- /dev/null +++ b/aolserver.c @@ -0,0 +1,272 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_0.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. | + +----------------------------------------------------------------------+ + | Author: Sascha Schumann | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +#include "php.h" + +#ifdef HAVE_AOLSERVER + +#include "php_ini.h" +#include "php_globals.h" +#include "SAPI.h" +#include "main.h" + +/* conflict between PHP and aolserver */ +#define Debug DEBUG_UNUSED +#include "ns.h" +#undef Debug + +#include "php_version.h" + +#if 0 +#define HERE \ + Ns_Log(Notice, "in %s:%d", __FUNCTION__, __LINE__); +#else +#define HERE +#endif + +int Ns_ModuleVersion = 1; + +typedef struct { + sapi_module_struct *sapi_module; + Ns_DString content_type; + Ns_Conn *conn; +} php_aol_context; + +static int +sapi_aol_read_post(char *buf, uint count_bytes SLS_DC) +{ + HERE; + return FAILURE; +} + +static int +sapi_ub_write(const char *str, uint str_length) +{ + Ns_DString dstr; + php_aol_context *ctx; + SLS_FETCH(); + + HERE; + ctx = (php_aol_context *) SG(server_context); + + Ns_DStringInit(&dstr); + Ns_Log(Notice, "writing %d bytes\n", str_length); + Ns_DStringNAppend(&dstr, (char *) str, str_length); + Ns_ConnSendDString(ctx->conn, &dstr); + Ns_DStringFree(&dstr); + + return str_length; +} + +static int +sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers SLS_DC) +{ + char *header_name, *header_content; + char *p; + php_aol_context *ctx = (php_aol_context *) SG(server_context); + + header_name = sapi_header->header; + header_content = p = strchr(header_name, ':'); + + if(!p) return 0; + + *p = '\0'; + do { + header_content++; + } while(*header_content == ' '); + + if(!strcasecmp(header_name, "Content-type")) { + Ns_ConnSetTypeHeader(ctx->conn, header_content); + } else { + Ns_ConnSetHeaders(ctx->conn, header_name, header_content); + } + + *p = ':'; + + efree(sapi_header->header); + + return 0; +} + +static int +sapi_send_headers(sapi_headers_struct *sapi_headers SLS_DC) +{ + php_aol_context *ctx; + + ctx = (php_aol_context *) SG(server_context); + Ns_ConnFlushHeaders(ctx->conn, 200); + return SAPI_HEADER_SENT_SUCCESSFULLY; +} + +static int +sapi_read_post(char *buf, uint count_bytes SLS_DC) +{ + uint total_read = 0; + + HERE; + return total_read; +} + +static char * +sapi_read_cookies(SLS_D) +{ + HERE; + return NULL; +} + +static sapi_module_struct sapi_module = { + "PHP Language", + + php_module_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ + + sapi_ub_write, /* unbuffered write */ + + php_error, /* error handler */ + + sapi_header_handler, /* header handler */ + sapi_send_headers, /* send headers handler */ + NULL, /* send header handler */ + + sapi_read_post, /* read POST data */ + sapi_read_cookies, /* read Cookies */ + + STANDARD_SAPI_MODULE_PROPERTIES +}; + +static void +php_server_shutdown(void *context) +{ + php_aol_context *ctx = (php_aol_context *) context; + + HERE; + ctx->sapi_module->shutdown(ctx->sapi_module); + + free(ctx); +} + +static int +module_main(php_aol_context *ctx) +{ + zend_file_handle file_handle; + zend_compiler_globals cg; + zend_executor_globals eg; + php_core_globals pcg; + zend_compiler_globals *compiler_globals = &cg; + zend_executor_globals *executor_globals = ⪚ + php_core_globals *core_globals = &pcg; + SLS_FETCH(); + + HERE; + + if(setjmp(EG(bailout)) != 0) { + return !NS_OK; + } + + compiler_globals = ts_resource(compiler_globals_id); + executor_globals = ts_resource(executor_globals_id); + core_globals = ts_resource(core_globals_id); + + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.filename = SG(request_info).path_translated; + + php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC); + php_execute_script(&file_handle CLS_CC ELS_CC PLS_CC); + php_request_shutdown(NULL); + + return NS_OK; +} + +static void +request_ctor(php_aol_context *ctx SLS_DC) +{ + char *server; + Ns_DString ds; + char *root; + HERE; + + server = Ns_ConnServer(ctx->conn); + + SG(server_context) = ctx; + SG(request_info).query_string = ""; + + Ns_DStringInit(&ds); + Ns_UrlToFile(&ds, server, ctx->conn->request->url); + SG(request_info).path_translated = strdup(Ns_DStringValue(&ds)); + Ns_DStringFree(&ds); + root = Ns_PageRoot(server); + SG(request_info).request_uri = SG(request_info).path_translated + strlen(root); + SG(request_info).request_method = "GET"; + SG(request_info).content_length = Ns_ConnContentLength(ctx->conn); + Ns_DStringInit(&ctx->content_type); + Ns_ConnCopyToDString(ctx->conn, SG(request_info).content_length, &ctx->content_type); + SG(request_info).content_type = Ns_DStringValue(&ctx->content_type); + SG(request_info).auth_user = NULL; + SG(request_info).auth_password = NULL; +} + +static void +request_dtor(php_aol_context *ctx SLS_DC) +{ + HERE; + + free(SG(request_info).path_translated); + Ns_DStringFree(&ctx->content_type); +} + +static int +request_handler(void *context, Ns_Conn *conn) +{ + php_aol_context *ctx = (php_aol_context *) context; + int status = NS_OK; + SLS_FETCH(); + + HERE; + ctx->conn = conn; + + request_ctor(ctx SLS_CC); + + status = module_main(ctx); + + request_dtor(ctx SLS_CC); + + ctx->conn = NULL; + + return status; +} + +int Ns_ModuleInit(char *server, char *module) +{ + php_aol_context *ctx; + + tsrm_startup(10, 10, 0); + sapi_startup(&sapi_module); + sapi_module.startup(&sapi_module); + + ctx = malloc(sizeof *ctx); + ctx->sapi_module = &sapi_module; + + Ns_RegisterServerShutdown(server, php_server_shutdown, ctx); + + Ns_RegisterRequest(server, "GET", "/php", request_handler, NULL, ctx, 0); + return NS_OK; +} + +#endif diff --git a/configure.in.in b/configure.in.in index 89529e38e4..c8620c629e 100644 --- a/configure.in.in +++ b/configure.in.in @@ -622,6 +622,27 @@ AC_SUBST(PHP_LIBS) fi fi +RESULT=no +AC_MSG_CHECKING(for AOLserver support) +AC_ARG_WITH(aolserver, +[ --with-aolserver=DIR], +[ + if test ! -d $withval ; then + AC_MSG_ERROR(You did not specify a directory) + fi + if test "$enable_thread_safety" != "yes"; then + AC_MSG_ERROR(AOLserver must be compiled using --enable-thread-safety) + fi + NS_DIR=$withval + AC_ADD_INCLUDE($NS_DIR/include) + AC_DEFINE(HAVE_AOLSERVER) + BINNAME=php4_aol.so + INSTALL_IT="\$(SHELL) \$(srcdir)/install-sh -m 0755 $BINNAME $NS_DIR/root/bin/$BINNAME" + CFLAGS="$CFLAGS -rdynamic" + RESULT=yes +]) +AC_MSG_RESULT($RESULT) + AC_MSG_CHECKING(whether to use bundled regex library) AC_ARG_WITH(system-regex, [ --with-system-regex Do not use the bundled regex library],