* @brief Read data from a file at specified offset * * @param[in] file Pointer to the file structure to read from * @param[out] buf Buffer to store the read data * @param[in] len Number of bytes to read * @param[in] offset Offset in the file to start reading from * * @return ssize_t Number of bytes read on success, or negative error code: * -EBADF if invalid file descriptor *
| 896 | * -EINVAL if invalid parameters or not mounted |
| 897 | */ |
| 898 | ssize_t dfs_file_pread(struct dfs_file *file, void *buf, size_t len, off_t offset) |
| 899 | { |
| 900 | ssize_t ret = -EBADF; |
| 901 | |
| 902 | if (file) |
| 903 | { |
| 904 | /* check whether read */ |
| 905 | if (!(dfs_fflags(file->flags) & DFS_F_FREAD)) |
| 906 | { |
| 907 | ret = -EPERM; |
| 908 | } |
| 909 | else if (!file->fops || !file->fops->read) |
| 910 | { |
| 911 | ret = -ENOSYS; |
| 912 | } |
| 913 | else if (file->vnode && file->vnode->type != FT_DIRECTORY) |
| 914 | { |
| 915 | off_t pos = offset; |
| 916 | |
| 917 | ret = rw_verify_area(file, &pos, len); |
| 918 | if (ret > 0) |
| 919 | { |
| 920 | len = ret; |
| 921 | |
| 922 | if (dfs_is_mounted(file->vnode->mnt) == 0) |
| 923 | { |
| 924 | #ifdef RT_USING_PAGECACHE |
| 925 | if (file->vnode->aspace && !(file->flags & O_DIRECT)) |
| 926 | { |
| 927 | ret = dfs_aspace_read(file, buf, len, &pos); |
| 928 | } |
| 929 | else |
| 930 | #endif |
| 931 | { |
| 932 | ret = file->fops->read(file, buf, len, &pos); |
| 933 | } |
| 934 | } |
| 935 | else |
| 936 | { |
| 937 | ret = -EINVAL; |
| 938 | } |
| 939 | } |
| 940 | } |
| 941 | } |
| 942 | |
| 943 | return ret; |
| 944 | } |
| 945 | |
| 946 | /** |
| 947 | * @brief Read data from a file at current position |
no test coverage detected