void nfs_set_auth(struct nfs_context *nfs, struct AUTH *auth)
{
- return rpc_set_auth(nfs->rpc, auth);
+ rpc_set_auth(nfs->rpc, auth);
}
int nfs_get_fd(struct nfs_context *nfs)
return NULL;
}
+ nfs->server = NULL;
+ nfs->export = NULL;
+
+ nfs->rootfh.data.data_len = 0;
+ nfs->rootfh.data.data_val = NULL;
+
return nfs;
}
int nfs_mount_async(struct nfs_context *nfs, const char *server, const char *export, nfs_cb cb, void *private_data)
{
struct nfs_cb_data *data;
+ char *new_server, *new_export;
data = malloc(sizeof(struct nfs_cb_data));
if (data == NULL) {
return -1;
}
bzero(data, sizeof(struct nfs_cb_data));
- nfs->server = strdup(server);
- nfs->export = strdup(export);
+ new_server = strdup(server);
+ new_export = strdup(export);
+ if (nfs->server != NULL) {
+ free(nfs->server);
+ nfs->server = NULL;
+ }
+ nfs->server = new_server;
+ if (nfs->export != NULL) {
+ free(nfs->export);
+ nfs->export = NULL;
+ }
+ nfs->export = new_export;
data->nfs = nfs;
data->cb = cb;
data->private_data = private_data;
}
path = data->path;
- str = index(path, '/');
+ str = strchr(path, '/');
if (str != NULL) {
*str = 0;
data->path = str+1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
*/
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;
return -1;
}
- ptr = rindex(symlink_data->newpathparent, '/');
+ ptr = strrchr(symlink_data->newpathparent, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", oldpath);
free_nfs_symlink_data(symlink_data);
free_nfs_rename_data(rename_data);
return -1;
}
- ptr = rindex(rename_data->oldpath, '/');
+ ptr = strrchr(rename_data->oldpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", oldpath);
free_nfs_rename_data(rename_data);
free_nfs_rename_data(rename_data);
return -1;
}
- ptr = rindex(rename_data->newpath, '/');
+ ptr = strrchr(rename_data->newpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", newpath);
free_nfs_rename_data(rename_data);
free_nfs_link_data(link_data);
return -1;
}
- ptr = rindex(link_data->newpath, '/');
+ ptr = strrchr(link_data->newpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", newpath);
free_nfs_link_data(link_data);
return nfs->rpc;
}
+const char *nfs_get_server(struct nfs_context *nfs) {
+ return nfs->server;
+}
+
+const char *nfs_get_export(struct nfs_context *nfs) {
+ return nfs->export;
+}