/* * ファイルマップ関数(mmap) */ void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { struct StdFileIndex *ps; StorageDevice_t *psdev; if((ps = fdcheck(fd)) == 0) return (void*)-1; psdev = ps->sdmdev; if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_mmap != 0) return psdev->pdevff->_sdevff_mmap(start, length, prot, flags, ps->sdmfd, offset); else return (void*)-1; }
static bool fdcheck() { if(!fdfind_first()) { if(fdexpand()) { return fdcheck(); } return false; } return true; }
/* * 標準ファイルインターフェイス関数(write) */ long write(int fd, const void *buf, long count) { struct StdFileIndex *ps; StorageDevice_t *psdev; if((ps = fdcheck(fd)) == 0) return -1; psdev = ps->sdmdev; if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_write != 0) return psdev->pdevff->_sdevff_write(ps->sdmfd, buf, count); else return 0; }
/* * 標準ファイルインターフェイス関数(lseek) */ off_t lseek(int fd, off_t offset, int whence) { struct StdFileIndex *ps; StorageDevice_t *psdev; if((ps = fdcheck(fd)) == 0) return -1; psdev = ps->sdmdev; if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_lseek != 0) return psdev->pdevff->_sdevff_lseek(ps->sdmfd, offset, whence); else return -1; }
/* * 標準ファイルインターフェイス関数(fstat) */ int fstat(int fd, struct stat *buf) { struct StdFileIndex *ps; StorageDevice_t *psdev; if((ps = fdcheck(fd)) == 0) return -1; psdev = ps->sdmdev; if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_fstat != 0) return psdev->pdevff->_sdevff_fstat(ps->sdmfd, buf); else return -1; }
/* * 標準ファイルインターフェイス関数(close) */ int close(int fd) { struct StdFileIndex *ps; StorageDevice_t *psdev; int result; if((ps = fdcheck(fd)) == 0) return -1; wai_sem(SEM_STDFILE); psdev = ps->sdmdev; if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_close != 0) result = psdev->pdevff->_sdevff_close(ps->sdmfd); else result = -1; ps->sdmfd = -1; sig_sem(SEM_STDFILE); return result; }
uint32_t k_fopen(const char *path, uint32_t mode) { file_t *file = NULL; file = k_malloc(sizeof(file_t)); k_memset(file, 0, sizeof(file_t)); if(!file) return 0; if(mode & FILE_OPEN_IN_VFS) { /* get file desc in vfs */ if(!k_vfs_open_file(file, path, mode)) goto failed; } if(!file->open) goto failed; if(!file->open(path, mode, file)) goto failed; file->flags = mode; /* check next file descriptor is present */ /* if not - fd array is full, and relocation failed */ if(!fdcheck()) goto failed; /* setup next file descriptor */ fdt.fdarray[fdt.fdcounter] = file; file->fd = fdt.fdcounter; return fdt.fdcounter; failed: k_free(file); return 0; }
/* * 標準入出力ファイルの設定 */ int _setupstd_file(FILE *st, int fd) { struct StdFileIndex *ps; if(st == NULL) return 0; st->_func_in = local_getc; st->_func_ins = local_gets; st->_func_out = local_putc; st->_func_outs = local_puts; st->_func_flush = local_flush; if((ps = fdcheck(fd)) == 0){ st->_file = -1; st->_dev = 0; return 0; } else{ st->_file = ps->sdmfd; st->_dev = ps->sdmdev; return 1; } }