int32 FS_readdir( IN tdir_handle_t hdir, OUT dirent_t * pdirent) { tdir_t * pdir = (tdir_t *)hdir; uint32 ret; tdir_entry_t * pdir_entry; if (!hdir || !pdirent) return ERR_FS_INVALID_PARAM; ret = FS_OK; pdir_entry = dirent_malloc(); while (1) { uint32 de_ret; de_ret = dirent_get_next(pdir, pdir_entry); if (de_ret == DIRENTRY_OK) { Strcpy(pdirent->d_name, pdir_entry->long_name); Strcpy(pdirent->d_name_short, pdir_entry->short_name); pdirent->dir_attr = dirent_get_dir_attr(pdir_entry); pdirent->dir_file_size = dirent_get_file_size(pdir_entry); pdirent->crttime.year = ((dirent_get_crt_date(pdir_entry) & 0xFE00) >> 9) + 1980; pdirent->crttime.month = ((dirent_get_crt_date(pdir_entry) & 0x1E0) >> 5); pdirent->crttime.day = (dirent_get_crt_date(pdir_entry) & 0x1F); pdirent->crttime.hour = (dirent_get_crt_time(pdir_entry) & 0xF800) >> 11; pdirent->crttime.min = (dirent_get_crt_time(pdir_entry) & 0x7E0) >> 5; pdirent->crttime.sec = ((dirent_get_crt_time(pdir_entry) & 0x1F) << 2) + (dirent_get_crt_time_tenth(pdir_entry) & 1); break; } else if (de_ret == ERR_DIRENTRY_NOMORE_ENTRY) {
int32 TFFS_fopen( IN tffs_handle_t hfs, IN byte * file_path, IN byte * open_mode, OUT tfile_handle_t * phfile) { int32 ret; tffs_t * ptffs = (tffs_t *)hfs; byte * fname, * path; byte * dup_file_path; tfile_t * pfile; tdir_t * pdir; tdir_entry_t * pdir_entry; if (!hfs || !file_path || !open_mode || !phfile) return ERR_TFFS_INVALID_PARAM; ret = TFFS_OK; pfile = (tfile_t *)Malloc(sizeof(tfile_t)); dup_file_path = dup_string(file_path); pdir_entry = dirent_malloc(); fname = (byte *)Malloc(DNAME_MAX); pfile->secbuf = (ubyte *)Malloc(ptffs->pbs->byts_per_sec); Memset(pfile->secbuf, 0, ptffs->pbs->byts_per_sec); path = dup_file_path; if (!divide_path(dup_file_path, fname)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (!_parse_open_mode(open_mode, &pfile->open_mode)) { ret = ERR_TFFS_INVALID_OPENMODE; goto _release; } if ((dir_init(ptffs, path, &pdir)) != DIR_OK) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (dirent_find(pdir, fname, pdir_entry) != DIRENTRY_OK) { DBG("%s(): can't find file [%s] at [%s]\n", __FUNCTION__, fname, path); if (pfile->open_mode == OPENMODE_READONLY) { ret = ERR_TFFS_FILE_NOT_EXIST; goto _release; } if (!dirent_init(fname, 0, TRUE, pdir_entry)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((ret = dir_append_direntry(pdir, pdir_entry)) != DIR_OK) { if (ret == ERR_DIR_NO_FREE_SPACE) { ret = ERR_TFFS_NO_FREE_SPACE; } else { ret = ERR_TFFS_DEVICE_FAIL; } goto _release; } } ret = _initialize_file(ptffs, pdir, pdir_entry, pfile); if (ret == FILE_OK) { *phfile = (tfile_handle_t)pfile; } _release: Free(fname); Free(dup_file_path); return ret; }
int32 TFFS_rmfile( IN tffs_handle_t hfs, IN byte * file_path) { int32 ret; byte * fname, * path; byte * dup_file_path; tdir_t * pdir; tffs_t * ptffs; tdir_entry_t * pdir_entry; ret = TFFS_OK; if (!hfs || !file_path) return ERR_TFFS_INVALID_PARAM; ptffs = (tffs_t *)hfs; dup_file_path = dup_string(file_path); fname = (byte *)Malloc(DNAME_MAX); pdir_entry = dirent_malloc(); path = dup_file_path; if (!divide_path(dup_file_path, fname)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((dir_init(ptffs, path, &pdir)) != DIR_OK) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((ret = dirent_find(pdir, fname, pdir_entry)) == DIRENTRY_OK) { if (dirent_get_dir_attr(pdir_entry) & ATTR_DIRECTORY) { ret = ERR_TFFS_IS_NOT_A_FILE; goto _release; } if (dir_del_direntry(pdir, fname) != DIR_OK) { ret = ERR_TFFS_REMOVE_FILE_FAIL; goto _release; } if (fat_free_clus(pdir->ptffs->pfat, dirent_get_clus(pdir_entry)) != FAT_OK) { ret = ERR_TFFS_REMOVE_FILE_FAIL; goto _release; } ret = TFFS_OK; } else { ret = ERR_TFFS_NO_SUCH_FILE; goto _release; } _release: Free(fname); Free(dup_file_path); dirent_release(pdir_entry); dir_destroy(pdir); return ret; }