[components][dfs]添加ftruncate接口

This commit is contained in:
zhangjun
2019-09-26 10:22:33 +08:00
parent 2a39e59024
commit 60f2ae4d3c
5 changed files with 105 additions and 0 deletions
+29
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>
+46
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.