* @brief Write data to a file at specified offset * * @param[in] 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 * @param[in] offset Offset in the file to start writing from * * @return ssize_t Number of bytes written on success, or negative error code: * -EBADF if invalid file descriptor or b
| 1024 | * after write operation. |
| 1025 | */ |
| 1026 | ssize_t dfs_file_pwrite(struct dfs_file *file, const void *buf, size_t len, off_t offset) |
| 1027 | { |
| 1028 | ssize_t ret = -EBADF; |
| 1029 | |
| 1030 | if (file) |
| 1031 | { |
| 1032 | if (!(dfs_fflags(file->flags) & DFS_F_FWRITE)) |
| 1033 | { |
| 1034 | LOG_W("bad write flags."); |
| 1035 | ret = -EBADF; |
| 1036 | } |
| 1037 | else if (!file->fops || !file->fops->write) |
| 1038 | { |
| 1039 | LOG_W("no fops write."); |
| 1040 | ret = -ENOSYS; |
| 1041 | } |
| 1042 | else if (file->vnode && file->vnode->type != FT_DIRECTORY) |
| 1043 | { |
| 1044 | off_t pos = offset; |
| 1045 | |
| 1046 | ret = rw_verify_area(file, &pos, len); |
| 1047 | if (ret > 0) |
| 1048 | { |
| 1049 | len = ret; |
| 1050 | DLOG(msg, "dfs_file", file->dentry->mnt->fs_ops->name, DLOG_MSG, |
| 1051 | "dfs_file_write(fd, buf, %d)", len); |
| 1052 | |
| 1053 | if (dfs_is_mounted(file->vnode->mnt) == 0) |
| 1054 | { |
| 1055 | #ifdef RT_USING_PAGECACHE |
| 1056 | if (file->vnode->aspace && !(file->flags & O_DIRECT)) |
| 1057 | { |
| 1058 | ret = dfs_aspace_write(file, buf, len, &pos); |
| 1059 | } |
| 1060 | else |
| 1061 | #endif |
| 1062 | { |
| 1063 | ret = file->fops->write(file, buf, len, &pos); |
| 1064 | } |
| 1065 | |
| 1066 | if (file->flags & O_SYNC) |
| 1067 | { |
| 1068 | file->fops->flush(file); |
| 1069 | } |
| 1070 | } |
| 1071 | else |
| 1072 | { |
| 1073 | ret = -EINVAL; |
| 1074 | } |
| 1075 | } |
| 1076 | } |
| 1077 | } |
| 1078 | |
| 1079 | return ret; |
| 1080 | } |
| 1081 | |
| 1082 | /** |
| 1083 | * @brief Write data to a file at current position |
no test coverage detected