source: EcnlProtoTool/trunk/ntshell/webserver/httpd-fs.c@ 278

Last change on this file since 278 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 7.9 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 * @(#) $Id: httpd-fs.c 270 2017-02-09 04:03:47Z coas-nagasima $
51 */
52
53#include "httpd.h"
54#include "httpd-fs.h"
55#include "ff.h"
56#include "diskio.h"
57#include <string.h>
58#include "http-strings.h"
59#include <kernel.h>
60#include "kernel_cfg.h"
61#include "syssvc/syslog.h"
62#include "arduino.h"
63
64#ifndef _MSC_VER
65#ifndef strcat_s
66#define strcat_s(dst, dsz, src) strcat(dst, src)
67#endif
68#endif
69
70//#define FILE_DUMP
71#ifdef FILE_DUMP
72char path[256] = "";
73FATFS fs;
74#endif
75
76#ifndef NULL
77#define NULL 0
78#endif /* NULL */
79
80/*-----------------------------------------------------------------------------------*/
81#ifdef FILE_DUMP
82FRESULT scan_files(char* path, int size)
83{
84 FRESULT res;
85 FILINFO fno;
86 DIR dir;
87 int i;
88 char *fn; /* This function assumes non-Unicode configuration */
89
90 res = f_opendir(&dir, path);
91 if (res == FR_OK) {
92 i = strlen(path);
93 for (;;) {
94 res = f_readdir(&dir, &fno);
95 if (res != FR_OK || fno.fname[0] == 0) break;
96 fn = fno.fname;
97 if (fno.fattrib & AM_DIR) {
98 sprintf(&path[i], "0:/%s", fn);
99 res = scan_files(path, size);
100 if (res != FR_OK) break;
101 path[i] = 0;
102 }
103 else {
104 syslog(LOG_ERROR, "%s/%s\n", path, fn);
105 }
106 }
107 }
108
109 return res;
110}
111#endif
112/*-----------------------------------------------------------------------------------*/
113int
114httpd_fs_open_ul(char *name, int len, struct httpd_fs_file *file)
115{
116 FRESULT res;
117 FIL *fd = (FIL *)&file->fd;
118 FILINFO fno;
119 DIR dir;
120
121 file->pos = 0;
122 file->len = 0;
123 file->name = name;
124 file->redirect = 0;
125 memset(fd, 0, sizeof(FIL));
126
127 if ((res = f_open(fd, name, FA_OPEN_EXISTING | FA_READ)) != FR_OK) {
128 if ((res = f_opendir(&dir, name)) != FR_OK) {
129 syslog(LOG_ERROR, "f_opendir(%s) => %d\n", name, res);
130 return 0;
131 }
132
133 if ((res = f_readdir(&dir, &fno)) != FR_OK) {
134 syslog(LOG_ERROR, "f_readdir(%s) => %d\n", name, res);
135 return 0;
136 }
137
138 if (len != 0/*fno.fattrib & AM_DIR*/) {
139 strcat_s(name, len, http_index_html);
140 res = f_open(fd, name, FA_OPEN_EXISTING | FA_READ);
141 file->redirect = res == FR_OK;
142 }
143 else
144 res = FR_NO_FILE;
145
146 if (res != FR_OK) {
147 syslog(LOG_ERROR, "f_open(%s) => %d %x\n", name, res, fno.fattrib);
148 return 0;
149 }
150 }
151
152 file->len = fd->fsize;
153
154 //syslog(LOG_ERROR, "httpd_fs_open(%d:%s) %d\n", drv, name, file->len);
155
156 return 1;
157}
158
159int
160httpd_fs_open(char *name, int len, struct httpd_fs_file *file)
161{
162 int result;
163
164 wai_sem(SEM_FILESYSTEM);
165
166 result = httpd_fs_open_ul(name, len, file);
167
168 sig_sem(SEM_FILESYSTEM);
169
170 return result;
171}
172/*-----------------------------------------------------------------------------------*/
173int
174httpd_fs_create_ul(char *name, struct httpd_fs_file *file)
175{
176 FRESULT res;
177 FIL *fd = (FIL *)&file->fd;
178
179 file->pos = 0;
180 file->len = 0;
181 file->name = name;
182 file->redirect = 0;
183 memset(fd, 0, sizeof(FIL));
184
185 if ((res = f_open(fd, name, FA_CREATE_ALWAYS | FA_WRITE)) != FR_OK) {
186 syslog(LOG_ERROR, "f_open(%s) => %d\n", name, res);
187 return 0;
188 }
189
190 file->pos = 0;
191 file->len = 0;
192
193 //syslog(LOG_ERROR, "httpd_fs_create(%d:%s) %d\n", drv, name, file->len);
194
195 return 1;
196}
197
198int
199httpd_fs_create(char *name, struct httpd_fs_file *file)
200{
201 int result;
202
203 wai_sem(SEM_FILESYSTEM);
204
205 result = httpd_fs_create_ul(name, file);
206
207 sig_sem(SEM_FILESYSTEM);
208
209 return result;
210}
211/*-----------------------------------------------------------------------------------*/
212int
213httpd_fs_read_ul(struct httpd_fs_file *file, void *dst, int len)
214{
215 FRESULT ret;
216 UINT rlen = 0;
217 FIL *fd = (FIL *)&file->fd;
218
219 if ((ret = f_lseek(fd, file->pos)) != FR_OK) {
220 syslog(LOG_ERROR, "f_lseek(%s, %d) => %d\n", file->name, file->pos, ret);
221 return 0;
222 }
223
224 if (file->pos != fd->fptr) {
225 syslog(LOG_ERROR, "f_lseek(%s, %d) != %d\n", file->name, file->pos, fd->fptr);
226 }
227
228 if ((ret = f_read(fd, dst, len, &rlen)) != FR_OK) {
229 syslog(LOG_ERROR, "f_read(%s, 0x%p, %d) => %d\n", file->name, dst, len, ret);
230 return 0;
231 }
232
233 //syslog(LOG_ERROR, "httpd_fs_read(%d:%s, %d, %d) => %d\n", file->drv, file->name, file->pos, len, rlen);
234
235 return rlen;
236}
237
238int
239httpd_fs_read(struct httpd_fs_file *file, void *dst, int len)
240{
241 int result;
242
243 wai_sem(SEM_FILESYSTEM);
244
245 result = httpd_fs_read_ul(file, dst, len);
246
247 sig_sem(SEM_FILESYSTEM);
248
249 return result;
250}
251/*-----------------------------------------------------------------------------------*/
252int
253httpd_fs_write_ul(struct httpd_fs_file *file, const void *src, int len)
254{
255 FRESULT ret;
256 UINT rlen = 0;
257 FIL *fd = (FIL *)&file->fd;
258
259 if ((ret = f_lseek(fd, file->pos)) != FR_OK) {
260 syslog(LOG_ERROR, "f_lseek(%s, %d) => %d\n", file->name, file->pos, ret);
261 return 0;
262 }
263
264 if (file->pos != fd->fptr) {
265 syslog(LOG_ERROR, "f_lseek(%s, %d) != %d\n", file->name, file->pos, fd->fptr);
266 }
267
268 if ((ret = f_write(fd, src, len, &rlen)) != FR_OK) {
269 syslog(LOG_ERROR, "f_write(%s, 0x%p, %d) => %d\n", file->name, src, len, ret);
270 return 0;
271 }
272
273 file->pos += rlen;
274 file->len += rlen;
275
276 //syslog(LOG_ERROR, "httpd_fs_write(%d:%s, %d, %d) => %d\n", file->drv, file->name, file->pos, len, rlen);
277
278 return rlen;
279}
280
281int
282httpd_fs_write(struct httpd_fs_file *file, const void *src, int len)
283{
284 int result;
285
286 wai_sem(SEM_FILESYSTEM);
287
288 result = httpd_fs_write_ul(file, src, len);
289
290 sig_sem(SEM_FILESYSTEM);
291
292 return result;
293}
294/*-----------------------------------------------------------------------------------*/
295int httpd_fs_close_ul(struct httpd_fs_file *file)
296{
297 FRESULT ret;
298 FIL *fd = (FIL *)&file->fd;
299
300 if ((ret = f_close(fd)) != FR_OK) {
301 syslog(LOG_ERROR, "f_close(%s) => %d\n", file->name, ret);
302 return 0;
303 }
304
305 memset(fd, 0, sizeof(FIL));
306
307 return 1;
308}
309
310int httpd_fs_close(struct httpd_fs_file *file)
311{
312 int result;
313
314 wai_sem(SEM_FILESYSTEM);
315
316 result = httpd_fs_close_ul(file);
317
318 sig_sem(SEM_FILESYSTEM);
319
320 return result;
321}
Note: See TracBrowser for help on using the repository browser.