source: azure_iot_hub_f767zi/trunk/asp_baseplatform/files/stdfile.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 11.9 KB
Line 
1/*
2 * TOPPERS/ASP/FMP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile/Flexible MultiProcessor Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2020 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
13 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
34 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
35 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 *
37 * @(#) $Id$
38 */
39/*
40 * TOPPERS/ASP/FMP+FATFS対応のPOSIXファイル関数
41 */
42#include <kernel.h>
43#include <stdio.h>
44#include <string.h>
45#include <fcntl.h>
46#include "storagedevice.h"
47#include "kernel_cfg.h"
48
49#ifndef NUM_FIL
50#define NUM_FIL 16
51#endif
52
53/* sys/dirent.h */
54struct dirent {
55 unsigned long d_fileno; /* file number of entry */
56 unsigned short d_reclen; /* length of this record */
57 unsigned char d_type; /* file type, see below */
58 unsigned char d_namlen; /* length of string in d_name */
59#define MAXNAMLEN 255
60 char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */
61};
62
63/* File types */
64#define DT_UNKMOWN 0
65#define DT_FIFO 1
66#define DT_CHAR 2
67#define DT_DIR 4
68#define DT_BLK 6
69#define DT_REG 8
70#define DT_LNK 10
71#define DT_SOCK 12
72#define DT_WHT 14
73
74
75static FILE iod[NUM_FIL];
76static StorageDevice_t *pdirpsdev = 0;
77
78extern int _setup_file(FILE *st, StorageDevice_t *pd, int lid);
79
80/*
81 * allocate file structure
82 */
83static FILE *alloc_file(void)
84{
85 FILE *fp;
86 int i;
87
88 loc_cpu();
89 for(fp = iod, i = 0 ; i < NUM_FIL ; fp++, i++){
90 if(fp->_flags == 0){
91 fp->_flags = __SRW;
92 unl_cpu();
93 return fp;
94 }
95 }
96 unl_cpu();
97 return 0;
98}
99
100/*
101 * free file structure
102 */
103static void free_file(FILE * fp)
104{
105 if(fp != NULL)
106 fp->_flags = 0;
107}
108
109/*
110 * fopen - open a file
111 * notice - not support text mode.
112 * not support append mode.
113 */
114FILE *__wrap_fopen(const char *name, const char *type)
115{
116 StorageDevice_t *psdev;
117 StorageDeviceFileFunc_t *pff;
118 FILE *fp;
119 int devno, i, id;
120 unsigned int mode = 0;
121 unsigned int stat = 0;
122
123 if((devno = SDMGetDeviceNo(&name)) < 0)
124 return NULL;
125 if((psdev = SDMGetStorageDevice(devno)) == 0)
126 return NULL;
127 pff = psdev->pdevff;
128 if(pff != 0 && pff->_sdevff_open == 0)
129 return NULL;
130
131 if((fp = alloc_file()) != 0){
132 for(i = 0 ; i < 8 && type[i] >= ' ' ; i++){
133 switch(type[i]){
134 case 'r':
135 stat |= O_RDONLY;
136 fp->_flags |= __SRD;
137 break;
138 case 'w':
139 stat |= O_WRONLY | O_CREAT;
140 fp->_flags |= __SWR;
141 break;
142 case 'a':
143 stat |= O_RDWR | O_CREAT;
144 fp->_flags |= __SRD | __SWR;
145 break;
146 case 'b':
147 break;
148 case '+':
149 break;
150 }
151 }
152 if((stat & O_ACCMODE) == (O_WRONLY | O_RDWR))
153 mode = (stat & ~O_ACCMODE) | O_RDWR;
154 else
155 mode = stat;
156 wai_sem(SEM_STDFILE);
157 id = pff->_sdevff_open(devno, name, mode);
158 sig_sem(SEM_STDFILE);
159 if(id < 0){
160 free_file(fp);
161 return NULL;
162 }
163 _setup_file(fp, psdev, id);
164 return fp;
165 }
166 else
167 return NULL;
168}
169
170/*
171 * fclose - close a file
172 */
173int __wrap_fclose(FILE *fp)
174{
175 StorageDevice_t *psdev;
176 int result;
177
178 if(fp == NULL)
179 return -1;
180 psdev = fp->_dev;
181 wai_sem(SEM_STDFILE);
182 if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_close != 0)
183 result = psdev->pdevff->_sdevff_close(fp->_file);
184 else
185 result = -1;
186 sig_sem(SEM_STDFILE);
187 free_file(fp);
188 return result;
189}
190
191/*
192 * fseek - seek a file
193 */
194int __wrap_fseek(FILE *fp, long offset, int whence)
195{
196 StorageDevice_t *psdev;
197 int result, res = 0;
198
199 if(fp == NULL)
200 return -1;
201 psdev = fp->_dev;
202 if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_lseek != 0){
203 result = psdev->pdevff->_sdevff_lseek(fp->_file, offset, whence, &res);
204 if(res < 0)
205 fp->_flags |= __SERR;
206 return result;
207 }
208 else
209 return -1;
210}
211
212/*
213 * ftell - get position file indicator
214 */
215long ftell(FILE *fp)
216{
217 StorageDevice_t *psdev;
218 long result;
219 int res = 0;
220
221 if(fp == NULL)
222 return -1;
223 psdev = fp->_dev;
224 if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_lseek != 0){
225 result = psdev->pdevff->_sdevff_lseek(fp->_file, 0, SEEK_CUR, &res);
226 if(res < 0)
227 fp->_flags |= __SERR;
228 return result;
229 }
230 else
231 return -1;
232}
233
234/*
235 * stat - get file status
236 * - set st_mode, st_atime, st_atimensec, st_mtime, st_mtimensec
237 * st_ctime, st_ctimensec, st_blksize, st_blocks, st_size
238 */
239int _stat(const char *name, struct stat *buf)
240{
241 StorageDevice_t *psdev;
242 int devno;
243 const char *sname = name;
244
245 devno = SDMGetDeviceNo((const char **)&name);
246 psdev = SDMGetStorageDevice(devno);
247 if(psdev == NULL)
248 return -1;
249 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_stat == 0)
250 return -1;
251 if(psdev->pdevff->_sdevff_stat(sname, buf) >= 0)
252 return 0;
253 else
254 return -1;
255}
256
257/*
258 * lstat from fsiunixlike.c, fslpux.c
259 */
260int lstat(const char *path, struct stat *buf)
261{
262 return stat(path, buf);
263}
264
265/*
266 * access from fsiunixlike.c(2)
267 * mode=0-file exist, mode=2-writeable OK-0 Err--1
268 */
269int access(const char *path, int mode)
270{
271 struct stat buf;
272 int res = -1;
273
274 if(stat(path, &buf) >= 0){
275 res = 0;
276 if((mode & 0x02) != 0 && (buf.st_flags & 0x0001) != 0) /* read only(no debug) */
277 res = -1;
278 }
279 return res;
280}
281
282/*
283 * mkdir - make directory
284 * - not support mode
285 */
286int mkdir(const char *path, mode_t mode)
287{
288 StorageDevice_t *psdev;
289 int devno;
290
291 devno = SDMGetDeviceNo((const char **)&path);
292 psdev = SDMGetStorageDevice(devno);
293 if(psdev == NULL)
294 return -1;
295 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_mkdir == 0)
296 return -1;
297 if(psdev->pdevff->_sdevff_mkdir(path) >= 0)
298 return 0;
299 else
300 return -1;
301}
302
303/*
304 * rmdir from fsiunixlike.c(3), fslpux.c, device.c
305 */
306int rmdir(const char *path)
307{
308 StorageDevice_t *psdev;
309 int devno;
310
311 devno = SDMGetDeviceNo((const char **)&path);
312 psdev = SDMGetStorageDevice(devno);
313 if(psdev == NULL)
314 return -1;
315 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_rmdir == 0)
316 return -1;
317 if(psdev->pdevff->_sdevff_rmdir(path) >= 0)
318 return 0;
319 else
320 return -1;
321}
322
323/*
324 * chmod from fsiunixlike.c(2)
325 */
326int chmod(const char *path, mode_t mode)
327{
328 StorageDevice_t *psdev;
329 int devno;
330
331 devno = SDMGetDeviceNo((const char **)&path);
332 psdev = SDMGetStorageDevice(devno);
333 if(psdev == NULL)
334 return -1;
335 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_chmod == 0)
336 return -1;
337 if(psdev->pdevff->_sdevff_chmod(path, mode) >= 0)
338 return 0;
339 else
340 return -1;
341}
342
343/*
344 * remove - remove a file
345 */
346int remove(const char *name)
347{
348 StorageDevice_t *psdev;
349 int devno;
350
351 devno = SDMGetDeviceNo((const char **)&name);
352 psdev = SDMGetStorageDevice(devno);
353 if(psdev == NULL)
354 return -1;
355 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_unlink == 0)
356 return -1;
357 if(psdev->pdevff->_sdevff_unlink(name) >= 0)
358 return 0;
359 else
360 return -1;
361}
362
363/*
364 * unlink - remove file
365 */
366bool_t unlink(const char *path)
367{
368 StorageDevice_t *psdev;
369 int devno;
370
371 devno = SDMGetDeviceNo((const char **)&path);
372 psdev = SDMGetStorageDevice(devno);
373 if(psdev == NULL)
374 return -1;
375 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_unlink == 0)
376 return -1;
377 if(psdev->pdevff->_sdevff_unlink(path) >= 0)
378 return 0;
379 else
380 return -1;
381}
382
383/*
384 * rename - change file name
385 */
386int rename(const char *oldpath, const char *newpath)
387{
388 StorageDevice_t *psdev;
389 int devno;
390
391 devno = SDMGetDeviceNo((const char **)&oldpath);
392 psdev = SDMGetStorageDevice(devno);
393 if(psdev == NULL)
394 return -1;
395 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_rename == 0)
396 return -1;
397 if(psdev->pdevff->_sdevff_rename(oldpath, newpath) >= 0)
398 return 0;
399 else
400 return -1;
401}
402
403/*
404 * mkstemp from fsiunixlike.c, device.c
405 */
406int mkstemp(char *path)
407{
408 printf("### mkstemp() !! ##\n");
409 slp_tsk();
410 return 0;
411}
412
413/*
414 * opendir from fsiunixlike.c, fslpux.c(2), device.c
415 */
416void *opendir(const char *path)
417{
418 int devno;
419
420 devno = SDMGetDeviceNo((const char **)&path);
421 pdirpsdev = SDMGetStorageDevice(devno);
422 if(pdirpsdev == NULL)
423 return NULL;
424 if(pdirpsdev->pdevff == 0 || pdirpsdev->pdevff->_sdevff_opendir == 0)
425 return NULL;
426 return pdirpsdev->pdevff->_sdevff_opendir(path);
427}
428
429/*
430 * closedir from fsiunixlike.c(2), fslpux.c(4)
431 */
432int closedir(void *dir)
433{
434 if(pdirpsdev == NULL)
435 return 0;
436 if(pdirpsdev->pdevff == 0 || pdirpsdev->pdevff->_sdevff_closedir == 0)
437 return 0;
438 return pdirpsdev->pdevff->_sdevff_closedir(dir);
439}
440
441/*
442 * readdir from fsiunixlike.c, fslpux.c(2), device.c
443 */
444struct dirent *readdir(void *dir)
445{
446 static struct dirent Dirent;
447 static struct dirent2 finfo;
448 struct dirent *pdirent;
449 int i;
450
451 if(pdirpsdev == 0)
452 return NULL;
453 if(pdirpsdev->pdevff == 0 || pdirpsdev->pdevff->_sdevff_readdir == 0)
454 return NULL;
455 if(pdirpsdev->pdevff->_sdevff_readdir(dir, &finfo) == 0)
456 return NULL;
457 pdirent = &Dirent;
458 memset(pdirent, 0, sizeof(struct dirent));
459 for(i = 0 ; i < MAXNAMLEN && finfo.d_name[i] != 0 ; i++)
460 pdirent->d_name[i] = finfo.d_name[i];
461 pdirent->d_namlen = i;
462 pdirent->d_reclen = i;
463 if(finfo.d_type & AM_DIR)
464 Dirent.d_type = DT_DIR;
465 else
466 Dirent.d_type = DT_BLK;
467 return pdirent;
468}
469
470/*
471 * statfs from fslpux.c
472 */
473int statfs(const char *path, struct statfs2 *status)
474{
475 StorageDevice_t *psdev;
476 int devno;
477 const char *name = path;
478
479 devno = SDMGetDeviceNo((const char **)&path);
480 psdev = SDMGetStorageDevice(devno);
481 if(psdev == NULL)
482 return -1;
483 if(psdev->pdevff == 0 || psdev->pdevff->_sdevff_statfs == 0)
484 return -1;
485 return psdev->pdevff->_sdevff_statfs(name, (void *)status);
486}
487
Note: See TracBrowser for help on using the repository browser.