* @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: *
| 1097 | * @note In append mode (O_APPEND), data is always written at the end of file |
| 1098 | */ |
| 1099 | ssize_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; |
no test coverage detected