static int fuse_nfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { struct nfsdir *nfsdir; struct nfsdirent *nfsdirent; int ret = 0; ret = nfs_opendir(nfs, path, &nfsdir); if (ret < 0) { return ret; } while ((nfsdirent = nfs_readdir(nfs, nfsdir)) != NULL) { filler(buf, nfsdirent->name, NULL, 0); } return ret; }
static void workspace_nfs_opendir(fuse_req_t req, struct workspace_dh_struct *dh) { struct resource_struct *resource=dh->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; char *path=dh->pathinfo.path + dh->relpath; unsigned int error=0; struct directory_struct *directory=dh->directory; struct nfsdir *dir=NULL; int result=0; if (strlen(path)==0) path=(char *) rootpath; logoutput("workspace_nfs_opendir: path %s", path); pthread_mutex_lock(&nfs_export->mutex); result=nfs_opendir(nfs_ctx, path, &dir); pthread_mutex_unlock(&nfs_export->mutex); if (result==0) { dh->handle.data = (void *) dir; fuse_reply_open(req, dh->fi); free_path_pathinfo(&dh->pathinfo); return; } else { error=abs(result); } logoutput("workspace_opendir, error %i", error); fuse_reply_err(req, error); free_path_pathinfo(&dh->pathinfo); }