/* * both (*entryp) and (*status) shouldn't be freed. */ gfarm_error_t gfs_readdirplus(GFS_DirPlus dir, struct gfs_dirent **entry, struct gfs_stat **status) { gfarm_error_t e; if (dir->index >= dir->n) { gfs_dirplus_clear(dir); e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, gfm_getdirentsplus_request, gfm_getdirentsplus_result, NULL, dir); if (e != GFARM_ERR_NO_ERROR) return (e); if (dir->n == 0) { *entry = NULL; *status = NULL; return (GFARM_ERR_NO_ERROR); } dir->index = 0; } *entry = &dir->buffer[dir->index]; *status = &dir->stbuf[dir->index]; dir->index++; return (GFARM_ERR_NO_ERROR); }
static gfarm_error_t compound_file_op_rpc(struct gfm_connection **gfm_serverp, void *closure) { struct compound_file_op_info *ci = closure; *gfm_serverp = ci->gf->gfm_server; return (gfm_client_compound_fd_op(*gfm_serverp, ci->gf->fd, ci->request_op, ci->result_op, ci->cleanup_op, ci->closure)); }
static gfarm_error_t gfs_readdir_internal(GFS_Dir super, struct gfs_dirent **entry) { struct gfs_dir_internal *dir = (struct gfs_dir_internal *)super; gfarm_error_t e; if (dir->index >= dir->n) { e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, gfm_getdirents_request, gfm_getdirents_result, NULL, dir); if (e != GFARM_ERR_NO_ERROR) return (e); if (dir->n == 0) { *entry = NULL; return (GFARM_ERR_NO_ERROR); } dir->index = 0; } *entry = &dir->buffer[dir->index++]; return (GFARM_ERR_NO_ERROR); }