⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsmvfs.c

📁 norflash的文件系统。 用于中低端手机开发的参考
💻 C
📖 第 1 页 / 共 3 页
字号:
	FsP = FsmVfsFds[fd].VolumeP->FsDrvP;

	status = FsP->FsmIoCtrl(FsmVfsFds[fd].LowerFd, FSM_IOCTL_EOF, Eof);

	FsmVfsFds[fd].ErrorCode = status;

	FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);

	return status;
}


/*
* Function Name: FsmError
* Description  : get the error code for the Fd
* Arguments    : fd        : file descriptor
* First Edit 2003.7.23 wsm
*/

uint32 FsmError(uint32 fd)
{

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmError in %s,%d \n", __FILE__, __LINE__);
#endif

	if (fd >= MAX_VFS_FD)
	{
		return ERR_PARAM;
	}

	return FsmVfsFds[fd].ErrorCode;
}

/*
* Function Name: FsmGetAttrib
* Description  : get the information of the file
* Arguments    : fd        : file descriptor
*              : attrib    : output attribute buffer,space not alloced!
* First Edit 2003.7.23 wsm
*/

uint32 FsmGetAttrib(uint32 fd, FsmFileAttribT * attrib)
{
	uint32			status;
	FsmFsDrvT *		FsP;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmGetAttrib in %s,%d \n", __FILE__, __LINE__);
#endif

	if (fd >= MAX_VFS_FD)
	{
		return ERR_PARAM;
	}

	if (attrib == NULL)
	{
		FsmVfsFds[fd].ErrorCode = ERR_PARAM;
	    return ERR_PARAM;
	}

	if ((status = FsmGetMtxSem(FsmVfsFds[fd].MutexSem)) != ERR_NONE)
	{
		FsmVfsFds[fd].ErrorCode = status;
		return status;
	}

	if((FsmVfsFds[fd].Flag == VFD_FLAG_FREE)
		|| (FsmVfsFds[fd].LowerFd == (uint32)(-1))
		|| (FsmVfsFds[fd].VolumeP == NULL))
	{
		FsmVfsFds[fd].ErrorCode = ERR_PARAM;
		FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);
		return ERR_PARAM;
	}

	FsP = FsmVfsFds[fd].VolumeP->FsDrvP;

	status = FsP->FsmIoCtrl(FsmVfsFds[fd].LowerFd, FSM_IOCTL_GET_ATTRIB, (void *)attrib);

	FsmVfsFds[fd].ErrorCode = status;

	FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);

	return status;
}

/*
* Function Name: FsmGetAttribByName
* Description  : get the information of the file
* Arguments    : path      : file name
*              : attrib    : output attribute buffer,space alloced!
* First Edit 2003.7.23 wsm
*/

uint32 FsmGetAttribByName(const char * filename, FsmFileAttribT * attrib)
{
	uint32		fd;
	uint32		status;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmGetAttribByName in %s,%d \n", __FILE__, __LINE__);
#endif

	fd = FsmOpen(filename, FSM_OPEN_EXISTING | FSM_OPEN_READ | FSM_OPEN_FILE);

	if(fd == INVALID_FILE_HANDLE)
	{
		return ERR_UNKOWN;
	}

	status = FsmGetAttrib(fd, attrib);

	FsmClose(fd);

	return status;
}


/*
* Function Name: FsmSetAttrib
* Description  : Set the information of the file
* Arguments    : path      : file name
*              : attrib    : output attribute buffer
* First Edit 2003.7.23 wsm
* Currently unsupported
*/

uint32 FsmSetAttrib ( const char * path, FsmFileAttribT * attrib)
{
	return ERR_NOT_SUPPORT;
}

/*
* Function Name: FsmTruncate
* Description  : truncate the the lenghth file
* Arguments    : fd        : file descriptor
*              : size      : remain size
* First Edit 2003.7.23 wsm
*
*/

uint32 FsmTruncate(uint32 fd, uint32 size)
{
	uint32			status;
	FsmFsDrvT *		FsP;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmTruncate in %s,%d \n", __FILE__, __LINE__);
#endif

	if (fd >= MAX_VFS_FD)
	{
		return ERR_PARAM;
	}

	if ((status = FsmGetMtxSem(FsmVfsFds[fd].MutexSem)) != ERR_NONE)
	{
		FsmVfsFds[fd].ErrorCode = status;
		return status;
	}

	if((FsmVfsFds[fd].Flag == VFD_FLAG_FREE)
		|| (FsmVfsFds[fd].LowerFd == (uint32)(-1))
		|| (FsmVfsFds[fd].VolumeP == NULL))
	{
		FsmVfsFds[fd].ErrorCode = ERR_PARAM;
		FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);
		return ERR_PARAM;
	}

	FsP = FsmVfsFds[fd].VolumeP->FsDrvP;

	status = FsP->FsmIoCtrl(FsmVfsFds[fd].LowerFd, FSM_IOCTL_TRUNCATE, &size);

	FsmVfsFds[fd].ErrorCode = status;

	FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);

	return status;
}

/*
 * Function Name: FsmRemove
 * Description  : remove the file
 * Arguments    : filename  : file name
 * First Edit 2003.7.23 wsm
 */

uint32 FsmRemove(const char * filename)
{
	uint32			status;
	uint32			VolIndex;
	FsmFsDrvT *		FsP;
	char   *		path;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmRemove in %s,%d :Remove %s \n", __FILE__, __LINE__, path);
#endif

	if(strlen(filename) > MAX_PATH_LENGTH)
	{
		return ERR_PARAM;
	}

	path = (char *)filename;

    if ((status = FsmGetMtxSem(FsmVolumeMtxSem)) != ERR_NONE )
	{
		return status;
	}

	VolIndex = FsmGetMatchedVolume(&path);

	if (VolIndex == MAX_VOLUME_NUM)
	{
		FsmReleaseMtxSem(FsmVolumeMtxSem);

		return ERR_PARAM;
	}

	FsmVolumes[VolIndex].RefCnt++; /* prevent volume from being unmounted. */

	FsP = FsmVolumes[VolIndex].FsDrvP;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	status = FsP->FsmDelete(FsmVolumes[VolIndex].DevObjP, path);

	FsmGetMtxSem(FsmVolumeMtxSem);

	FsmVolumes[VolIndex].RefCnt--;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	return status;
}

/*
* Function Name: FsmRename
* Description  : Rename a file or a directory
* Arguments    : path     : file or directory path
*              : newname  : new name for the fiel or directory
* First Edit 2003.8.13 wsm
*/

uint32 FsmRename(const char *filename, const char *newname)
{
	uint32			status;
	uint32			VolIndex;
	FsmFsDrvT *		FsP;
	char   *		path;

	FsmIoctlRenameT		RenameArg;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmRename in %s,%d :Rename %s to %s \n", __FILE__, __LINE__, filename, newname);
#endif

	if(strlen(filename) > MAX_PATH_LENGTH)
	{
		return ERR_PARAM;
	}

	if(strlen(newname) > MAX_PATH_LENGTH)
	{
		return ERR_PARAM;
	}

	path = (char *)filename;

    if ((status = FsmGetMtxSem(FsmVolumeMtxSem)) != ERR_NONE )
	{
		return status;
	}

	VolIndex = FsmGetMatchedVolume(&path);

	if (VolIndex == MAX_VOLUME_NUM)
	{
		FsmReleaseMtxSem(FsmVolumeMtxSem);

		return ERR_PARAM;
	}

	FsmVolumes[VolIndex].RefCnt++; /* prevent volume from being unmounted. */

	FsP = FsmVolumes[VolIndex].FsDrvP;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	RenameArg.DevObjP = FsmVolumes[VolIndex].DevObjP;
	RenameArg.path    = path;
	RenameArg.newname = ExtractFilename(newname);

	status = FsP->FsmIoCtrl(INVALID_FILE_HANDLE, FSM_IOCTL_RENAME, (void *)&RenameArg);

	FsmGetMtxSem(FsmVolumeMtxSem);

	FsmVolumes[VolIndex].RefCnt--;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	return status;
}

/*
* Function Name: FsmMkdir
* Description  : Create a directory
* Arguments    : path     : file or directory path
* First Edit 2003.8.13 wsm
*/

uint32 FsmMakeDir(const char * dirname)
{
	uint32			status;
	uint32			VolIndex;
	FsmFsDrvT *		FsP;
	char   *		path;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmMkDir in %s,%d :Mkdir %s \n", __FILE__, __LINE__, dirname);
#endif

	if (strlen(dirname) > MAX_PATH_LENGTH)
	{
		return ERR_PARAM;
	}

	path = (char *)dirname;

    if ((status = FsmGetMtxSem(FsmVolumeMtxSem)) != ERR_NONE )
	{
		return status;
	}

	VolIndex = FsmGetMatchedVolume(&path);

	if (VolIndex == MAX_VOLUME_NUM)
	{
		FsmReleaseMtxSem(FsmVolumeMtxSem);

		return ERR_PARAM;
	}

	FsmVolumes[VolIndex].RefCnt++; /* prevent volume from being unmounted. */

	FsP = FsmVolumes[VolIndex].FsDrvP;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	FsP->FsmCreate( FsmVolumes[VolIndex].DevObjP,
					path,
					FSM_OPEN_DIR | FSM_CREATE_NEW | FSM_OPEN_READ,
					&status
					);

	FsmGetMtxSem(FsmVolumeMtxSem);

	FsmVolumes[VolIndex].RefCnt--;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	return status;
}

/*
* Function Name: FsmRemovedir
* Description  : Delete a empty directory
* Arguments    : path     : file or directory path
* First Edit 2003.8.13 wsm
*/

uint32 FsmRemoveDir(const char * dirname)
{
	uint32			status;
	uint32			VolIndex;
	FsmFsDrvT *		FsP;
	char   *		path;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmRemoveDir in %s,%d :Remove dir %s \n", __FILE__, __LINE__, dirname);
#endif

	if (strlen(dirname) > MAX_PATH_LENGTH)
	{
		return ERR_PARAM;
	}

	path = (char *)dirname;

    if ((status = FsmGetMtxSem(FsmVolumeMtxSem)) != ERR_NONE )
	{
		return status;
	}

	VolIndex = FsmGetMatchedVolume(&path);

	if (VolIndex == MAX_VOLUME_NUM)
	{
		FsmReleaseMtxSem(FsmVolumeMtxSem);

		return ERR_PARAM;
	}

	FsmVolumes[VolIndex].RefCnt++; /* prevent volume from being unmounted. */

	FsP = FsmVolumes[VolIndex].FsDrvP;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	status = FsP->FsmDelete(FsmVolumes[VolIndex].DevObjP, path);

	FsmGetMtxSem(FsmVolumeMtxSem);

	FsmVolumes[VolIndex].RefCnt--;

	FsmReleaseMtxSem(FsmVolumeMtxSem);

	return status;
}

/*
* Function Name: FsmFindFirstFile
* Description  : Delete a empty directory
* Arguments    : filename    : file name
*              : info        : content buffer
* First Edit 2003.8.13 wsm
*/

HENUM FsmFindFirstFile(const char * filename, FsmFileInfoT * Info)
{
	uint32		status;
	uint32      VolIndex;
	char		dir[MAX_PATH_LENGTH + 1];
	uint32		len;
	char   *	name;
	uint32      vfd;
	HENUM		hEnum;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmFindFirstFile in %s,%d :Lookup for %s \n", __FILE__, __LINE__, filename);
#endif

	if ((filename == NULL) || (Info == NULL))
	{
		return NULL;
	}

	if(strlen(filename) > MAX_PATH_LENGTH)
	{
		return NULL;
	}

	if(ExtractDir(filename, &len) != 0)
	{
		if(len > 0)
		{
			char	* path;

			FsmMemoryMove((uint8 *)dir, (uint8 *)filename, len);
			dir[len] = 0; /* It is a zero-end string now. */

			path = &dir[0];

			if ((status = FsmGetMtxSem(FsmVolumeMtxSem)) != ERR_NONE )
			{
				return NULL;
			}

			VolIndex = FsmGetMatchedVolume(&path);

			FsmReleaseMtxSem(FsmVolumeMtxSem);

			if(VolIndex == MAX_VOLUME_NUM)
			{
				return NULL;
			}

			/* path doesn't contain Volume Name now! */
			/* If it is not root dir, then discard the last slash. */
			if(strlen(path) != 1)
				dir[len - 1] = 0; 
		}
		else
		{
			return NULL;
		}
	}
	else
	{
		return NULL;
	}

	name = ExtractFilename(filename);

	if(name == NULL)
	{
		return NULL;
	}

	if(name[0] == 0)
	{
		return NULL;
	}

	if(strlen(name) > FILE_NAME_LENGTH)
	{
		return NULL;
	}

	hEnum = FsmMalloc(sizeof(FsmFileEnumT));

	if(hEnum == NULL)
	{
		return NULL;
	}

	vfd = FsmOpenDir((const char *)&dir[0]);

	if (vfd == INVALID_FILE_HANDLE)
	{
		FsmFree(hEnum);
		return NULL;
	}

	((FsmFileEnumT *)hEnum)->vfd = vfd;
	strcpy(((FsmFileEnumT *)hEnum)->pattern, name);

	while (FsmReadDir(vfd, Info) == ERR_NONE)
	{
	    if (FsmStringMatched(name, Info->FileName) == 1 )
	    {
		    return hEnum;
	    }
    }

	FsmCloseDir(vfd);
	FsmFree(hEnum);

    return NULL;
}

/*
* Function Name: FsmFindNextFile(Generated)
* Description  : Delete a empty directory
* Arguments    : fd          : file descriptor
*              : info        : content buffer
* First Edit 2003.8.13 wsm
*/

uint32 FsmFindNextFile(HENUM hEnum, FsmFileInfoT * Info)
{
	char *		name = NULL;
	uint32		fd;

	if(hEnum == NULL)
		return ERR_PARAM;

	fd = ((FsmFileEnumT *)hEnum)->vfd;

	if (fd >= MAX_VFS_FD)
	{
		return ERR_PARAM;
	}

	if (Info == NULL)
	{
		return ERR_PARAM;
	}

	name = &((FsmFileEnumT *)hEnum)->pattern[0];

	while (FsmReadDir(fd, Info) == ERR_NONE)
	{
	    if (FsmStringMatched(name, Info->FileName) == 1)
	    {
		    return ERR_NONE;
	    }
    }

    return ERR_NOTEXIST;
}

/*
* Function Name: FsmFindClose (Generated)
* Description  : Delete a empty directory
* Arguments    : fd          : file descriptor
* First Edit 2003.8.13 wsm
*/

uint32 FsmFindClose(HENUM hEnum)
{
	uint32		status;

	if(hEnum == NULL)
		return ERR_PARAM;

	status = FsmCloseDir(((FsmFileEnumT *)hEnum)->vfd);

	if(status == ERR_NONE)
	{
		status = FsmFree(hEnum);
	}

	return status;
}


/*
* Function Name: FsmFlush
* Description  : Delete a empty directory
* Arguments    : fd          : file descriptor
* First Edit 2003.8.13 wsm
*/

uint32 FsmFlush(uint32 fd)
{
	uint32			status;
	FsmFsDrvT *		FsP;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmFlush in %s,%d \n", __FILE__, __LINE__);
#endif

	if (fd >= MAX_VFS_FD)
	{
		return ERR_PARAM;
	}

	if ((status = FsmGetMtxSem(FsmVfsFds[fd].MutexSem)) != ERR_NONE)
	{
		FsmVfsFds[fd].ErrorCode = status;
		return status;
	}

	if((FsmVfsFds[fd].Flag == VFD_FLAG_FREE)
		|| (FsmVfsFds[fd].LowerFd == (uint32)(-1))
		|| (FsmVfsFds[fd].VolumeP == NULL))
	{
		FsmVfsFds[fd].ErrorCode = ERR_PARAM;
		FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);
		return ERR_PARAM;
	}

	FsP = FsmVfsFds[fd].VolumeP->FsDrvP;

	status = FsP->FsmIoCtrl(FsmVfsFds[fd].LowerFd, FSM_IOCTL_FLUSH, NULL);

	FsmVfsFds[fd].ErrorCode = status;

	FsmReleaseMtxSem(FsmVfsFds[fd].MutexSem);

	return status;
}

/*
* Function Name: FsmFlushAll
* Description  : Delete a empty directory
* Arguments    :
* First Edit 2003.8.13 wsm
*/

uint32 FsmFlushAll()
{

	uint32		fd;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmFlushAll in %s,%d \n", __FILE__, __LINE__);
#endif

	for (fd = 0; fd < MAX_VFS_FD; fd++)
	{
		FsmFlush(fd);
	}

	return ERR_NONE;
}

/*
* Function Name: FsmGetFreeSpace
* Description  : Delete a empty directory
* Arguments    : VolumeName      : the volumn path
*              : totalspace      : device space
*              : availablespace  : free space & dirty space
*              : freespace       : free space
* First Edit 2003.8.13 wsm
*/

uint32 FsmGetFreeSpace(const char * VolumeName, uint32 * total_space, uint32 * avail_space, uint32 * free_space)
{
	uint32			status;
	uint32			VolIndex;
	FsmFsDrvT *		FsP;
	char   *		path;

	FsmIoctlGetFreeSpaceT	GetFreeSpace;

#ifdef FSM_DEBUG
	MonPrintf("Interface FsmFlushAll in %s,%d \n", __FILE__, __LINE__);
#endif

    /* argument check */
	if ((total_space == NULL) && (avail_space == NULL) && (free_space == NULL))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -