summaryrefslogtreecommitdiff
path: root/sapi/thttpd/thttpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sapi/thttpd/thttpd.c')
-rw-r--r--sapi/thttpd/thttpd.c299
1 files changed, 0 insertions, 299 deletions
diff --git a/sapi/thttpd/thttpd.c b/sapi/thttpd/thttpd.c
deleted file mode 100644
index a9fe305b03..0000000000
--- a/sapi/thttpd/thttpd.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP version 4.0 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 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_02.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> |
- +----------------------------------------------------------------------+
-*/
-
-
-#include "php.h"
-#include "SAPI.h"
-#include "php_main.h"
-#include "php_thttpd.h"
-#include "version.h"
-
-typedef struct {
- httpd_conn *hc;
- int post_off;
-} php_thttpd_globals;
-
-static php_thttpd_globals thttpd_globals;
-
-#define TLS_D
-#define TLS_DC
-#define TLS_C
-#define TLS_CC
-#define TG(v) (thttpd_globals.v)
-#define TLS_FETCH()
-
-static int sapi_thttpd_ub_write(const char *str, uint str_length)
-{
- TLS_FETCH();
-
- return send(TG(hc)->conn_fd, str, str_length, 0);
-}
-
-static int sapi_thttpd_send_headers(sapi_headers_struct *sapi_headers SLS_DC)
-{
- char buf[1024];
-
- if (!SG(sapi_headers).http_status_line) {
- snprintf(buf, 1023, "HTTP/1.0 %d Something\r\n", SG(sapi_headers).http_response_code);
- send(TG(hc)->conn_fd, buf, strlen(buf), 0);
- }
-
- return SAPI_HEADER_DO_SEND;
-}
-
-static void sapi_thttpd_send_header(sapi_header_struct *sapi_header, void *server_context)
-{
- TLS_FETCH();
-
- if (sapi_header)
- send(TG(hc)->conn_fd, sapi_header->header, sapi_header->header_len, 0);
- send(TG(hc)->conn_fd, "\r\n", sizeof("\r\n") - 1, 0);
-}
-
-static int sapi_thttpd_read_post(char *buffer, uint count_bytes SLS_DC)
-{
- size_t read_bytes = 0, tmp;
- int c;
- TLS_FETCH();
-
- /* to understand this, read cgi_interpose_input() in libhttpd.c */
- c = TG(hc)->read_idx - TG(hc)->checked_idx;
- if (c > 0) {
- read_bytes = MIN(c, count_bytes);
- memcpy(buffer, TG(hc)->read_buf + TG(hc)->checked_idx, read_bytes);
- TG(hc)->checked_idx += read_bytes;
- count_bytes -= read_bytes;
- }
-
- count_bytes = MIN(count_bytes,
- SG(request_info).content_length - SG(read_post_bytes) - TG(post_off));
-
- while (read_bytes < count_bytes) {
- tmp = recv(TG(hc)->conn_fd, buffer + read_bytes,
- count_bytes - read_bytes, 0);
- if (tmp <= 0)
- break;
- read_bytes += tmp;
- }
-
- return read_bytes;
-}
-
-static char *sapi_thttpd_read_cookies(SLS_D)
-{
- TLS_FETCH();
-
- return TG(hc)->cookie;
-}
-
-static sapi_module_struct sapi_module = {
- "thttpd",
- "thttpd",
-
- php_module_startup,
- php_module_shutdown_wrapper,
-
- NULL, /* activate */
- NULL, /* deactivate */
-
- sapi_thttpd_ub_write,
- NULL,
- NULL, /* get uid */
- NULL, /* getenv */
-
- php_error,
-
- NULL,
- sapi_thttpd_send_headers,
- sapi_thttpd_send_header,
- sapi_thttpd_read_post,
- sapi_thttpd_read_cookies,
-
- NULL, /* register server variables */
- NULL, /* Log message */
-
- NULL, /* Block interruptions */
- NULL, /* Unblock interruptions */
-
- STANDARD_SAPI_MODULE_PROPERTIES
-};
-
-#define BUF_SIZE 512
-#define ADD_STRING(name) \
- MAKE_STD_ZVAL(pval); \
- pval->type = IS_STRING; \
- pval->value.str.len = strlen(buf); \
- pval->value.str.val = estrndup(buf, pval->value.str.len); \
- zend_hash_update(&EG(symbol_table), name, sizeof(name), \
- &pval, sizeof(zval *), NULL)
-
-static void thttpd_hash_environment(void)
-{
- char buf[BUF_SIZE + 1];
- zval *pval;
-
- buf[BUF_SIZE] = '\0';
-
- strncpy(buf, SERVER_SOFTWARE, BUF_SIZE);
- ADD_STRING("SERVER_SOFTWARE");
-
- strncpy(buf, "CGI/1.1", BUF_SIZE);
- ADD_STRING("GATEWAY_INTERFACE");
-
- snprintf(buf, BUF_SIZE, "%d", TG(hc)->hs->port);
- ADD_STRING("SERVER_PORT");
-
- strncpy(buf, SG(request_info).request_method, BUF_SIZE);
- ADD_STRING("REQUEST_METHOD");
-
- strncpy(buf, SG(request_info).request_uri, BUF_SIZE);
- ADD_STRING("REQUEST_URI");
-
- snprintf(buf, BUF_SIZE, "/%s", TG(hc)->pathinfo);
- ADD_STRING("PATH_INFO");
-
- strncpy(buf, SG(request_info).path_translated, BUF_SIZE);
- ADD_STRING("PATH_TRANSLATED");
-
- snprintf(buf, BUF_SIZE, "/%s", TG(hc)->origfilename);
- ADD_STRING("SCRIPT_NAME");
-
- strncpy(buf, inet_ntoa(TG(hc)->client_addr.sa_in.sin_addr), BUF_SIZE);
- ADD_STRING("REMOTE_ADDR");
- ADD_STRING("REMOTE_HOST");
-
-#define CONDADD(name, field) \
- if (TG(hc)->field[0]) { \
- strncpy(buf, TG(hc)->field, BUF_SIZE); \
- ADD_STRING(#name); \
- }
-
- CONDADD(HTTP_REFERER, referer);
- CONDADD(HTTP_USER_AGENT, useragent);
- CONDADD(HTTP_ACCEPT, accept);
- CONDADD(HTTP_ACCEPT_ENCODING, accepte);
- CONDADD(HTTP_COOKIE, cookie);
- CONDADD(CONTENT_TYPE, contenttype);
- CONDADD(REMOTE_USER, remoteuser);
- CONDADD(SERVER_PROTOCOL, protocol);
-
- if (TG(hc)->contentlength != -1) {
- sprintf(buf, "%ld", (long) TG(hc)->contentlength);
- ADD_STRING("CONTENT_LENGTH");
- }
-
- if (TG(hc)->authorization[0]) {
- strcpy(buf, "Basic");
- ADD_STRING("AUTH_TYPE");
- }
-}
-
-static void thttpd_module_main(TLS_D SLS_DC)
-{
- zend_file_handle file_handle;
- CLS_FETCH();
- ELS_FETCH();
- PLS_FETCH();
-
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.filename = TG(hc)->expnfilename;
- file_handle.free_filename = 0;
-
- if (php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC) == FAILURE) {
- return;
- }
-
- thttpd_hash_environment();
- php_execute_script(&file_handle CLS_CC ELS_CC PLS_CC);
- php_request_shutdown(NULL);
-}
-
-static void thttpd_request_ctor(TLS_D SLS_DC)
-{
- char *cp2;
- int l;
- char buf[1024];
- int offset;
- size_t pathinfo_len;
- size_t cwd_len;
-
- pathinfo_len = strlen(TG(hc)->pathinfo);
- cwd_len = strlen(TG(hc)->hs->cwd);
-
- SG(request_info).query_string = TG(hc)->query;
-
- l = cwd_len + pathinfo_len + 1;
- cp2 = (char *) malloc(l);
- sprintf(cp2, "%s%s", TG(hc)->hs->cwd, TG(hc)->pathinfo);
- SG(request_info).path_translated = cp2;
-
- snprintf(buf, 1023, "/%s", TG(hc)->origfilename);
- SG(request_info).request_uri = strdup(buf);
- SG(request_info).request_method = httpd_method_str(TG(hc)->method);
-
- SG(request_info).content_type = TG(hc)->contenttype;
- SG(request_info).content_length = TG(hc)->contentlength;
-
- SG(request_info).auth_user = NULL;
- SG(request_info).auth_password = NULL;
-
- TG(post_off) = TG(hc)->read_idx - TG(hc)->checked_idx;
-
- /* avoid feeding \r\n from POST data to SAPI */
- offset = TG(post_off) - SG(request_info).content_length;
-
- if (offset > 0) {
- TG(post_off) -= offset;
- TG(hc)->read_idx -= offset;
- }
-}
-
-static void thttpd_request_dtor(TLS_D SLS_DC)
-{
- free(SG(request_info).request_uri);
- free(SG(request_info).path_translated);
-}
-
-off_t thttpd_php_request(httpd_conn *hc)
-{
- SLS_FETCH();
- TLS_FETCH();
-
- TG(hc) = hc;
-
- thttpd_request_ctor(TLS_C SLS_CC);
-
- thttpd_module_main(TLS_C SLS_CC);
-
- thttpd_request_dtor(TLS_C SLS_CC);
-
- return 0;
-}
-
-void thttpd_php_init(void)
-{
- sapi_startup(&sapi_module);
- sapi_module.startup(&sapi_module);
- SG(server_context) = (void *) 1;
-}
-
-void thttpd_php_shutdown(void)
-{
- sapi_module.shutdown(&sapi_module);
- sapi_shutdown();
-}