int test_dirops (glfs_t *fs) { glfs_fd_t *fd = NULL; char buf[512]; struct dirent *entry = NULL; fd = glfs_opendir (fs, "/"); if (!fd) { fprintf (stderr, "/: %s\n", strerror (errno)); return -1; } fprintf (stderr, "Entries:\n"); while (glfs_readdir_r (fd, (struct dirent *)buf, &entry), entry) { fprintf (stderr, "%s: %lu\n", entry->d_name, glfs_telldir (fd)); } glfs_closedir (fd); return 0; }
static fsal_status_t read_dirents(struct fsal_obj_handle *dir_hdl, const struct req_op_context *opctx, fsal_cookie_t * whence, void *dir_state, fsal_readdir_cb cb, bool * eof) { int rc = 0; fsal_status_t status = { ERR_FSAL_NO_ERROR, 0 }; struct glfs_fd *glfd = NULL; long offset = 0; struct dirent *pde = NULL; struct glusterfs_export *glfs_export = container_of(dir_hdl->export, struct glusterfs_export, export); struct glusterfs_handle *objhandle = container_of(dir_hdl, struct glusterfs_handle, handle); #ifdef GLTIMING struct timespec s_time, e_time; now(&s_time); #endif glfd = glfs_h_opendir(glfs_export->gl_fs, objhandle->glhandle); if (glfd == NULL) { return gluster2fsal_error(errno); } if (whence != NULL) { offset = *whence; } glfs_seekdir(glfd, offset); while (!(*eof)) { struct dirent de; rc = glfs_readdir_r(glfd, &de, &pde); if (rc == 0 && pde != NULL) { /* skip . and .. */ if ((strcmp(de.d_name, ".") == 0) || (strcmp(de.d_name, "..") == 0)) { continue; } if (!cb (opctx, de.d_name, dir_state, glfs_telldir(glfd))) { goto out; } } else if (rc == 0 && pde == NULL) { *eof = true; } else if (rc != 0) { status = gluster2fsal_error(errno); goto out; } else { /* Can't happen */ abort(); } } out: rc = glfs_closedir(glfd); if (rc < 0) { status = gluster2fsal_error(errno); } #ifdef GLTIMING now(&e_time); latency_update(&s_time, &e_time, lat_read_dirents); #endif return status; }