]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/net/athttpd/v2_0/src/handler.c
Initial revision
[karo-tx-redboot.git] / packages / net / athttpd / v2_0 / src / handler.c
1 /* =================================================================
2  *
3  *      handler.c
4  *
5  *      C callbacks as well as directory listings.
6  *
7  * ================================================================= 
8  * ####ECOSGPLCOPYRIGHTBEGIN####
9  * -------------------------------------------
10  * This file is part of eCos, the Embedded Configurable Operating
11  * System.
12  * Copyright (C) 2005 eCosCentric Ltd.
13  * 
14  * eCos is free software; you can redistribute it and/or modify it
15  * under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 or (at your option)
17  * any later version.
18  * 
19  * eCos is distributed in the hope that it will be useful, but
20  * WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22  * General Public License for more details.
23  * 
24  * You should have received a copy of the GNU General Public License
25  * along with eCos; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
27  * 
28  * As a special exception, if other files instantiate templates or
29  * use macros or inline functions from this file, or you compile this
30  * file and link it with other works to produce a work based on this
31  * file, this file does not by itself cause the resulting work to be
32  * covered by the GNU General Public License. However the source code
33  * for this file must still be made available in accordance with
34  * section (3) of the GNU General Public License.
35  * 
36  * This exception does not invalidate any other reasons why a work
37  * based on this file might be covered by the GNU General Public
38  * License.
39  *
40  * -------------------------------------------
41  * ####ECOSGPLCOPYRIGHTEND####
42  * =================================================================
43  * #####DESCRIPTIONBEGIN####
44  * 
45  *  Author(s):    Anthony Tonizzo (atonizzo@gmail.com)
46  *  Contributors: 
47  *  Date:         2006-06-12
48  *  Purpose:      
49  *  Description:  
50  *               
51  * ####DESCRIPTIONEND####
52  * 
53  * =================================================================
54  */
55 #include <pkgconf/hal.h>
56 #include <pkgconf/kernel.h>
57 #include <cyg/hal/hal_tables.h>
58 #include <cyg/fileio/fileio.h>
59 #include <dirent.h>
60 #include <network.h>
61
62 #include <string.h>
63 #include <stdio.h>                     // sprintf().
64
65 #include <cyg/athttpd/http.h>
66 #include <cyg/athttpd/socket.h>
67 #include <cyg/athttpd/handler.h>
68 #include <cyg/athttpd/forms.h>
69
70 #ifdef CYGOPT_NET_ATHTTPD_USE_DIRLIST
71 static char folder_gif[] = {
72     0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x12, 0x00,
73     0x12, 0x00, 0xd5, 0x00, 0x00, 0xfb, 0xfb, 0xfb,
74     0xef, 0xef, 0xef, 0xdb, 0xb7, 0x52, 0xcc, 0x99,
75     0x34, 0xe4, 0xe4, 0xe4, 0xc1, 0xc1, 0xc1, 0xa3,
76     0x71, 0x0b, 0xc2, 0x8f, 0x2a, 0xb7, 0xb7, 0xb7,
77     0x9e, 0x6c, 0x06, 0xba, 0x87, 0x22, 0x9c, 0x6a,
78     0x04, 0xc9, 0x96, 0x31, 0xbd, 0x8a, 0x25, 0xb3,
79     0x81, 0x1b, 0x99, 0x67, 0x01, 0xdb, 0xb7, 0x71,
80     0xb5, 0x82, 0x1d, 0xa0, 0x6e, 0x08, 0xcb, 0x98,
81     0x33, 0xff, 0xff, 0xba, 0xb0, 0x7e, 0x18, 0xc5,
82     0x92, 0x2d, 0xa7, 0x75, 0x0f, 0xc7, 0x94, 0x2f,
83     0xa6, 0xa6, 0xa6, 0xa5, 0x73, 0x0d, 0xb7, 0x84,
84     0x1f, 0xab, 0x79, 0x13, 0xc8, 0x95, 0x30, 0xc0,
85     0x8d, 0x28, 0xc6, 0xc6, 0xc6, 0xae, 0x7c, 0x16,
86     0x9a, 0x68, 0x02, 0xa8, 0x76, 0x10, 0xac, 0x7a,
87     0x14, 0xff, 0xd4, 0x6f, 0xff, 0xf8, 0x93, 0xeb,
88     0xeb, 0xeb, 0xff, 0xff, 0x9c, 0xff, 0xdb, 0x75,
89     0xff, 0xe4, 0x7f, 0xff, 0xef, 0x89, 0xb6, 0xb6,
90     0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x00,
91     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97     0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04,
98     0x01, 0x00, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x00,
99     0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x06,
100     0x91, 0x40, 0x97, 0x70, 0x48, 0x2c, 0x1a, 0x8f,
101     0xc8, 0xa4, 0xd2, 0x35, 0x18, 0x4c, 0x18, 0x9d,
102     0x00, 0x40, 0x39, 0x60, 0x59, 0x29, 0x94, 0x03,
103     0x61, 0x7a, 0x1c, 0x40, 0x04, 0x60, 0x30, 0xa4,
104     0xa1, 0xd8, 0x44, 0x1c, 0x95, 0xc0, 0x70, 0x62,
105     0x6d, 0xbb, 0xdb, 0xa3, 0xcf, 0x90, 0xd1, 0x3a,
106     0xd9, 0xef, 0xf8, 0xd6, 0x05, 0x31, 0xc4, 0xb4,
107     0xfe, 0x80, 0x81, 0x7f, 0x06, 0x2b, 0x43, 0x16,
108     0x2d, 0x25, 0x89, 0x8a, 0x8b, 0x2d, 0x12, 0x85,
109     0x42, 0x07, 0x2d, 0x2a, 0x93, 0x94, 0x95, 0x2d,
110     0x09, 0x8f, 0x2e, 0x1e, 0x2d, 0x29, 0x9d, 0x9e,
111     0x9f, 0x2d, 0x0b, 0x99, 0x0d, 0x2d, 0x28, 0xa6,
112     0xa7, 0xa8, 0x2d, 0x21, 0x99, 0x0a, 0x2d, 0x24,
113     0xaf, 0xb0, 0xb1, 0x2d, 0x0f, 0x7c, 0x42, 0x01,
114     0x67, 0x15, 0x20, 0x1c, 0x22, 0x1a, 0x06, 0x12,
115     0x09, 0x0b, 0x0f, 0x19, 0x05, 0x43, 0x00, 0x04,
116     0x05, 0x2b, 0xc9, 0xca, 0xcb, 0x05, 0x04, 0x44,
117     0x00, 0x01, 0x26, 0xd2, 0xd3, 0xd4, 0x52, 0x4b,
118     0x4a, 0x41, 0x00, 0x3b
119 };
120
121 static char doc_gif[] = {
122     0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x12, 0x00,
123     0x12, 0x00, 0xe6, 0x00, 0x00, 0xfb, 0xfb, 0xfb,
124     0xef, 0xef, 0xef, 0xf8, 0xfb, 0xff, 0xed, 0xf6,
125     0xff, 0xc1, 0xc1, 0xc1, 0xe4, 0xe4, 0xe4, 0xfd,
126     0xfd, 0xfd, 0xd8, 0xeb, 0xff, 0xc0, 0xdf, 0xff,
127     0xfe, 0xff, 0xff, 0xf3, 0xf9, 0xff, 0xc3, 0xe1,
128     0xff, 0xf4, 0xf4, 0xf5, 0xf9, 0xf9, 0xf9, 0x81,
129     0x95, 0xc3, 0x6b, 0x74, 0xa5, 0xce, 0xe7, 0xff,
130     0x5e, 0x61, 0x90, 0x55, 0xa7, 0xed, 0x93, 0xaa,
131     0xd2, 0x7a, 0x83, 0xb0, 0xc0, 0xc0, 0xff, 0xd9,
132     0xe1, 0xed, 0x84, 0x9b, 0xca, 0x8a, 0xa8, 0xd9,
133     0xe4, 0xf1, 0xff, 0x91, 0xb8, 0xea, 0x92, 0xbc,
134     0xef, 0x73, 0x7e, 0xb0, 0xf5, 0xfa, 0xff, 0xf7,
135     0xf7, 0xf7, 0x90, 0xa3, 0xcb, 0xcd, 0xe6, 0xff,
136     0xba, 0xdd, 0xff, 0xd8, 0xe5, 0xf6, 0x6d, 0x77,
137     0xa8, 0x65, 0x6a, 0x9a, 0x87, 0xa1, 0xd2, 0x7f,
138     0x8e, 0xbc, 0x8f, 0xb3, 0xe5, 0x8c, 0xae, 0xdf,
139     0xce, 0xd3, 0xff, 0xf6, 0xfa, 0xff, 0x67, 0x6d,
140     0x9e, 0xfc, 0xfd, 0xff, 0x7d, 0x89, 0xb6, 0x94,
141     0xbf, 0xf2, 0xc6, 0xc6, 0xc6, 0xfe, 0xfe, 0xfe,
142     0xdb, 0xe7, 0xf7, 0x69, 0x70, 0xa2, 0x6f, 0x7a,
143     0xac, 0x72, 0x7c, 0xae, 0x74, 0x80, 0xb2, 0x87,
144     0xa9, 0xdc, 0xd1, 0xe9, 0xff, 0xc9, 0xe4, 0xff,
145     0xb7, 0xb7, 0xb7, 0xeb, 0xeb, 0xeb, 0xb6, 0xb6,
146     0xb6, 0xe9, 0xf5, 0xff, 0x75, 0x78, 0xa3, 0xe1,
147     0xf0, 0xff, 0xdb, 0xed, 0xff, 0xff, 0xff, 0xff,
148     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171     0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04,
172     0x01, 0x00, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x00,
173     0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x07,
174     0xa3, 0x80, 0x41, 0x82, 0x83, 0x84, 0x85, 0x86,
175     0x87, 0x88, 0x2e, 0x36, 0x8b, 0x8c, 0x36, 0x35,
176     0x01, 0x00, 0x87, 0x1b, 0x40, 0x06, 0x00, 0x0d,
177     0x1e, 0x0c, 0x16, 0x35, 0x13, 0x90, 0x86, 0x1a,
178     0x30, 0x40, 0xa1, 0x09, 0x02, 0x31, 0x35, 0x12,
179     0x1f, 0x01, 0x86, 0x27, 0x06, 0xa2, 0x02, 0x1d,
180     0x22, 0x35, 0xb1, 0x2f, 0x86, 0x28, 0xa1, 0x02,
181     0x02, 0x03, 0x3c, 0x3c, 0x29, 0x15, 0x1c, 0x39,
182     0x86, 0x18, 0x2c, 0xb8, 0xb9, 0x3c, 0x3f, 0x3f,
183     0x07, 0x34, 0xbf, 0x85, 0x25, 0x2a, 0x0a, 0xb9,
184     0x3e, 0x3e, 0xc7, 0x37, 0x33, 0xca, 0x84, 0x17,
185     0xce, 0x3c, 0xd0, 0xc6, 0x37, 0x20, 0x23, 0xd5,
186     0x83, 0x0e, 0xba, 0xda, 0x3f, 0x37, 0x38, 0x38,
187     0x0f, 0xdf, 0x82, 0x26, 0xd9, 0xd1, 0xe4, 0xe6,
188     0x0b, 0x32, 0xe9, 0x41, 0x2d, 0x19, 0xed, 0x37,
189     0xe5, 0x0b, 0x08, 0x2b, 0xf2, 0x14, 0xf6, 0x10,
190     0xe6, 0x08, 0x42, 0x90, 0x90, 0xd7, 0xa3, 0xa0,
191     0xc1, 0x83, 0x11, 0x08, 0x18, 0x2a, 0x40, 0x60,
192     0x87, 0xc3, 0x87, 0x0e, 0x09, 0x14, 0x30, 0x04,
193     0x20, 0x80, 0x8e, 0x8b, 0x18, 0x2f, 0x76, 0x42,
194     0xc4, 0xd1, 0x50, 0x20, 0x00, 0x3b
195 };
196
197 static char back_gif[] = {
198     0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x0a, 0x00,
199     0x09, 0x00, 0xf7, 0x00, 0x00, 0xf8, 0xfa, 0xfb,
200     0x3a, 0x6b, 0x9d, 0xe5, 0xeb, 0xf2, 0x87, 0xa5,
201     0xc3, 0x9d, 0xb5, 0xce, 0xd0, 0xdc, 0xe7, 0xa9,
202     0xbe, 0xd4, 0x74, 0x97, 0xb9, 0x65, 0x8c, 0xb2,
203     0xd9, 0xe2, 0xec, 0xf1, 0xf4, 0xf8, 0xe7, 0xed,
204     0xf3, 0x55, 0x7f, 0xaa, 0xc8, 0xd6, 0xe3, 0xcc,
205     0xcc, 0xcc, 0x91, 0xac, 0xc8, 0x3f, 0x6f, 0x9f,
206     0xfd, 0xfd, 0xfe, 0x4d, 0x7a, 0xa6, 0xac, 0xc1,
207     0xd5, 0x4b, 0x78, 0xa5, 0x33, 0x66, 0x99, 0xff,
208     0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295     0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00,
296     0x00, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x00, 0x08,
297     0x3b, 0x00, 0x2d, 0x08, 0x1c, 0x68, 0x61, 0xc1,
298     0x83, 0x02, 0x04, 0x2d, 0x00, 0x20, 0x10, 0x80,
299     0xc2, 0x04, 0x82, 0x13, 0x28, 0x54, 0xa8, 0xe0,
300     0x50, 0x60, 0x02, 0x04, 0x13, 0x27, 0x56, 0x04,
301     0x70, 0x20, 0xa3, 0xc6, 0x87, 0x02, 0x1b, 0x30,
302     0xc8, 0x58, 0x71, 0x60, 0x04, 0x03, 0x10, 0x28,
303     0x82, 0x24, 0xa8, 0x60, 0x80, 0x84, 0x95, 0x09,
304     0x05, 0x38, 0x08, 0x08, 0x00, 0x3b
305 };
306 #endif
307
308 // =============================================================================
309 // Internal resources
310 // =============================================================================
311 CYG_HAL_TABLE_BEGIN(cyg_httpd_ires_table, httpd_ires_table);
312 CYG_HAL_TABLE_END(cyg_httpd_ires_table_end, httpd_ires_table);
313 __externC cyg_httpd_ires_table_entry cyg_httpd_ires_table[];
314 __externC cyg_httpd_ires_table_entry cyg_httpd_ires_table_end[];
315
316 #ifdef CYGOPT_NET_ATHTTPD_USE_DIRLIST
317 // These threes internal resources are used for the directory listing.
318 CYG_HTTPD_IRES_TABLE_ENTRY(cyg_httpd_ires_folder, \
319                            "/___folder__gif.gif", \
320                            folder_gif,            \
321                            sizeof(folder_gif));
322 CYG_HTTPD_IRES_TABLE_ENTRY(cyg_httpd_ires_doc,    \
323                            "/___doc__gif.gif",    \
324                            doc_gif,               \
325                            sizeof(doc_gif));
326 CYG_HTTPD_IRES_TABLE_ENTRY(cyg_httpd_ires_back,   \
327                            "/___back__gif.gif",   \
328                            back_gif,              \
329                            sizeof(back_gif));
330 #endif                           
331
332 cyg_httpd_ires_table_entry *
333 cyg_httpd_find_ires(char *path_name)
334 {
335     cyg_httpd_ires_table_entry *entry = cyg_httpd_ires_table;
336     
337     while (entry != cyg_httpd_ires_table_end)
338     {
339         if (!strcasecmp((char*)path_name, entry->f_pname))
340             return entry;
341         entry++;
342     }
343             
344     return (cyg_httpd_ires_table_entry*)NULL;
345 }
346
347 void 
348 cyg_httpd_send_ires(cyg_httpd_ires_table_entry *entry)
349 {
350     httpstate.status_code  = CYG_HTTPD_STATUS_OK;
351
352     // Here we'll look for extension to the file. Consider the case where
353     //  there might be more than one dot in the file name. We'll look for
354     //  the last dot, then we'll check the extension.
355     char *extension = rindex(entry->f_pname, '.');
356     if (extension == NULL)
357         // No extension in the file name.
358         httpstate.mime_type = 0;
359     else
360         httpstate.mime_type = cyg_httpd_find_mime_string(++extension);
361
362     httpstate.payload_len  = entry->f_size;
363     cyg_int32 header_length = cyg_httpd_format_header();
364     
365     // As always, the header is always sent out.
366     send(httpstate.sockets[httpstate.client_index].descriptor, 
367          httpstate.outbuffer, 
368          header_length,
369          0);
370     if (httpstate.mode & CYG_HTTPD_MODE_SEND_HEADER_ONLY) 
371         return;
372     cyg_httpd_write(entry->f_ptr, entry->f_size);
373 }
374
375 // =============================================================================
376 // C callbacks
377 // =============================================================================
378 CYG_HAL_TABLE_BEGIN(cyg_httpd_handler_table, httpd_handler_table);
379 CYG_HAL_TABLE_END(cyg_httpd_handler_table_end, httpd_handler_table);
380
381 __externC cyg_httpd_handler_table_entry cyg_httpd_handler_table[];
382 __externC cyg_httpd_handler_table_entry cyg_httpd_handler_table_end[];
383
384 handler
385 cyg_httpd_find_handler(void)
386 {
387     cyg_httpd_handler_table_entry *entry = cyg_httpd_handler_table;
388     while (entry != cyg_httpd_handler_table_end)
389     {
390         if (strcmp((const char*)httpstate.url, entry->path) == 0)
391             return entry->h;
392         entry++;
393     }
394             
395     return (handler)NULL;
396 }
397
398 // =============================================================================
399 // Directory listing
400 // =============================================================================
401 #ifdef CYGOPT_NET_ATHTTPD_USE_DIRLIST
402 void
403 cyg_httpd_print_directory_entry(char *path_name, 
404                                 struct stat *s, 
405                                 struct dirent *de)
406 {
407     char fname[CYG_HTTPD_MAXPATH];
408     char time_str[32];
409     time_t last_mod = s->st_mtime;
410
411     struct tm *mod_time = gmtime(&last_mod);
412     sprintf(time_str,
413             "%02d-%s-%04d %02d:%02d",
414             mod_time->tm_mday,
415             month_of_year[mod_time->tm_mon],
416             mod_time->tm_year + 1900,
417             mod_time->tm_hour,
418             mod_time->tm_min);
419
420     if (S_ISREG(s->st_mode))
421     {
422         strcpy(fname, path_name);
423         if (fname[strlen(fname)-1] != '/')
424             strcat(fname, "/");
425         strcat(fname, de->d_name);
426         cyg_httpd_cleanup_filename(fname);
427         sprintf(httpstate.outbuffer,
428                 "<tr><td><img src='/___doc__gif.gif'></td>"
429                 "<td><a href='%s'>%s</a></td>"
430                 "<td>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp</td>"
431                 "<td>%s&nbsp;&nbsp;</td>"
432                 "<td style='color:black'>%d</td></tr>",
433                 fname,
434                 de->d_name,
435                 time_str,
436                 (int)s->st_size);
437     }
438     else
439     {
440         strcpy(fname, "/");
441         strcat(fname, path_name);
442         if (fname[strlen(fname)-1] != '/')
443             strcat(fname, "/");
444         strcat(fname, de->d_name);
445         cyg_httpd_cleanup_filename(fname);
446         sprintf(httpstate.outbuffer,
447                 "<tr><td><img src='/___folder__gif.gif'></td>"
448                 "<td><a href='%s/'>%s</a></td>"
449                 "<td>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp</td>"
450                 "<td>%s&nbsp;&nbsp;</td>"
451                 "<td style='color:black'></td></tr>",
452                 fname,
453                 de->d_name,
454                 time_str);
455     }
456     cyg_httpd_write_chunked(httpstate.outbuffer, strlen(httpstate.outbuffer));
457 }
458
459 void
460 cyg_httpd_send_directory_listing(char *path_name)
461 {
462     struct dirent next_file;
463     struct dirent last_printed;
464     struct stat s;
465     char fname[CYG_HTTPD_MAXPATH];
466
467     cyg_httpd_start_chunked("html");
468     sprintf(httpstate.outbuffer,
469             "<html><body><h3>Index of %s</h3><p></p>"
470             "<table style='font-family:courier'>",
471             path_name);
472     cyg_httpd_write_chunked(httpstate.outbuffer, strlen(httpstate.outbuffer));
473
474     sprintf(httpstate.outbuffer,
475             "<tr><td></td><td align='center' style='border-style:none none"
476             " solid none;border-width:thin'>Name</td>"
477             "<td style='border-style:none none solid none; border-width:thin'>"
478             "&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp</td>"
479              "<td  align='center' style='border-style:none none solid none;"
480              " border-width:thin'>Last Modified</td>"
481              "<td style='border-style:none none solid none; border-width:thin'>"
482             "Size</td></tr>");
483     cyg_httpd_write_chunked(httpstate.outbuffer, strlen(httpstate.outbuffer));
484
485     // Provide a pointer to the parent directory.
486     strcpy(fname, path_name);
487     if (fname[strlen(fname)-1] == '/')
488         fname[strlen(fname)-1] = '\0';
489     char *slash = rindex(fname, '/');
490     slash[1] = '\0';
491     sprintf(httpstate.outbuffer,
492             "<tr><td><img src='/___back__gif.gif'></td></td>"
493             "<td><a href='%s' style='color:red'>Parent "
494             "Directory</a></td>"
495             "<td>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp</td>"
496             "<td>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp</td>"
497             "<td style='color:black'>-</td></tr>",
498             fname);
499     cyg_httpd_write_chunked(httpstate.outbuffer, strlen(httpstate.outbuffer));
500
501     strcpy(fname, CYGDAT_NET_ATHTTPD_SERVEROPT_ROOTDIR);
502     if (fname[strlen(fname)-1] != '/')
503         strcat(fname, "/");
504     strcat(fname, path_name);
505     if (fname[strlen(fname)-1] != '/')
506         strcat(fname, "/");
507     cyg_httpd_cleanup_filename(fname);
508     int abs_path_len = strlen(fname);
509
510     DIR* pdir = opendir(fname);
511     struct dirent *dirent = readdir(pdir);
512
513     // First time for the directories.
514     rewinddir(pdir);
515     memset((void*)&last_printed, 0, sizeof(struct dirent));
516     dirent = readdir(pdir);
517     int new_entry = 1;
518     while (1)
519     {
520         memset((void*)&next_file, 0, sizeof(struct dirent));
521         new_entry = 0;
522         while(dirent)
523         {
524             if (strcmp(dirent->d_name, "..") &&
525                                      strcmp(dirent->d_name, "."))
526                 if ((next_file.d_name[0] == '\0') ||
527                       (strcmp(next_file.d_name, dirent->d_name) > 0))
528                     if ((last_printed.d_name[0] == '\0') ||
529                       (strcmp(last_printed.d_name, dirent->d_name) < 0))
530                     {
531                         fname[abs_path_len] = '\0';
532                         strcat(fname, dirent->d_name);
533                         struct stat sp;
534                         stat(fname, &sp);
535                         if (S_ISDIR(sp.st_mode))
536                         {
537                             memcpy(&next_file, dirent, sizeof(struct dirent));
538                             memcpy(&s, &sp, sizeof(struct stat));
539                             new_entry = 1;
540                         }
541                     }
542             dirent = readdir(pdir);
543         }
544         if (new_entry == 0)
545             break;
546         cyg_httpd_print_directory_entry(path_name, &s, &next_file);
547         memcpy(&last_printed, &next_file, sizeof(struct dirent));
548         rewinddir(pdir);
549         dirent = readdir(pdir);
550     }
551
552     // A second time for the files.
553     rewinddir(pdir);
554     memset((void*)&last_printed, 0, sizeof(struct dirent));
555     dirent = readdir(pdir);
556     new_entry = 1;
557     while (1)
558     {
559         memset((void*)&next_file, 0, sizeof(struct dirent));
560         new_entry = 0;
561         while(dirent)
562         {
563             if (strcmp(dirent->d_name, "..") &&
564                                      strcmp(dirent->d_name, "."))
565                 if ((next_file.d_name[0] == '\0') ||
566                       (strcmp(next_file.d_name, dirent->d_name) > 0))
567                     if ((last_printed.d_name[0] == '\0') ||
568                       (strcmp(last_printed.d_name, dirent->d_name) < 0))
569                     {
570                         fname[abs_path_len] = '\0';
571                         strcat(fname, dirent->d_name);
572                         struct stat sp;
573                         stat(fname, &sp);
574                         if (S_ISREG(sp.st_mode))
575                         {
576                             memcpy(&next_file, dirent, sizeof(struct dirent));
577                             memcpy(&s, &sp, sizeof(struct stat));
578                             new_entry = 1;
579                         }
580                     }
581             dirent = readdir(pdir);
582         }
583         if (new_entry == 0)
584             break;
585         cyg_httpd_print_directory_entry(path_name, &s, &next_file);
586         memcpy(&last_printed, &next_file, sizeof(struct dirent));
587         rewinddir(pdir);
588         dirent = readdir(pdir);
589     }
590
591     strcpy(httpstate.outbuffer, "</table><html><body>");
592     cyg_httpd_write_chunked(httpstate.outbuffer, strlen(httpstate.outbuffer));
593     cyg_httpd_end_chunked();
594     closedir(pdir);
595 }
596 #endif