static int64_t file_pread(struct file_context *fc, char *buf, int64_t count, uint64_t off) { if (fc->is_nfs == 0) { lseek(fc->fd, off, SEEK_SET); return read(fc->fd, buf, count); } else { return nfs_pread(fc->nfs, fc->nfsfh, off, count, buf); } }
static int fuse_nfs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int ret = 0; struct nfsfh *nfsfh = (struct nfsfh *)fi->fh; ret = nfs_pread(nfs, nfsfh, offset, size, buf); return ret; }
int main(int argc, char *argv[]) { int ret; struct file_context *nf; struct nfs_stat_64 st; uint64_t off; int64_t count; #ifdef WIN32 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { printf("Failed to start Winsock2\n"); return 10; } #endif #ifdef AROS aros_init_socket(); #endif if (argc < 2) { usage(); } nf = open_file(argv[1], O_RDONLY); if (nf == NULL) { fprintf(stderr, "Failed to open %s\n", argv[1]); exit(10); } if (nfs_fstat64(nf->nfs, nf->nfsfh, &st) < 0) { fprintf(stderr, "Failed to stat %s\n", argv[1]); exit(10); } off = 0; while (off < st.nfs_size) { count = st.nfs_size - off; if (count > BUFSIZE) { count = BUFSIZE; } count = nfs_pread(nf->nfs, nf->nfsfh, off, count, buf); if (count < 0) { fprintf(stderr, "Failed to read from file\n"); free_file_context(nf); return 10; } fwrite(buf, count, 1, stdout); off += count; } free_file_context(nf); return 0; }
ssize_t pread(int fd, void *buf, size_t count, off_t offset) { if (nfs_fd_list[fd].is_nfs == 1) { int ret; LD_NFS_DPRINTF(9, "pread(fd:%d offset:%d count:%d)", fd, (int)offset, (int)count); if ((ret = nfs_pread(nfs_fd_list[fd].nfs, nfs_fd_list[fd].fh, offset, count, buf)) < 0) { errno = -ret; return -1; } return ret; } return real_pread(fd, buf, count, offset); }
static void workspace_nfs_read(fuse_req_t req, size_t size, off_t offset, struct workspace_fh_struct *fh) { struct resource_struct *resource=fh->object->resource; struct net_nfs_export_struct *nfs_export=(struct net_nfs_export_struct *) resource->data; struct nfs_context *nfs_ctx=(struct nfs_context *) nfs_export->data; struct nfsfh *nfsfh=(struct nfsfh *) fh->handle.data; int result=0; char *buff; buff=malloc(size); if (! buff) { fuse_reply_err(req, ENOMEM); return; } logoutput("workspace_nfs_read"); pthread_mutex_lock(&nfs_export->mutex); result=nfs_pread(nfs_ctx, nfsfh, offset, size, buff); pthread_mutex_unlock(&nfs_export->mutex); if (result>=0) { fuse_reply_buf(req, buff, result); } else { fuse_reply_err(req, abs(result)); } }