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) {
Beispiel #2
0
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;
}