diff options
Diffstat (limited to 'fhttpd.c')
-rw-r--r-- | fhttpd.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/fhttpd.c b/fhttpd.c new file mode 100644 index 0000000000..46d7551b27 --- /dev/null +++ b/fhttpd.c @@ -0,0 +1,199 @@ +/* + +----------------------------------------------------------------------+ + | PHP HTML Embedded Scripting Language Version 3.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997,1998 PHP Development Team (See Credits file) | + +----------------------------------------------------------------------+ + | This program is free software; you can redistribute it and/or modify | + | it under the terms of one of the following licenses: | + | | + | A) the GNU General Public License as published by the Free Software | + | Foundation; either version 2 of the License, or (at your option) | + | any later version. | + | | + | B) the PHP License as published by the PHP Development Team and | + | included in the distribution in the file: LICENSE | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU General Public License for more details. | + | | + | You should have received a copy of both licenses referred to here. | + | If you did not, or have any questions about PHP licensing, please | + | contact core@php.net. | + +----------------------------------------------------------------------+ + | Author: Alex Belits <abelits@phobos.illtel.denver.co.us> | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ +#ifdef THREAD_SAFE +#include "tls.h" +#endif +#include "php.h" + +#include <stdlib.h> +#if HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <string.h> +#include <errno.h> +#include <ctype.h> + +#if FHTTPD +#include <servproc.h> +#include <signal.h> + +struct http_server *server = NULL; +struct request *req = NULL; +struct httpresponse *response = NULL; +int headermade = 0; +int global_alarmflag = 0; +int idle_timeout = IDLE_TIMEOUT; +int exit_status = 0; +char **currentheader = NULL; +char *headerfirstline = NULL; +int headerlines = 0; +static int headerlinesallocated = 0; + +void alarmhandler(SIGACTARGS) +{ + global_alarmflag = 1; +} + +void setalarm(int t) +{ + struct sigaction tmpsigaction; + global_alarmflag = 0; + if (t){ + bzero((char *) &tmpsigaction, sizeof(struct sigaction)); + tmpsigaction.sa_handler = alarmhandler; + sigaddset(&tmpsigaction.sa_mask, SIGALRM); + tmpsigaction.sa_flags = 0; + sigaction(SIGALRM, &tmpsigaction, NULL); + alarm(t); + } +} + +int checkinput(int h) +{ + fd_set readfd; + FD_ZERO(&readfd); + FD_SET(h, &readfd); + return select(h + 1, &readfd, NULL, NULL, NULL) > 0; +} + + +PHPAPI void php3_fhttpd_free_header(void) +{ + int i; + + if (headerfirstline) { + free(headerfirstline); + headerfirstline = NULL; + } + if (currentheader) { + for (i = 0; i < headerlines; i++) { + free(currentheader[i]); + } + free(currentheader); + currentheader = NULL; + } + headerlines = 0; + headerlinesallocated = 0; + headermade = 0; +} + + +PHPAPI void php3_fhttpd_puts_header(char *s) +{ + char *p0, *p1, *p2, *p3, **p; + int l; + + if (!s || !*s || *s == '\r' || *s == '\n') + return; + l = strlen(s); + p2 = strchr(s, '\r'); + p3 = strchr(s, '\n'); + p0 = strchr(s, ':'); + p1 = strchr(s, ' '); + if (p0 && (!p1 || p1 > p0)) { + if (!headerlinesallocated) { + currentheader = (char **) malloc(10 * sizeof(char *)); + if (currentheader) + headerlinesallocated = 10; + } else { + if (headerlinesallocated <= headerlines) { + p = (char **) realloc(currentheader, (headerlinesallocated + 10) * sizeof(char *)); + if (p) { + currentheader = p; + headerlinesallocated += 10; + } + } + } + + if (headerlinesallocated > headerlines) { + currentheader[headerlines] = malloc(l + 3); + if (currentheader[headerlines]) { + strcpy(currentheader[headerlines], s); + if (!p3) { + if (p2) { + (currentheader[headerlines] + (p2 - s))[1] = '\n'; + (currentheader[headerlines] + (p2 - s))[2] = 0; + } else { + currentheader[headerlines][l] = '\r'; + currentheader[headerlines][l + 1] = '\n'; + currentheader[headerlines][l + 2] = 0; + } + } + headerlines++; + headermade = 1; + } + } + } else { + if (headerfirstline) + free(headerfirstline); + headerfirstline = malloc(l + 3); + if (headerfirstline) { + strcpy(headerfirstline, s); + if (!p3) { + if (p2) { + (headerfirstline + (p2 - s))[1] = '\n'; + (headerfirstline + (p2 - s))[2] = 0; + } else { + headerfirstline[l] = '\r'; + headerfirstline[l + 1] = '\n'; + headerfirstline[l + 2] = 0; + } + } + } + headermade = 1; + } +} + +void fhttpd_flush( /*GLOBAL(php3_rqst)->connection */ void) +{ +} + +PHPAPI void php3_fhttpd_puts(char *s) +{ + putlinetoresponse(response, s); +} + +PHPAPI void php3_fhttpd_putc(char c) +{ + writetoresponse(response, &c, 1); +} + +PHPAPI int php3_fhttpd_write(char *a, int n) +{ + return writetoresponse(response, a, n); +} +#endif +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ |