*/
static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *command_data, void *private_data)
{
- READDIR3res *res;
+ READDIRPLUS3res *res;
struct nfs_cb_data *data = private_data;
struct nfs_context *nfs = data->nfs;
struct nfsdir *nfsdir = data->continue_data;
- struct entry3 *entry;
+ struct entryplus3 *entry;
uint64_t cookie;
-
+
if (status == RPC_STATUS_ERROR) {
data->cb(-EFAULT, nfs, command_data, data->private_data);
nfs_free_nfsdir(nfsdir);
return;
}
- entry =res->READDIR3res_u.resok.reply.entries;
+ entry =res->READDIRPLUS3res_u.resok.reply.entries;
while (entry != NULL) {
struct nfsdirent *nfsdirent;
return;
}
nfsdirent->inode = entry->fileid;
+ if (entry->name_attributes.attributes_follow) {
+ nfsdirent->type = entry->name_attributes.post_op_attr_u.attributes.type;
+ nfsdirent->mode = entry->name_attributes.post_op_attr_u.attributes.mode;
+ nfsdirent->size = entry->name_attributes.post_op_attr_u.attributes.size;
+
+ nfsdirent->atime.tv_sec = entry->name_attributes.post_op_attr_u.attributes.atime.seconds;
+ nfsdirent->atime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.atime.nseconds/1000;
+ nfsdirent->mtime.tv_sec = entry->name_attributes.post_op_attr_u.attributes.mtime.seconds;
+ nfsdirent->mtime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.mtime.nseconds/1000;
+ nfsdirent->ctime.tv_sec = entry->name_attributes.post_op_attr_u.attributes.ctime.seconds;
+ nfsdirent->ctime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.ctime.nseconds/1000;
+ }
+
nfsdirent->next = nfsdir->entries;
nfsdir->entries = nfsdirent;
entry = entry->nextentry;
}
- if (res->READDIR3res_u.resok.reply.eof == 0) {
- if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir_cb, &data->fh, cookie, res->READDIR3res_u.resok.cookieverf, 20000, data) != 0) {
- rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
+ if (res->READDIRPLUS3res_u.resok.reply.eof == 0) {
+ if (rpc_nfs_readdirplus_async(nfs->rpc, nfs_opendir_cb, &data->fh, cookie, res->READDIRPLUS3res_u.resok.cookieverf, 8192, data) != 0) {
+ rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIRPLUS call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
nfs_free_nfsdir(nfsdir);
data->continue_data = NULL;
cookieverf3 cv;
bzero(cv, sizeof(cookieverf3));
- if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir_cb, &data->fh, 0, (char *)&cv, 20000, data) != 0) {
- rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
+ if (rpc_nfs_readdirplus_async(nfs->rpc, nfs_opendir_cb, &data->fh, 0, (char *)&cv, 8192, data) != 0) {
+ rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIRPLUS call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
return -1;
if (FD_ISSET(fds->fd, &efds)) {
fds->revents |= POLLHUP;
}
+ return 1;
}
#endif