diff options
-rw-r--r-- | networking/httpd.c | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index 8ad7e88b1..12bad597a 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
@@ -5,23 +5,20 @@ | |||
5 | * Copyright (C) 2002,2003 Glenn Engel <glenne@engel.org> | 5 | * Copyright (C) 2002,2003 Glenn Engel <glenne@engel.org> |
6 | * Copyright (C) 2003-2006 Vladimir Oleynik <dzo@simtreas.ru> | 6 | * Copyright (C) 2003-2006 Vladimir Oleynik <dzo@simtreas.ru> |
7 | * | 7 | * |
8 | * simplify patch stolen from libbb without using strdup | ||
9 | * | ||
10 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | 8 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
11 | * | 9 | * |
12 | ***************************************************************************** | 10 | ***************************************************************************** |
13 | * | 11 | * |
14 | * Typical usage: | 12 | * Typical usage: |
15 | * for non root user | 13 | * For non root user: |
16 | * httpd -p 8080 -h $HOME/public_html | 14 | * httpd -p 8080 -h $HOME/public_html |
17 | * or for daemon start from rc script with uid=0: | 15 | * For daemon start from rc script with uid=0: |
18 | * httpd -u www | 16 | * httpd -u www |
19 | * This is equivalent if www user have uid=80 to | 17 | * which is equivalent to (assuming user www has uid 80): |
20 | * httpd -p 80 -u 80 -h /www -c /etc/httpd.conf -r "Web Server Authentication" | 18 | * httpd -p 80 -u 80 -h $PWD -c /etc/httpd.conf -r "Web Server Authentication" |
21 | * | ||
22 | * | 19 | * |
23 | * When an url starts by "/cgi-bin/" it is assumed to be a cgi script. The | 20 | * When an url starts with "/cgi-bin/" it is assumed to be a cgi script. |
24 | * server changes directory to the location of the script and executes it | 21 | * The server changes directory to the location of the script and executes it |
25 | * after setting QUERY_STRING and other environment variables. | 22 | * after setting QUERY_STRING and other environment variables. |
26 | * | 23 | * |
27 | * Doc: | 24 | * Doc: |
@@ -29,8 +26,8 @@ | |||
29 | * | 26 | * |
30 | * The applet can also be invoked as an url arg decoder and html text encoder | 27 | * The applet can also be invoked as an url arg decoder and html text encoder |
31 | * as follows: | 28 | * as follows: |
32 | * foo=`httpd -d $foo` # decode "Hello%20World" as "Hello World" | 29 | * foo=`httpd -d $foo` # decode "Hello%20World" as "Hello World" |
33 | * bar=`httpd -e "<Hello World>"` # encode as "<Hello World>" | 30 | * bar=`httpd -e "<Hello World>"` # encode as "<Hello World>" |
34 | * Note that url encoding for arguments is not the same as html encoding for | 31 | * Note that url encoding for arguments is not the same as html encoding for |
35 | * presentation. -d decodes an url-encoded argument while -e encodes in html | 32 | * presentation. -d decodes an url-encoded argument while -e encodes in html |
36 | * for page display. | 33 | * for page display. |
@@ -100,15 +97,14 @@ | |||
100 | #if ENABLE_FEATURE_HTTPD_USE_SENDFILE | 97 | #if ENABLE_FEATURE_HTTPD_USE_SENDFILE |
101 | # include <sys/sendfile.h> | 98 | # include <sys/sendfile.h> |
102 | #endif | 99 | #endif |
103 | |||
104 | #define DEBUG 0 | ||
105 | |||
106 | #define IOBUF_SIZE 8192 /* IO buffer */ | ||
107 | |||
108 | /* amount of buffering in a pipe */ | 100 | /* amount of buffering in a pipe */ |
109 | #ifndef PIPE_BUF | 101 | #ifndef PIPE_BUF |
110 | # define PIPE_BUF 4096 | 102 | # define PIPE_BUF 4096 |
111 | #endif | 103 | #endif |
104 | |||
105 | #define DEBUG 0 | ||
106 | |||
107 | #define IOBUF_SIZE 8192 | ||
112 | #if PIPE_BUF >= IOBUF_SIZE | 108 | #if PIPE_BUF >= IOBUF_SIZE |
113 | # error "PIPE_BUF >= IOBUF_SIZE" | 109 | # error "PIPE_BUF >= IOBUF_SIZE" |
114 | #endif | 110 | #endif |
@@ -118,6 +114,7 @@ | |||
118 | static const char DEFAULT_PATH_HTTPD_CONF[] ALIGN1 = "/etc"; | 114 | static const char DEFAULT_PATH_HTTPD_CONF[] ALIGN1 = "/etc"; |
119 | static const char HTTPD_CONF[] ALIGN1 = "httpd.conf"; | 115 | static const char HTTPD_CONF[] ALIGN1 = "httpd.conf"; |
120 | static const char HTTP_200[] ALIGN1 = "HTTP/1.0 200 OK\r\n"; | 116 | static const char HTTP_200[] ALIGN1 = "HTTP/1.0 200 OK\r\n"; |
117 | static const char index_html[] ALIGN1 = "index.html"; | ||
121 | 118 | ||
122 | typedef struct has_next_ptr { | 119 | typedef struct has_next_ptr { |
123 | struct has_next_ptr *next; | 120 | struct has_next_ptr *next; |
@@ -170,7 +167,6 @@ enum { | |||
170 | HTTP_PAYMENT_REQUIRED = 402, | 167 | HTTP_PAYMENT_REQUIRED = 402, |
171 | HTTP_BAD_GATEWAY = 502, | 168 | HTTP_BAD_GATEWAY = 502, |
172 | HTTP_SERVICE_UNAVAILABLE = 503, /* overload, maintenance */ | 169 | HTTP_SERVICE_UNAVAILABLE = 503, /* overload, maintenance */ |
173 | HTTP_RESPONSE_SETSIZE = 0xffffffff | ||
174 | #endif | 170 | #endif |
175 | }; | 171 | }; |
176 | 172 | ||
@@ -231,9 +227,6 @@ static const struct { | |||
231 | #endif | 227 | #endif |
232 | }; | 228 | }; |
233 | 229 | ||
234 | static const char index_html[] ALIGN1 = "index.html"; | ||
235 | |||
236 | |||
237 | struct globals { | 230 | struct globals { |
238 | int verbose; /* must be int (used by getopt32) */ | 231 | int verbose; /* must be int (used by getopt32) */ |
239 | smallint flg_deny_all; | 232 | smallint flg_deny_all; |
@@ -777,7 +770,7 @@ static char *encodeString(const char *string) | |||
777 | char *p = out; | 770 | char *p = out; |
778 | char ch; | 771 | char ch; |
779 | 772 | ||
780 | while ((ch = *string++)) { | 773 | while ((ch = *string++) != '\0') { |
781 | /* very simple check for what to encode */ | 774 | /* very simple check for what to encode */ |
782 | if (isalnum(ch)) | 775 | if (isalnum(ch)) |
783 | *p++ = ch; | 776 | *p++ = ch; |
@@ -787,7 +780,7 @@ static char *encodeString(const char *string) | |||
787 | *p = '\0'; | 780 | *p = '\0'; |
788 | return out; | 781 | return out; |
789 | } | 782 | } |
790 | #endif /* FEATURE_HTTPD_ENCODE_URL_STR */ | 783 | #endif |
791 | 784 | ||
792 | /* | 785 | /* |
793 | * Given a URL encoded string, convert it to plain ascii. | 786 | * Given a URL encoded string, convert it to plain ascii. |
@@ -814,12 +807,12 @@ static unsigned hex_to_bin(unsigned char c) | |||
814 | if (v <= 5) | 807 | if (v <= 5) |
815 | return v + 10; | 808 | return v + 10; |
816 | return ~0; | 809 | return ~0; |
817 | } | ||
818 | /* For testing: | 810 | /* For testing: |
819 | void t(char c) { printf("'%c'(%u) %u\n", c, c, hex_to_bin(c)); } | 811 | void t(char c) { printf("'%c'(%u) %u\n", c, c, hex_to_bin(c)); } |
820 | int main() { t(0x10); t(0x20); t('0'); t('9'); t('A'); t('F'); t('a'); t('f'); | 812 | int main() { t(0x10); t(0x20); t('0'); t('9'); t('A'); t('F'); t('a'); t('f'); |
821 | t('0'-1); t('9'+1); t('A'-1); t('F'+1); t('a'-1); t('f'+1); return 0; } | 813 | t('0'-1); t('9'+1); t('A'-1); t('F'+1); t('a'-1); t('f'+1); return 0; } |
822 | */ | 814 | */ |
815 | } | ||
823 | static char *decodeString(char *orig, int option_d) | 816 | static char *decodeString(char *orig, int option_d) |
824 | { | 817 | { |
825 | /* note that decoded string is always shorter than original */ | 818 | /* note that decoded string is always shorter than original */ |
@@ -1964,7 +1957,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) | |||
1964 | if (http_major_version >= '0') { | 1957 | if (http_major_version >= '0') { |
1965 | /* Request was with "... HTTP/nXXX", and n >= 0 */ | 1958 | /* Request was with "... HTTP/nXXX", and n >= 0 */ |
1966 | 1959 | ||
1967 | /* Read until blank line for HTTP version specified, else parse immediate */ | 1960 | /* Read until blank line */ |
1968 | while (1) { | 1961 | while (1) { |
1969 | if (!get_line()) | 1962 | if (!get_line()) |
1970 | break; /* EOF or error or empty line */ | 1963 | break; /* EOF or error or empty line */ |
@@ -1991,9 +1984,9 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) | |||
1991 | if ((STRNCASECMP(iobuf, "Content-length:") == 0)) { | 1984 | if ((STRNCASECMP(iobuf, "Content-length:") == 0)) { |
1992 | /* extra read only for POST */ | 1985 | /* extra read only for POST */ |
1993 | if (prequest != request_GET | 1986 | if (prequest != request_GET |
1994 | #if ENABLE_FEATURE_HTTPD_CGI | 1987 | # if ENABLE_FEATURE_HTTPD_CGI |
1995 | && prequest != request_HEAD | 1988 | && prequest != request_HEAD |
1996 | #endif | 1989 | # endif |
1997 | ) { | 1990 | ) { |
1998 | tptr = skip_whitespace(iobuf + sizeof("Content-length:") - 1); | 1991 | tptr = skip_whitespace(iobuf + sizeof("Content-length:") - 1); |
1999 | if (!tptr[0]) | 1992 | if (!tptr[0]) |
@@ -2183,9 +2176,9 @@ static void mini_httpd(int server_socket) | |||
2183 | /* Wait for connections... */ | 2176 | /* Wait for connections... */ |
2184 | fromAddr.len = LSA_SIZEOF_SA; | 2177 | fromAddr.len = LSA_SIZEOF_SA; |
2185 | n = accept(server_socket, &fromAddr.u.sa, &fromAddr.len); | 2178 | n = accept(server_socket, &fromAddr.u.sa, &fromAddr.len); |
2186 | |||
2187 | if (n < 0) | 2179 | if (n < 0) |
2188 | continue; | 2180 | continue; |
2181 | |||
2189 | /* set the KEEPALIVE option to cull dead connections */ | 2182 | /* set the KEEPALIVE option to cull dead connections */ |
2190 | setsockopt(n, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1)); | 2183 | setsockopt(n, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1)); |
2191 | 2184 | ||
@@ -2226,9 +2219,9 @@ static void mini_httpd_nommu(int server_socket, int argc, char **argv) | |||
2226 | /* Wait for connections... */ | 2219 | /* Wait for connections... */ |
2227 | fromAddr.len = LSA_SIZEOF_SA; | 2220 | fromAddr.len = LSA_SIZEOF_SA; |
2228 | n = accept(server_socket, &fromAddr.u.sa, &fromAddr.len); | 2221 | n = accept(server_socket, &fromAddr.u.sa, &fromAddr.len); |
2229 | |||
2230 | if (n < 0) | 2222 | if (n < 0) |
2231 | continue; | 2223 | continue; |
2224 | |||
2232 | /* set the KEEPALIVE option to cull dead connections */ | 2225 | /* set the KEEPALIVE option to cull dead connections */ |
2233 | setsockopt(n, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1)); | 2226 | setsockopt(n, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1)); |
2234 | 2227 | ||