feature: 补充pread/pwrite接口

Signed-off-by: arvinzzz <zhaotianyu9@huawei.com>
Change-Id: Ie31cacd18131113e51a6949dfba57a86ca4eb0e5
This commit is contained in:
arvinzzz 2022-02-24 17:10:50 +08:00
parent 36887d467d
commit 491cefae76
9 changed files with 274 additions and 0 deletions

View File

@ -1475,6 +1475,110 @@ OUT:
return ret;
}
ssize_t fatfs_pread(int fd, void *buf, size_t nbyte, off_t offset)
{
INT32 ret;
off_t savepos, pos;
if (buf == NULL) {
errno = EFAULT;
return FS_FAILURE;
}
ret = FsLock();
if (ret != 0) {
errno = ret;
return FS_FAILURE;
}
if (!IsValidFd(fd)) {
FsUnlock();
errno = EBADF;
return FS_FAILURE;
}
savepos = (off_t)fatfs_lseek(fd, 0, SEEK_CUR);
if (savepos == (off_t)-1) {
errno = FatfsErrno(savepos);
return FS_FAILURE;
}
pos = (off_t)fatfs_lseek(fd, offset, SEEK_SET);
if (pos == (off_t)-1) {
errno = FatfsErrno(pos);
return FS_FAILURE;
}
ret = fatfs_read(fd, buf, nbyte);
if (ret < 0) {
FsUnlock();
errno = FatfsErrno(ret);
return FS_FAILURE;
}
pos = (off_t)fatfs_lseek(fd, savepos, SEEK_SET);
if ((pos == (off_t)-1) && (ret >= 0)) {
errno = FatfsErrno(pos);
return FS_FAILURE;
}
FsUnlock();
return (ssize_t)ret;
}
ssize_t fatfs_pwrite(int fd, const void *buf, size_t nbyte, off_t offset)
{
INT32 ret;
off_t savepos, pos;
if (buf == NULL) {
errno = EFAULT;
return FS_FAILURE;
}
ret = FsLock();
if (ret != 0) {
errno = ret;
return FS_FAILURE;
}
if (!IsValidFd(fd)) {
FsUnlock();
errno = EBADF;
return FS_FAILURE;
}
savepos = (off_t)fatfs_lseek(fd, 0, SEEK_CUR);
if (savepos == (off_t)-1) {
errno = FatfsErrno(savepos);
return FS_FAILURE;
}
pos = (off_t)fatfs_lseek(fd, offset, SEEK_SET);
if (pos == (off_t)-1) {
errno = FatfsErrno(pos);
return FS_FAILURE;
}
ret = fatfs_write(fd, buf, nbyte);
if (ret < 0) {
FsUnlock();
errno = FatfsErrno(ret);
return FS_FAILURE;
}
pos = (off_t)fatfs_lseek(fd, savepos, SEEK_SET);
if ((pos == (off_t)-1) && (ret >= 0)) {
errno = FatfsErrno(pos);
return FS_FAILURE;
}
FsUnlock();
return (ssize_t)ret;
}
struct MountOps g_fatfsMnt = {
.Mount = fatfs_mount,
.Umount = fatfs_umount,
@ -1498,4 +1602,6 @@ struct FileOps g_fatfsFops = {
.Getattr = fatfs_stat,
.Fsync = fatfs_fsync,
.Fstat = fatfs_fstat,
.Pread = fatfs_pread,
.Pwrite = fatfs_pwrite,
};

View File

@ -69,6 +69,8 @@ int fatfs_rmdir(const char *path);
int fatfs_rename(const char *oldName, const char *newName);
int fatfs_statfs(const char *path, struct statfs *buf);
int fatfs_ftruncate(int fd, off_t length);
ssize_t fatfs_pread(int fd, void *buf, size_t nbyte, off_t offset);
ssize_t fatfs_pwrite(int fd, const void *buf, size_t nbyte, off_t offset);
/**
* @brief divide a physical drive (SD card, U disk, and MMC card), this function is OHOS-specific

View File

@ -323,6 +323,8 @@ const struct FileOps g_lfsFops = {
.Getattr = LfsStat,
.Fsync = LfsFsync,
.Fstat = LfsFstat,
.Pread = LfsPread,
.Pwrite = LfsPwrite,
};
int LfsMount(const char *source, const char *target, const char *fileSystemType, unsigned long mountflags,
@ -801,5 +803,89 @@ int LfsFstat(int fd, struct stat *buf)
errno = LittlefsErrno(ret);
ret = VFS_ERROR;
}
return ret;
}
int LfsPread(int fd, void *buf, size_t nbyte, off_t offset)
{
int ret;
off_t savepos, pos;
if (buf == NULL) {
errno = EFAULT;
return VFS_ERROR;
}
if (LfsFdIsValid(fd) == FALSE) {
errno = EBADF;
return VFS_ERROR;
}
savepos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), 0, SEEK_CUR);
if (savepos == (off_t)-1) {
errno = LittlefsErrno(savepos);
return VFS_ERROR;
}
pos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), offset, SEEK_SET);
if (pos == (off_t)-1) {
errno = LittlefsErrno(pos);
return VFS_ERROR;
}
ret = lfs_file_read(g_handle[fd].lfsHandle, &(g_handle[fd].file), buf, nbyte);
if (ret < 0) {
errno = LittlefsErrno(ret);
ret = VFS_ERROR;
}
pos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), savepos, SEEK_SET);
if ((pos == (off_t)-1) && (ret >= 0)) {
errno = LittlefsErrno(pos);
return VFS_ERROR;
}
return ret;
}
int LfsPwrite(int fd, const void *buf, size_t nbyte, off_t offset)
{
int ret;
off_t savepos, pos;
if (buf == NULL) {
errno = EFAULT;
return VFS_ERROR;
}
if (LfsFdIsValid(fd) == FALSE) {
errno = EBADF;
return VFS_ERROR;
}
savepos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), 0, SEEK_CUR);
if (savepos == (off_t)-1) {
errno = LittlefsErrno(savepos);
return VFS_ERROR;
}
pos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), offset, SEEK_SET);
if (pos == (off_t)-1) {
errno = LittlefsErrno(pos);
return VFS_ERROR;
}
ret = lfs_file_write(g_handle[fd].lfsHandle, &(g_handle[fd].file), buf, nbyte);
if (ret < 0) {
errno = LittlefsErrno(ret);
ret = VFS_ERROR;
}
pos = (off_t)lfs_file_seek(g_handle[fd].lfsHandle, &(g_handle[fd].file), savepos, SEEK_SET);
if ((pos == (off_t)-1) && (ret >= 0)) {
errno = LittlefsErrno(pos);
return VFS_ERROR;
}
return ret;
}

View File

@ -97,6 +97,8 @@ int LfsStat(const char *path, struct stat *buf);
int LfsFsync(int fd);
int LfsFstat(int fd, struct stat *buf);
int SetDefaultMountPath(int pathNameIndex, const char* target);
int LfsPread(int fd, void *buf, size_t nbyte, off_t offset);
int LfsPwrite(int fd, const void *buf, size_t nbyte, off_t offset);
#endif /* _LFS_API_H_ */

View File

@ -75,6 +75,8 @@ struct FileOps {
int (*Fstat)(int fd, struct stat *buf);
int (*Stat)(const char *path, struct stat *buf);
int (*Ftruncate)(int fd, off_t length);
int (*Pread)(int fd, void *buf, size_t nbyte, off_t offset);
int (*Pwrite)(int fd, const void *buf, size_t nbyte, off_t offset);
};
#endif /* _FS_OPERATIONS_H_ */

View File

@ -595,3 +595,55 @@ int LOS_Ftruncate(int fd, off_t length)
}
return g_fs->fsFops->Ftruncate(fd, length);
}
ssize_t LOS_Pread(int fd, void *buf, size_t nbyte, off_t offset)
{
#ifdef LOSCFG_RANDOM_DEV
if (fd == RANDOM_DEV_FD) {
if (nbyte == 0) {
return FS_SUCCESS;
}
if (buf == NULL) {
errno = EINVAL;
return FS_FAILURE;
}
if (nbyte > 1024) { /* 1024, max random_size */
nbyte = 1024; /* hks_generate_random: random_size must <= 1024 */
}
struct hks_blob key = {HKS_BLOB_TYPE_RAW, (uint8_t *)buf, nbyte};
if (hks_generate_random(&key) != 0) {
errno = EIO;
return FS_FAILURE;
}
return (ssize_t)nbyte;
}
#endif
if (g_fs == NULL) {
errno = ENODEV;
return FS_FAILURE;
}
if (g_fs->fsFops == NULL || g_fs->fsFops->Pread == NULL) {
errno = ENOSYS;
return FS_FAILURE;
}
return g_fs->fsFops->Pread(fd, buf, nbyte, offset);
}
ssize_t LOS_Pwrite(int fd, const void *buf, size_t nbyte, off_t offset)
{
#ifdef LOSCFG_RANDOM_DEV
if (fd == RANDOM_DEV_FD) {
errno = EBADF; /* "/dev/random" is readonly */
return FS_FAILURE;
}
#endif
if (g_fs == NULL) {
errno = ENODEV;
return FS_FAILURE;
}
if (g_fs->fsFops == NULL || g_fs->fsFops->Pwrite == NULL) {
errno = ENOSYS;
return FS_FAILURE;
}
return g_fs->fsFops->Pwrite(fd, buf, nbyte, offset);
}

View File

@ -92,6 +92,10 @@ int LOS_FsMount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
ssize_t LOS_Pread(int fd, void *buf, size_t nbyte, off_t offset);
ssize_t LOS_Pwrite(int fd, const void *buf, size_t nbyte, off_t offset);
#ifdef __cplusplus
#if __cplusplus
extern "C" {

View File

@ -144,3 +144,13 @@ int ftruncate(int fd, off_t length)
{
return LOS_Ftruncate(fd, length);
}
ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset)
{
return LOS_Pread(fd, buf, nbyte, offset);
}
ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset)
{
return LOS_Pwrite(fd, buf, nbyte, offset);
}

View File

@ -147,6 +147,16 @@ int ioctl(int fd, int req, ...)
return -1;
}
ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset)
{
return LOS_Pread(fd, buf, nbyte, offset);
}
ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset)
{
return LOS_Pwrite(fd, buf, nbyte, offset);
}
#else /* #ifdef LOSCFG_FS_VFS */
int _open(const char *path, int oflag, ...)