diff options
| author | Stig Bakken <ssb@php.net> | 1999-09-27 16:34:28 +0000 |
|---|---|---|
| committer | Stig Bakken <ssb@php.net> | 1999-09-27 16:34:28 +0000 |
| commit | 2a854ca8b9e94ea75e949edb1283157b0daad617 (patch) | |
| tree | 6eafc28bd9403f91354068a364254bde5d9afc7a /sapi/nsapi | |
| parent | 154663e9a2ee5310172886384a7c2a8598f66bc8 (diff) | |
| download | php-git-2a854ca8b9e94ea75e949edb1283157b0daad617.tar.gz | |
Generalized server-API build process on UNIX. Each SAPI
implementation now has its own directory under sapi/, just like
extensions have theirs under ext/. To make the final targets appear
in the main dir, the top-level Makefile includes sapi/NN/Makefile.inc
from the selected sapi backend. This is a plan Makefile stub without
any autoconf substitutions. Each SAPI backend also has its own
config.m4 like extensions (read at the end of diversion 2) and
config.h.stub files.
Each SAPI backend has to contain:
config.m4: just like for extensions, this file contains
autoconf/automake directives that end up in the configure script. The
only difference is that the sapi config.m4 files are read in diversion
(output block) 2 instead of 3. The sapi config.m4 files should set
two variables: PHP_SAPI (which sapi backend to choose) and SAPI_TARGET
(the name of the resulting library or program, previously BINNAME).
If they are not specified, they will default to "cgi" and "php",
respectively.
Makefile.inc: has to exist, has to define "INSTALL_IT" to the command
used to install the final target (or ":" for no operation). It also
has to define a plain Makefile rule (without autoconf substitutions)
to build $(SAPI_TARGET)
Makefile.am: just what you think. Make sure your target is called
"libphpsapi_NNN.a", where NNN is the value of PHP_SAPI.
Some testing and fixing probably remains. To make everything hang
together, I've done some ugly tricks that I can imagine causing some
problems. I've built and run the CGI version and built the Apache
DSO.
Diffstat (limited to 'sapi/nsapi')
| -rw-r--r-- | sapi/nsapi/Makefile.am | 5 | ||||
| -rw-r--r-- | sapi/nsapi/Makefile.inc | 6 | ||||
| -rw-r--r-- | sapi/nsapi/aolserver.c | 343 | ||||
| -rw-r--r-- | sapi/nsapi/config.m4 | 26 |
4 files changed, 380 insertions, 0 deletions
diff --git a/sapi/nsapi/Makefile.am b/sapi/nsapi/Makefile.am new file mode 100644 index 0000000000..4a8edf6074 --- /dev/null +++ b/sapi/nsapi/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to produce Makefile.in + +INCLUDES=@INCLUDES@ -I@top_srcdir@ -I@top_srcdir@/libzend +noinst_LIBRARIES=libphpsapi_nsapi.a +libphpsapi_nsapi_a_SOURCES=aolserver.c diff --git a/sapi/nsapi/Makefile.inc b/sapi/nsapi/Makefile.inc new file mode 100644 index 0000000000..6c56958bc8 --- /dev/null +++ b/sapi/nsapi/Makefile.inc @@ -0,0 +1,6 @@ +# NSAPI/AOLserver module + +INSTALL_IT=: + +php4_nsapi.so: libmodphp4-so.a + g++ $(LDFLAGS) -shared sapi/nsapi/aolserver.o -o $@ libmodphp4-so.a $(LIBS) diff --git a/sapi/nsapi/aolserver.c b/sapi/nsapi/aolserver.c new file mode 100644 index 0000000000..cbc4ec0257 --- /dev/null +++ b/sapi/nsapi/aolserver.c @@ -0,0 +1,343 @@ +/* + +----------------------------------------------------------------------+ + | 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 <sascha@schumann.cx> | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +/* conflict between PHP and aolserver */ +#define Debug php_Debug +#include "php.h" +#undef Debug + +#ifdef HAVE_AOLSERVER + +#include "php_ini.h" +#include "php_globals.h" +#include "SAPI.h" +#include "main.h" + +#include "ns.h" + +#include "php_version.h" + +int Ns_ModuleVersion = 1; + +#define NSLS_D ns_globals_struct *ns_context +#define NSLS_DC , NSLS_D +#define NSLS_C ns_context +#define NSLS_CC , NSLS_C +#define NSG(v) (ns_context->v) +#define NSLS_FETCH() ns_globals_struct *ns_context = ts_resource(ns_globals_id) + +static int ns_globals_id; + +typedef struct { + sapi_module_struct *sapi_module; + char *ns_server; + char *ns_module; +} php_ns_context; + +typedef struct { + Ns_Conn *conn; + Ns_DString content_type; +} ns_globals_struct; + +static void php_ns_config(php_ns_context *ctx); + +static int +php_ns_sapi_ub_write(const char *str, uint str_length) +{ + int sent_bytes; + NSLS_FETCH(); + + sent_bytes = Ns_ConnWrite(NSG(conn), (void *) str, str_length); + + return sent_bytes; +} + +static int +php_ns_sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers SLS_DC) +{ + char *header_name, *header_content; + char *p; + NSLS_FETCH(); + + 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(NSG(conn), header_content); + } else { + Ns_ConnSetHeaders(NSG(conn), header_name, header_content); + } + + *p = ':'; + + efree(sapi_header->header); + + return 0; +} + +static int +php_ns_sapi_send_headers(sapi_headers_struct *sapi_headers SLS_DC) +{ + NSLS_FETCH(); + + if(SG(sapi_headers).send_default_content_type) { + Ns_ConnSetRequiredHeaders(NSG(conn), "text/html", 0); + } + Ns_ConnFlushHeaders(NSG(conn), SG(sapi_headers).http_response_code); + return SAPI_HEADER_SENT_SUCCESSFULLY; +} + +static int +php_ns_sapi_read_post(char *buf, uint count_bytes SLS_DC) +{ + uint total_read = 0; + NSLS_FETCH(); + + total_read = Ns_ConnRead(NSG(conn), buf, count_bytes); + + if(total_read == NS_ERROR) { + total_read = -1; + } + + return total_read; +} + +static char * +php_ns_sapi_read_cookies(SLS_D) +{ + int i; + char *http_cookie = NULL; + NSLS_FETCH(); + + i = Ns_SetFind(NSG(conn->headers), "cookie"); + if(i != -1) { + http_cookie = Ns_SetValue(NSG(conn->headers), i); + } + + return http_cookie; +} + +static sapi_module_struct sapi_module = { + "PHP Language", + + php_module_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ + + php_ns_sapi_ub_write, /* unbuffered write */ + + php_error, /* error handler */ + + php_ns_sapi_header_handler, /* header handler */ + php_ns_sapi_send_headers, /* send headers handler */ + NULL, /* send header handler */ + + php_ns_sapi_read_post, /* read POST data */ + php_ns_sapi_read_cookies, /* read Cookies */ + + STANDARD_SAPI_MODULE_PROPERTIES +}; + +static void +php_ns_hash_environment(NSLS_D CLS_DC ELS_DC PLS_DC SLS_DC) +{ + int i; + + for(i = 0; i < Ns_SetSize(NSG(conn->headers)); i++) { + char *key = Ns_SetKey(NSG(conn->headers), i); + char *value = Ns_SetValue(NSG(conn->headers), i); + char *p; + zval *pval; + char buf[512]; + int buf_len; + + buf_len = snprintf(buf, 511, "HTTP_%s", key); + for(p = buf; *p; p++) { + *p = toupper(*p); + if(*p < 'A' || *p > 'Z') { + *p = '_'; + } + } + + MAKE_STD_ZVAL(pval); + pval->type = IS_STRING; + pval->value.str.len = strlen(value); + pval->value.str.val = estrndup(value, pval->value.str.len); + + zend_hash_update(&EG(symbol_table), buf, buf_len + 1, &pval, sizeof(zval *), NULL); + } +} + +static int +php_ns_module_main(NSLS_D SLS_DC) +{ + zend_file_handle file_handle; + CLS_FETCH(); + ELS_FETCH(); + PLS_FETCH(); + + 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_ns_hash_environment(NSLS_C CLS_CC 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 +php_ns_request_ctor(NSLS_D SLS_DC) +{ + char *server; + Ns_DString ds; + char *root; + + server = Ns_ConnServer(NSG(conn)); + + SG(request_info).query_string = NSG(conn->request->query); + + Ns_DStringInit(&ds); + Ns_UrlToFile(&ds, server, NSG(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 = NSG(conn)->request->method; + SG(request_info).content_length = Ns_ConnContentLength(NSG(conn)); + Ns_DStringInit(&NSG(content_type)); + Ns_ConnCopyToDString(NSG(conn), SG(request_info).content_length, &NSG(content_type)); + SG(request_info).content_type = Ns_DStringValue(&NSG(content_type)); + SG(request_info).auth_user = NULL; + SG(request_info).auth_password = NULL; +} + +static void +php_ns_request_dtor(NSLS_D SLS_DC) +{ + free(SG(request_info).path_translated); + Ns_DStringFree(&NSG(content_type)); +} + +static int +php_ns_request_handler(void *context, Ns_Conn *conn) +{ + int status = NS_OK; + SLS_FETCH(); + NSLS_FETCH(); + + NSG(conn) = conn; + + php_ns_request_ctor(NSLS_C SLS_CC); + + status = php_ns_module_main(NSLS_C SLS_CC); + + php_ns_request_dtor(NSLS_C SLS_CC); + + return status; +} + +static void +php_ns_config(php_ns_context *ctx) +{ + int i; + char *path; + Ns_Set *set; + + path = Ns_ConfigPath(ctx->ns_server, ctx->ns_module, NULL); + set = Ns_ConfigGetSection(path); + + for(i = 0; set && i < Ns_SetSize(set); i++) { + char *key = Ns_SetKey(set, i); + char *value = Ns_SetValue(set, i); + + if(!strcasecmp(key, "map")) { + Ns_Log(Notice, "Registering PHP for \"%s\"", value); + Ns_RegisterRequest(ctx->ns_server, "GET", value, php_ns_request_handler, NULL, ctx, 0); + Ns_RegisterRequest(ctx->ns_server, "POST", value, php_ns_request_handler, NULL, ctx, 0); + Ns_RegisterRequest(ctx->ns_server, "HEAD", value, php_ns_request_handler, NULL, ctx, 0); + } else if(!strcasecmp(key, "php_value")) { + char *val; + + val = strchr(value, ' '); + if(val) { + char *new_key; + + new_key = estrndup(value, val - value); + + do { + val++; + } while(*val == ' '); + + Ns_Log(Debug, "PHP configuration option '%s=%s'", new_key, val); + php_alter_ini_entry(new_key, strlen(new_key) + 1, val, + strlen(val) + 1, PHP_INI_SYSTEM); + + efree(new_key); + } + } + + } +} + +static void +php_ns_server_shutdown(void *context) +{ + php_ns_context *ctx = (php_ns_context *) context; + + ctx->sapi_module->shutdown(ctx->sapi_module); + sapi_shutdown(); + tsrm_shutdown(); + + free(ctx->ns_module); + free(ctx->ns_server); + free(ctx); +} + +int Ns_ModuleInit(char *server, char *module) +{ + php_ns_context *ctx; + + tsrm_startup(1, 1, 0); + sapi_startup(&sapi_module); + sapi_module.startup(&sapi_module); + + ns_globals_id = ts_allocate_id(sizeof(ns_globals_struct), NULL, NULL); + + ctx = malloc(sizeof *ctx); + ctx->sapi_module = &sapi_module; + ctx->ns_server = strdup(server); + ctx->ns_module = strdup(module); + + php_ns_config(ctx); + + Ns_RegisterServerShutdown(server, php_ns_server_shutdown, ctx); + + return NS_OK; +} + +#endif diff --git a/sapi/nsapi/config.m4 b/sapi/nsapi/config.m4 new file mode 100644 index 0000000000..854785df04 --- /dev/null +++ b/sapi/nsapi/config.m4 @@ -0,0 +1,26 @@ +dnl ## $Id$ -*- sh -*- + +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) + PHP_SAPI=nsapi + SAPI_TARGET=php4_nsapi.so + INSTALL_IT="\$(SHELL) \$(srcdir)/install-sh -m 0755 $SAPI_TARGET $NS_DIR/root/bin/$SAPI_TARGET" + RESULT=yes +]) +AC_MSG_RESULT($RESULT) + +dnl ## Local Variables: +dnl ## tab-width: 4 +dnl ## End: |
