]> git.sur5r.net Git - freertos/blob - Demo/uIP_Demo_Rowley_ARM7/uip/cgi.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / uIP_Demo_Rowley_ARM7 / uip / cgi.c
1 /**\r
2  * \addtogroup httpd\r
3  * @{\r
4  */\r
5 \r
6 /**\r
7  * \file\r
8  * HTTP server script language C functions file.\r
9  * \author Adam Dunkels <adam@dunkels.com>\r
10  *\r
11  * This file contains functions that are called by the web server\r
12  * scripts. The functions takes one argument, and the return value is\r
13  * interpreted as follows. A zero means that the function did not\r
14  * complete and should be invoked for the next packet as well. A\r
15  * non-zero value indicates that the function has completed and that\r
16  * the web server should move along to the next script line.\r
17  *\r
18  */\r
19 \r
20 /*\r
21  * Copyright (c) 2001, Adam Dunkels.\r
22  * All rights reserved. \r
23  *\r
24  * Redistribution and use in source and binary forms, with or without \r
25  * modification, are permitted provided that the following conditions \r
26  * are met: \r
27  * 1. Redistributions of source code must retain the above copyright \r
28  *    notice, this list of conditions and the following disclaimer. \r
29  * 2. Redistributions in binary form must reproduce the above copyright \r
30  *    notice, this list of conditions and the following disclaimer in the \r
31  *    documentation and/or other materials provided with the distribution. \r
32  * 3. The name of the author may not be used to endorse or promote\r
33  *    products derived from this software without specific prior\r
34  *    written permission.  \r
35  *\r
36  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\r
37  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
38  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
39  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\r
40  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
41  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\r
42  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
43  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
44  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
45  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
46  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  \r
47  *\r
48  * This file is part of the uIP TCP/IP stack.\r
49  *\r
50  * $Id: cgi.c,v 1.23.2.4 2003/10/07 13:22:27 adam Exp $\r
51  *\r
52  */\r
53 \r
54 #include "uip.h"\r
55 #include "cgi.h"\r
56 #include "httpd.h"\r
57 #include "fs.h"\r
58 \r
59 #include <stdio.h>\r
60 #include <string.h>\r
61 \r
62 static u8_t print_stats(u8_t next);\r
63 static u8_t file_stats(u8_t next);\r
64 static u8_t tcp_stats(u8_t next);\r
65 \r
66 cgifunction cgitab[] = {\r
67   print_stats,   /* CGI function "a" */\r
68   file_stats,    /* CGI function "b" */\r
69   tcp_stats      /* CGI function "c" */\r
70 };\r
71 \r
72 static const char closed[] =   /*  "CLOSED",*/\r
73 {0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};\r
74 static const char syn_rcvd[] = /*  "SYN-RCVD",*/\r
75 {0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, \r
76  0x44,  0};\r
77 static const char syn_sent[] = /*  "SYN-SENT",*/\r
78 {0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, \r
79  0x54,  0};\r
80 static const char established[] = /*  "ESTABLISHED",*/\r
81 {0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, \r
82  0x45, 0x44, 0};\r
83 static const char fin_wait_1[] = /*  "FIN-WAIT-1",*/\r
84 {0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, \r
85  0x54, 0x2d, 0x31, 0};\r
86 static const char fin_wait_2[] = /*  "FIN-WAIT-2",*/\r
87 {0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, \r
88  0x54, 0x2d, 0x32, 0};\r
89 static const char closing[] = /*  "CLOSING",*/\r
90 {0x43, 0x4c, 0x4f, 0x53, 0x49, \r
91  0x4e, 0x47, 0};\r
92 static const char time_wait[] = /*  "TIME-WAIT,"*/\r
93 {0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, \r
94  0x49, 0x54, 0};\r
95 static const char last_ack[] = /*  "LAST-ACK"*/\r
96 {0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, \r
97  0x4b, 0};\r
98 \r
99 static const char *states[] = {\r
100   closed,\r
101   syn_rcvd,\r
102   syn_sent,\r
103   established,\r
104   fin_wait_1,\r
105   fin_wait_2,\r
106   closing,\r
107   time_wait,\r
108   last_ack};\r
109   \r
110 \r
111 /*-----------------------------------------------------------------------------------*/\r
112 /* print_stats:\r
113  *\r
114  * Prints out a part of the uIP statistics. The statistics data is\r
115  * written into the uip_appdata buffer. It overwrites any incoming\r
116  * packet.\r
117  */\r
118 static u8_t\r
119 print_stats(u8_t next)\r
120 {\r
121 #if UIP_STATISTICS\r
122   u16_t i, j;\r
123   u8_t *buf;\r
124   u16_t *databytes;\r
125   \r
126   if(next) {\r
127     /* If our last data has been acknowledged, we move on the next\r
128        chunk of statistics. */\r
129     hs->count = hs->count + 4;\r
130     if(hs->count >= sizeof(struct uip_stats)/sizeof(u16_t)) {\r
131       /* We have printed out all statistics, so we return 1 to\r
132          indicate that we are done. */\r
133       return 1;\r
134     }\r
135   }\r
136 \r
137   /* Write part of the statistics into the uip_appdata buffer. */\r
138   databytes = (u16_t *)&uip_stat + hs->count;\r
139   buf       = (u8_t *)uip_appdata;\r
140 \r
141   j = 4 + 1;\r
142   i = hs->count;\r
143   while (i < sizeof(struct uip_stats)/sizeof(u16_t) && --j > 0) {\r
144     sprintf((char *)buf, "%5u\r\n", *databytes);\r
145     ++databytes;\r
146     buf += 6;\r
147     ++i;\r
148   }\r
149 \r
150   /* Send the data. */\r
151   uip_send(uip_appdata, buf - uip_appdata);\r
152   \r
153   return 0;\r
154 #else\r
155   return 1;\r
156 #endif /* UIP_STATISTICS */\r
157 }\r
158 /*-----------------------------------------------------------------------------------*/\r
159 static u8_t\r
160 file_stats(u8_t next)\r
161 {\r
162   /* We use sprintf() to print the number of file accesses to a\r
163      particular file (given as an argument to the function in the\r
164      script). We then use uip_send() to actually send the data. */\r
165   if(next) {\r
166     return 1;\r
167   }\r
168   uip_send(uip_appdata, sprintf((char *)uip_appdata, "%5u", fs_count(&hs->script[4])));  \r
169   return 0;\r
170 }\r
171 /*-----------------------------------------------------------------------------------*/\r
172 static u8_t\r
173 tcp_stats(u8_t next)\r
174 {\r
175   struct uip_conn *conn;  \r
176 \r
177   if(next) {\r
178     /* If the previously sent data has been acknowledged, we move\r
179        forward one connection. */\r
180     if(++hs->count == UIP_CONNS) {\r
181       /* If all connections has been printed out, we are done and\r
182          return 1. */\r
183       return 1;\r
184     }\r
185   }\r
186   \r
187   conn = &uip_conns[hs->count];\r
188   if((conn->tcpstateflags & TS_MASK) == CLOSED) {\r
189     uip_send(uip_appdata, sprintf((char *)uip_appdata,\r
190                                   "<tr align=\"center\"><td>-</td><td>-</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",\r
191                                   conn->nrtx,\r
192                                   conn->timer,\r
193                                   (uip_outstanding(conn))? '*':' ',\r
194                                   (uip_stopped(conn))? '!':' '));\r
195   } else {\r
196     uip_send(uip_appdata, sprintf((char *)uip_appdata,\r
197                                   "<tr align=\"center\"><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",\r
198                                   htons(conn->ripaddr[0]) >> 8,\r
199                                   htons(conn->ripaddr[0]) & 0xff,\r
200                                   htons(conn->ripaddr[1]) >> 8,\r
201                                   htons(conn->ripaddr[1]) & 0xff,\r
202                                   htons(conn->rport),\r
203                                   states[conn->tcpstateflags & TS_MASK],\r
204                                   conn->nrtx,\r
205                                   conn->timer,\r
206                                   (uip_outstanding(conn))? '*':' ',\r
207                                   (uip_stopped(conn))? '!':' '));\r
208   }\r
209   return 0;\r
210 }\r
211 /*-----------------------------------------------------------------------------------*/\r