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) {
Esempio n. 2
0
File: file.c Progetto: ralt/tffs-lib
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;
}
Esempio n. 3
0
File: file.c Progetto: ralt/tffs-lib
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;
}