From 04af453e72a264047a49d3fd257f631f4775be02 Mon Sep 17 00:00:00 2001 From: matsutsuka Date: Wed, 28 Nov 2007 09:40:13 +0000 Subject: [PATCH] Special version of web server that consumes less memory. --- .../webserver-mini/Makefile.webserver-mini | 2 + .../pc-6001/apps/webserver-mini/http-strings | 34 ++ .../apps/webserver-mini/http-strings.c | 36 ++ .../apps/webserver-mini/http-strings.h | 34 ++ .../pc-6001/apps/webserver-mini/httpd-cfs.c | 218 +++++++++++ .../pc-6001/apps/webserver-mini/httpd-cfs.h | 56 +++ .../pc-6001/apps/webserver-mini/httpd-cgi.c | 246 +++++++++++++ .../pc-6001/apps/webserver-mini/httpd-cgi.h | 57 +++ .../pc-6001/apps/webserver-mini/httpd-fs.c | 131 +++++++ .../pc-6001/apps/webserver-mini/httpd-fs.h | 59 +++ .../apps/webserver-mini/httpd-fs/404.html | 1 + .../apps/webserver-mini/httpd-fs/index.html | 1 + .../apps/webserver-mini/httpd-fsdata.c | 50 +++ .../apps/webserver-mini/httpd-fsdata.h | 64 ++++ platform/pc-6001/apps/webserver-mini/httpd.c | 344 ++++++++++++++++++ platform/pc-6001/apps/webserver-mini/httpd.h | 77 ++++ .../apps/webserver-mini/webserver-nogui.c | 60 +++ .../apps/webserver-mini/webserver-nogui.h | 53 +++ 18 files changed, 1523 insertions(+) create mode 100644 platform/pc-6001/apps/webserver-mini/Makefile.webserver-mini create mode 100644 platform/pc-6001/apps/webserver-mini/http-strings create mode 100644 platform/pc-6001/apps/webserver-mini/http-strings.c create mode 100644 platform/pc-6001/apps/webserver-mini/http-strings.h create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-cfs.c create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-cfs.h create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-cgi.c create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-cgi.h create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fs.c create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fs.h create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fs/404.html create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fs/index.html create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fsdata.c create mode 100644 platform/pc-6001/apps/webserver-mini/httpd-fsdata.h create mode 100644 platform/pc-6001/apps/webserver-mini/httpd.c create mode 100644 platform/pc-6001/apps/webserver-mini/httpd.h create mode 100644 platform/pc-6001/apps/webserver-mini/webserver-nogui.c create mode 100644 platform/pc-6001/apps/webserver-mini/webserver-nogui.h diff --git a/platform/pc-6001/apps/webserver-mini/Makefile.webserver-mini b/platform/pc-6001/apps/webserver-mini/Makefile.webserver-mini new file mode 100644 index 000000000..3d6b8babe --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/Makefile.webserver-mini @@ -0,0 +1,2 @@ +webserver-mini_src = webserver-nogui.c httpd.c http-strings.c psock.c memb.c \ + httpd-fs.c httpd-cgi.c diff --git a/platform/pc-6001/apps/webserver-mini/http-strings b/platform/pc-6001/apps/webserver-mini/http-strings new file mode 100644 index 000000000..6a3fba34f --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/http-strings @@ -0,0 +1,34 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\nServer: Contiki/2.0\nConnection: close\n" +http_header_404 "HTTP/1.0 404 Not found\nServer: Contiki/2.0\nConnection: close\n" +http_content_type_plain "Content-type: text/plain\n\n" +http_content_type_html "Content-type: text/html\n\n" +http_content_type_css "Content-type: text/css\n\n" +http_content_type_text "Content-type: text/text\n\n" +http_content_type_png "Content-type: image/png\n\n" +http_content_type_gif "Content-type: image/gif\n\n" +http_content_type_jpg "Content-type: image/jpeg\n\n" +http_content_type_binary "Content-type: application/octet-stream\n\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".text" +http_txt ".txt" diff --git a/platform/pc-6001/apps/webserver-mini/http-strings.c b/platform/pc-6001/apps/webserver-mini/http-strings.c new file mode 100644 index 000000000..924f15f12 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/http-strings.c @@ -0,0 +1,36 @@ +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[55] = +/* "HTTP/1.0 200 OK\nServer: Contiki/2.0\nConnection: close\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6b, 0x69, 0x2f, 0x32, 0x2e, 0x30, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xa, }; +const char http_header_404[62] = +/* "HTTP/1.0 404 Not found\nServer: Contiki/2.0\nConnection: close\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6b, 0x69, 0x2f, 0x32, 0x2e, 0x30, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xa, }; +const char http_content_type_plain[27] = +/* "Content-type: text/plain\n\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xa, 0xa, }; +const char http_content_type_html[26] = +/* "Content-type: text/html\n\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0xa, }; +const char http_content_type_binary[41] = +/* "Content-type: application/octet-stream\n\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xa, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; diff --git a/platform/pc-6001/apps/webserver-mini/http-strings.h b/platform/pc-6001/apps/webserver-mini/http-strings.h new file mode 100644 index 000000000..8da08cad6 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[2]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[55]; +extern const char http_header_404[62]; +extern const char http_content_type_plain[27]; +extern const char http_content_type_html[26]; +extern const char http_content_type_css [25]; +extern const char http_content_type_text[26]; +extern const char http_content_type_png [26]; +extern const char http_content_type_gif [26]; +extern const char http_content_type_jpg [27]; +extern const char http_content_type_binary[41]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[6]; +extern const char http_txt[5]; diff --git a/platform/pc-6001/apps/webserver-mini/httpd-cfs.c b/platform/pc-6001/apps/webserver-mini/httpd-cfs.c new file mode 100644 index 000000000..bdc5d5bcd --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-cfs.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: httpd-cfs.c,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + */ + +#include + +#include "contiki-net.h" +#include "cfs/cfs.h" + +#include "webserver.h" +#include "libconio_arch-small.h" + +#include "httpd-cfs.h" + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define SEND_STRING(s, str) PSOCK_SEND(s, str, strlen(str)) +MEMB(conns, struct httpd_state, 2); + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + /* Read data from file system into buffer */ + s->len = cfs_read(s->fd, s->outputbuf, sizeof(s->outputbuf)); + + /* If there is data in the buffer, send it */ + if(s->len > 0) { + PSOCK_SEND(&s->sout, s->outputbuf, s->len); + } else { + break; + } + } while(s->len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + SEND_STRING(&s->sout, statushdr); + SEND_STRING(&s->sout, "Server: " CONTIKI_VERSION_STRING "\r\n"); + + ptr = strrchr(s->filename, '.'); + if(ptr == NULL) { + SEND_STRING(&s->sout, "Content-type: text/plain\r\n\r\n"); + } else if(strncmp(".html", ptr, 5) == 0) { + SEND_STRING(&s->sout, "Content-type: text/html\r\n\r\n"); + } else if(strncmp(".css", ptr, 4) == 0) { + SEND_STRING(&s->sout, "Content-type: text/css\r\n\r\n"); + } else if(strncmp(".png", ptr, 4) == 0) { + SEND_STRING(&s->sout, "Content-type: image/png\r\n\r\n"); + } else if(strncmp(".jpg", ptr, 4) == 0) { + SEND_STRING(&s->sout, "Content-type: image/jpeg\r\n\r\n"); + } else { + SEND_STRING(&s->sout, "Content-type: application/octet-stream\r\n\r\n"); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + PT_BEGIN(&s->outputpt); + + s->fd = cfs_open(s->filename, CFS_READ); + if(s->fd < 0) { + s->fd = cfs_open("404.html", CFS_READ); + if(s->fd < 0) { + uip_abort(); + PT_EXIT(&s->outputpt); + } + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, "HTTP/1.0 404 Not found\r\n")); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, "HTTP/1.0 200 OK\r\n")); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + cfs_close(s->fd); + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ' '); + + if(strncmp(s->inputbuf, "GET ", 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ' '); + + if(s->inputbuf[0] != '/') { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ' ') { + strncpy(s->filename, "index.html", sizeof(s->filename)); + } else { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + strncpy(s->filename, &s->inputbuf[1], sizeof(s->filename)); + } + + // webserver_log_file(&uip_conn->ripaddr, s->filename); + libputs_arch(s->filename); + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, '\n'); + + if(strncmp(s->inputbuf, "Referer:", 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + libputs_arch(&s->inputbuf[9]); + // webserver_log(&s->inputbuf[9]); + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(uip_closed() || uip_aborted() || uip_timedout()) { + if(s != NULL) { + memb_free(&conns, s); + } + } else if(uip_connected()) { + s = (struct httpd_state *)memb_alloc(&conns); + if(s == NULL) { + uip_abort(); + return; + } + tcp_markconn(uip_conn, s); + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + timer_set(&s->timer, CLOCK_SECOND * 10); + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + if(timer_expired(&s->timer)) { + uip_abort(); + } + } else { + timer_reset(&s->timer); + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_init(void) +{ + tcp_listen(HTONS(80)); + memb_init(&conns); +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-cfs.h b/platform/pc-6001/apps/webserver-mini/httpd-cfs.h new file mode 100644 index 000000000..54a78e650 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-cfs.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cfs.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ + +#ifndef __HTTPD_CFS_H__ +#define __HTTPD_CFS_H__ + +#include "contiki-net.h" + +struct httpd_state { + struct timer timer; + struct psock sin, sout; + struct pt outputpt; + char inputbuf[50]; + char outputbuf[UIP_TCP_MSS]; + char filename[20]; + char state; + int fd; + int len; +}; + + +void httpd_init(void); +void httpd_appcall(void *state); + +#endif /* __HTTPD_CFS_H__ */ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-cgi.c b/platform/pc-6001/apps/webserver-mini/httpd-cgi.c new file mode 100644 index 000000000..bffdcf830 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-cgi.c @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ + +/* + * This file includes functions that are called by the web server + * scripts. The functions takes no argument, and the return value is + * interpreted as follows. A zero means that the function did not + * complete and should be invoked for the next packet as well. A + * non-zero value indicates that the function has completed and that + * the web server should move along to the next script line. + * + */ + + +#include "contiki-net.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include "lib/petsciiconv.h" + +#include +#include + + +static struct httpd_cgi_call *calls = NULL; + +/*struct cgifunction { + char *name; + httpd_cgifunction function; +}; + +static struct cgifunction cgitab[] = { + {"file-stats", file_stats}, + {"tcp-connections", tcp_stats}, + {"processes", processes}, + {NULL, NULL} + };*/ + + +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; +static const char none[] = "NONE"; +static const char init[] = "INIT"; +static const char running[] = "RUNNING"; +static const char needs_poll[] = "NEEDS POLL"; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack, + none, + init, + running, + needs_poll}; + + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + struct httpd_cgi_call *f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; f != NULL; f = f->next) { + if(strncmp(f->name, name, strlen(f->name)) == 0) { + return f->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return sprintf((char *)uip_appdata, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, (void *) (strchr(ptr, ' ') + 1)); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +make_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->u.count]; + return sprintf((char *)uip_appdata, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\r\n", + htons(conn->lport), + conn->ripaddr.u8[0], + conn->ripaddr.u8[1], + conn->ripaddr.u8[2], + conn->ripaddr.u8[3], + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->u.count = 0; s->u.count < UIP_CONNS; ++s->u.count) { + if((uip_conns[s->u.count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, make_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +make_processes(void *p) +{ + char name[40]; + + strncpy(name, ((struct process *)p)->name, 40); + petsciiconv_toascii(name, 40); + + return sprintf((char *)uip_appdata, + "%p%s%p%s\r\n", + p, name, + (char *)((struct process *)p)->thread, + states[9 + ((struct process *)p)->state]); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(processes(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + for(s->u.ptr = PROCESS_LIST(); s->u.ptr != NULL; s->u.ptr = ((struct process *)s->u.ptr)->next) { + PSOCK_GENERATOR_SEND(&s->sout, make_processes, s->u.ptr); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +void +httpd_cgi_add(struct httpd_cgi_call *c) +{ + struct httpd_cgi_call *l; + + c->next = NULL; + if(calls == NULL) { + calls = c; + } else { + for(l = calls; l->next != NULL; l = l->next); + l->next = c; + } +} +/*---------------------------------------------------------------------------*/ + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(proc, "processes", processes); + +void +httpd_cgi_init(void) +{ + httpd_cgi_add(&file); + httpd_cgi_add(&tcp); + httpd_cgi_add(&proc); +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-cgi.h b/platform/pc-6001/apps/webserver-mini/httpd-cgi.h new file mode 100644 index 000000000..da04c1491 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-cgi.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "contiki.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + struct httpd_cgi_call *next; + const char *name; + httpd_cgifunction function; +}; + +void httpd_cgi_add(struct httpd_cgi_call *c); + +#define HTTPD_CGI_CALL(name, str, function) \ +static struct httpd_cgi_call name = {NULL, str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fs.c b/platform/pc-6001/apps/webserver-mini/httpd-fs.c new file mode 100644 index 000000000..a1c5e1cad --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fs.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + */ + +#include "contiki-net.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#include "httpd-fsdata.c" +#include "ctk/libconio_arch-small.h" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + +loop: + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + char* ch; + struct httpd_fsdata_file_noconst *f; + + libputs_arch(name); + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t +httpd_fs_count(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fs.h b/platform/pc-6001/apps/webserver-mini/httpd-fs.h new file mode 100644 index 000000000..8252c2482 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fs.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#include "contiki-net.h" + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fs/404.html b/platform/pc-6001/apps/webserver-mini/httpd-fs/404.html new file mode 100644 index 000000000..51e053a23 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fs/404.html @@ -0,0 +1 @@ +

404 - file not found

Contiki PC-6001 \ No newline at end of file diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fs/index.html b/platform/pc-6001/apps/webserver-mini/httpd-fs/index.html new file mode 100644 index 000000000..3255ed2d8 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fs/index.html @@ -0,0 +1 @@ +Contiki on PC-6001

This website is being served by PC-6001 Contiki!

Front page
Network connections
System processes
\ No newline at end of file diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fsdata.c b/platform/pc-6001/apps/webserver-mini/httpd-fsdata.c new file mode 100644 index 000000000..2cfcf9801 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fsdata.c @@ -0,0 +1,50 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, + 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, + 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x2f, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6b, 0x69, + 0x20, 0x50, 0x43, 0x2d, 0x36, 0x30, 0x30, 0x31, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x43, + 0x6f, 0x6e, 0x74, 0x69, 0x6b, 0x69, 0x20, 0x6f, 0x6e, 0x20, + 0x50, 0x43, 0x2d, 0x36, 0x30, 0x30, 0x31, 0x3c, 0x2f, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x68, + 0x33, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x62, 0x65, + 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x50, 0x43, 0x2d, 0x36, 0x30, 0x30, + 0x31, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6b, 0x69, 0x21, + 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x6f, + 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +#define HTTPD_FS_ROOT file_index_html + +#define HTTPD_FS_NUMFILES 2 diff --git a/platform/pc-6001/apps/webserver-mini/httpd-fsdata.h b/platform/pc-6001/apps/webserver-mini/httpd-fsdata.h new file mode 100644 index 000000000..02e418459 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "contiki-net.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/platform/pc-6001/apps/webserver-mini/httpd.c b/platform/pc-6001/apps/webserver-mini/httpd.c new file mode 100644 index 000000000..577990a2f --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + */ + +#include + +#include "contiki-net.h" + +#include "webserver-nogui.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include "httpd.h" +#include "ctk/libconio_arch-small.h" + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define SEND_STRING(s, str) PSOCK_SEND(s, str, (unsigned int)strlen(str)) +MEMB(conns, struct httpd_state, 4); + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +#if HTTPD_CONF_SCRIPT +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + + if((p = strchr(s->scriptptr, ISO_nl)) != NULL) { + p += 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; + } else { + s->scriptlen = 0; + } + /* char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p;*/ +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); +#if HTTPD_CONF_CGI + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); +#endif /* HTTPD_CONF_CGI */ + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + } + } + + PT_END(&s->scriptpt); +} +#endif /* HTTPD_CONF_SCRIPT */ +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + SEND_STRING(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + SEND_STRING(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + SEND_STRING(&s->sout, http_content_type_html); +#if 0 + } else if(strncmp(http_css, ptr, 4) == 0) { + SEND_STRING(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + SEND_STRING(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + SEND_STRING(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + SEND_STRING(&s->sout, http_content_type_jpg); +#endif + } else { + SEND_STRING(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); +#if HTTPD_CONF_SCRIPT + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } +#else /* HTTPD_CONF_SCRIPT */ + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); +#endif /* HTTPD_CONF_SCRIPT */ + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + libputs_arch(s->filename); + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(uip_closed() || uip_aborted() || uip_timedout()) { + if(s != NULL) { + memb_free(&conns, s); + } + } else if(uip_connected()) { + s = (struct httpd_state *)memb_alloc(&conns); + if(s == NULL) { + uip_abort(); + return; + } + tcp_markconn(uip_conn, s); + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + memb_free(&conns, s); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_init(void) +{ + tcp_listen(HTONS(80)); + memb_init(&conns); +#if HTTPD_CONF_CGI + httpd_cgi_init(); +#endif /* HTTPD_CONF_CGI */ +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pc-6001/apps/webserver-mini/httpd.h b/platform/pc-6001/apps/webserver-mini/httpd.h new file mode 100644 index 000000000..0b54011fd --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/httpd.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + + +#include "contiki-net.h" +#include "httpd-fs.h" + +#ifndef HTTPD_CONF_CGI +#define HTTPD_CONF_CGI 1 +#endif +#ifndef HTTPD_CONF_SCRIPT +#define HTTPD_CONF_SCRIPT 1 +#endif + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt +#if HTTPD_CONF_SCRIPT + , scriptpt; +#else + ; +#endif /* HTTPD_CONF_SCRIPT */ + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; +#if HTTPD_CONF_SCRIPT + char *scriptptr; + int scriptlen; +#endif /* HTTPD_CONF_SCRIPT */ + union { + unsigned short count; + void *ptr; + } u; +}; + + +void httpd_init(void); +void httpd_appcall(void *state); + +#endif /* __HTTPD_H__ */ diff --git a/platform/pc-6001/apps/webserver-mini/webserver-nogui.c b/platform/pc-6001/apps/webserver-mini/webserver-nogui.c new file mode 100644 index 000000000..bd9939540 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/webserver-nogui.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the Contiki OS. + * + * $Id: webserver-nogui.c,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ + +#include +#include + +#include "contiki.h" + +#include "http-strings.h" +#include "webserver-nogui.h" +#include "httpd.h" + +PROCESS(webserver_nogui_process, "Web server"); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(webserver_nogui_process, ev, data) +{ + PROCESS_BEGIN(); + + httpd_init(); + + while(1) { + PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event); + httpd_appcall(data); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pc-6001/apps/webserver-mini/webserver-nogui.h b/platform/pc-6001/apps/webserver-mini/webserver-nogui.h new file mode 100644 index 000000000..d46ba7873 --- /dev/null +++ b/platform/pc-6001/apps/webserver-mini/webserver-nogui.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the Contiki OS + * + * $Id: webserver-nogui.h,v 1.1 2007/11/28 09:40:13 matsutsuka Exp $ + * + */ +#ifndef __WEBSERVER_NOGUI_H__ +#define __WEBSERVER_NOGUI_H__ + +#include "contiki-net.h" + +PROCESS_NAME(webserver_nogui_process); + +#ifdef WEBSERVER_CONF_LOG_ENABLED +#define webserver_log(msg) webserver_log(msg) +#define webserver_log_file(requester, file) \ + webserver_log_file(requester, file) +void weblog_message(char *msg); +#else /* WEBSERVER_CONF_LOG_ENABLED */ +void weblog_message(char *msg); +#define webserver_log(msg) +#define webserver_log_file(requester, file) +#endif /* WEBSERVER_CONF_LOG_ENABLED */ + +#endif /* __WEBSERVER_H__ */