MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / dfs_file_write

Function dfs_file_write

components/dfs/dfs_v2/src/dfs_file.c:1099–1168  ·  view source on GitHub ↗

* @brief Write data to a file at current position * * This function writes data to a file at the current position or at the end if O_APPEND flag is set. * * @param[in,out] file Pointer to the file structure to write to * @param[in] buf Buffer containing data to write * @param[in] len Number of bytes to write * * @return ssize_t Number of bytes written on success, or negative error code: *

Source from the content-addressed store, hash-verified

1097 * @note In append mode (O_APPEND), data is always written at the end of file
1098 */
1099ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
1100{
1101 ssize_t ret = -EBADF;
1102
1103 if (file)
1104 {
1105 if (!(dfs_fflags(file->flags) & DFS_F_FWRITE))
1106 {
1107 LOG_W("bad write flags.");
1108 ret = -EBADF;
1109 }
1110 else if (!file->fops || !file->fops->write)
1111 {
1112 LOG_W("no fops write.");
1113 ret = -ENOSYS;
1114 }
1115 else if (file->vnode && file->vnode->type != FT_DIRECTORY)
1116 {
1117 off_t pos;
1118
1119 if (!(file->flags & O_APPEND))
1120 {
1121 /* fpos lock */
1122 pos = dfs_file_get_fpos(file);
1123 }
1124 else
1125 {
1126 pos = file->vnode->size;
1127 }
1128
1129 ret = rw_verify_area(file, &pos, len);
1130 if (ret > 0)
1131 {
1132 len = ret;
1133 DLOG(msg, "dfs_file", file->dentry->mnt->fs_ops->name, DLOG_MSG,
1134 "dfs_file_write(fd, buf, %d)", len);
1135
1136 if (dfs_is_mounted(file->vnode->mnt) == 0)
1137 {
1138#ifdef RT_USING_PAGECACHE
1139 if (file->vnode->aspace && !(file->flags & O_DIRECT))
1140 {
1141 ret = dfs_aspace_write(file, buf, len, &pos);
1142 }
1143 else
1144#endif
1145 {
1146 ret = file->fops->write(file, buf, len, &pos);
1147 }
1148
1149 if (file->flags & O_SYNC)
1150 {
1151 file->fops->flush(file);
1152 }
1153 }
1154 else
1155 {
1156 ret = -EINVAL;

Callers 2

writeFunction · 0.70
copyfileFunction · 0.70

Calls 7

dfs_fflagsFunction · 0.85
dfs_file_get_fposFunction · 0.85
rw_verify_areaFunction · 0.85
dfs_is_mountedFunction · 0.85
dfs_aspace_writeFunction · 0.85
dfs_file_set_fposFunction · 0.85
writeMethod · 0.45

Tested by

no test coverage detected