Merge pull request #3105 from zhangjun1996/master

[components]添加ftruncate、flock、getuid、umask接口
This commit is contained in:
Bernard Xiong 2019-10-09 20:20:59 +08:00 committed by GitHub
commit 6aa07774bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 122 additions and 0 deletions

View File

@ -478,6 +478,33 @@ int dfs_elm_close(struct dfs_fd *file)
int dfs_elm_ioctl(struct dfs_fd *file, int cmd, void *args)
{
switch (cmd)
{
case RT_FIOFTRUNCATE:
{
FIL *fd;
FSIZE_t fptr, length;
FRESULT result = FR_OK;
fd = (FIL *)(file->data);
RT_ASSERT(fd != RT_NULL);
/* save file read/write point */
fptr = fd->fptr;
length = *(off_t*)args;
if (length <= fd->obj.objsize)
{
fd->fptr = length;
result = f_truncate(fd);
}
else
{
result = f_lseek(fd, length);
}
/* restore file read/write point */
fd->fptr = fptr;
return elm_result_to_dfs(result);
}
}
return -ENOSYS;
}

View File

@ -66,6 +66,10 @@ int dfs_file_lseek(struct dfs_fd *fd, off_t offset);
int dfs_file_stat(const char *path, struct stat *buf);
int dfs_file_rename(const char *oldpath, const char *newpath);
int dfs_file_ftruncate(struct dfs_fd *fd, off_t length);
/* 0x5254 is just a magic number to make these relatively unique ("RT") */
#define RT_FIOFTRUNCATE 0x52540000U
#ifdef __cplusplus
}

View File

@ -58,6 +58,7 @@ int fstat(int fildes, struct stat *buf);
int fsync(int fildes);
int fcntl(int fildes, int cmd, ...);
int ioctl(int fildes, int cmd, ...);
int ftruncate(int fd, off_t length);
/* directory api*/
int rmdir(const char *path);

View File

@ -482,6 +482,35 @@ __exit:
return result;
}
/**
* this function is will cause the regular file referenced by fd
* to be truncated to a size of precisely length bytes.
*
* @param fd the file descriptor.
* @param length the length to be truncated.
*
* @return the status of truncated.
*/
int dfs_file_ftruncate(struct dfs_fd *fd, off_t length)
{
int result;
/* fd is null or not a regular file system fd, or length is invalid */
if (fd == NULL || fd->type != FT_REGULAR || length < 0)
return -EINVAL;
if (fd->fops->ioctl == NULL)
return -ENOSYS;
result = fd->fops->ioctl(fd, RT_FIOFTRUNCATE, (void*)&length);
/* update current size */
if (result == 0)
fd->size = length;
return result;
}
#ifdef RT_USING_FINSH
#include <finsh.h>

View File

@ -471,6 +471,52 @@ int ioctl(int fildes, int cmd, ...)
}
RTM_EXPORT(ioctl);
/**
*
* this function is a POSIX compliant version, which cause the regular file
* referenced by fd to be truncated to a size of precisely length bytes.
* @param fd the file descriptor.
* @param length the length to be truncated.
*
* @return Upon successful completion, ftruncate() shall return 0;
* otherwise, -1 shall be returned and errno set to indicate the error.
*/
int ftruncate(int fd, off_t length)
{
int result;
struct dfs_fd *d;
d = fd_get(fd);
if (d == NULL)
{
rt_set_errno(-EBADF);
return -1;
}
if (length < 0)
{
fd_put(d);
rt_set_errno(-EINVAL);
return -1;
}
result = dfs_file_ftruncate(d, length);
if (result < 0)
{
fd_put(d);
rt_set_errno(result);
return -1;
}
/* release the ref-count of fd */
fd_put(d);
return 0;
}
RTM_EXPORT(ftruncate);
/**
* this function is a POSIX compliant version, which will return the
* information about a mounted file system.

View File

@ -442,3 +442,18 @@ void abort(void)
while (1);
}
uid_t getuid(void)
{
return 0;
}
mode_t umask(mode_t mask)
{
return 022;
}
int flock(int fd, int operation)
{
return 0;
}