Change rpc_nfs_readdirplus to rpc_nfs3_readdirplus
[deb_libnfs.git] / lib / libnfs.c
index 7026f26e01189a243f639b8a7fcee97a43cc5f0e..d092c36c469e8731d2e3663cdcbcae0208ecb82e 100644 (file)
@@ -1712,6 +1712,7 @@ static void nfs_fsync_cb(struct rpc_context *rpc, int status, void *command_data
 int nfs_fsync_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data)
 {
        struct nfs_cb_data *data;
+       struct COMMIT3args args;
 
        data = malloc(sizeof(struct nfs_cb_data));
        if (data == NULL) {
@@ -1723,7 +1724,10 @@ int nfs_fsync_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, voi
        data->cb           = cb;
        data->private_data = private_data;
 
-       if (rpc_nfs_commit_async(nfs->rpc, nfs_fsync_cb, &nfsfh->fh, data) != 0) {
+       args.file = nfsfh->fh;
+       args.offset = 0;
+       args.count = 0;
+       if (rpc_nfs3_commit_async(nfs->rpc, nfs_fsync_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send COMMIT call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -1790,7 +1794,7 @@ int nfs_ftruncate_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t l
        args.new_attributes.size.set_it = 1;
        args.new_attributes.size.set_size3_u.size = length;
 
-       if (rpc_nfs_setattr_async(nfs->rpc, nfs_ftruncate_cb, &args, data) != 0) {
+       if (rpc_nfs3_setattr_async(nfs->rpc, nfs_ftruncate_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send SETATTR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -1889,7 +1893,7 @@ static int nfs_mkdir_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
        args.attributes.mode.set_it = 1;
        args.attributes.mode.set_mode3_u.mode = 0755;
 
-       if (rpc_nfs_mkdir_async(nfs->rpc, nfs_mkdir_cb, &args, data) != 0) {
+       if (rpc_nfs3_mkdir_async(nfs->rpc, nfs_mkdir_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send MKDIR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -1969,10 +1973,13 @@ static void nfs_rmdir_cb(struct rpc_context *rpc, int status, void *command_data
 static int nfs_rmdir_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
        char *str = data->continue_data;
-       
+       RMDIR3args args;
+
        str = &str[strlen(str) + 1];
 
-       if (rpc_nfs_rmdir_async(nfs->rpc, nfs_rmdir_cb, &data->fh, str, data) != 0) {
+       args.object.dir = data->fh;
+       args.object.name = str;
+       if (rpc_nfs3_rmdir_async(nfs->rpc, nfs_rmdir_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send RMDIR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -2123,7 +2130,7 @@ static int nfs_creat_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
        args.how.createhow3_u.obj_attributes.mode.set_it = 1;
        args.how.createhow3_u.obj_attributes.mode.set_mode3_u.mode = data->continue_int;
 
-       if (rpc_nfs_create_async(nfs->rpc, nfs_creat_1_cb, &args, data) != 0) {
+       if (rpc_nfs3_create_async(nfs->rpc, nfs_creat_1_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send CREATE call for %s/%s", data->path, str);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -2202,10 +2209,13 @@ static void nfs_unlink_cb(struct rpc_context *rpc, int status, void *command_dat
 static int nfs_unlink_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
        char *str = data->continue_data;
-       
+       struct REMOVE3args args;
+
        str = &str[strlen(str) + 1];
 
-       if (rpc_nfs_remove_async(nfs->rpc, nfs_unlink_cb, &data->fh, str, data) != 0) {
+       args.object.dir = data->fh;
+       args.object.name = str;
+       if (rpc_nfs3_remove_async(nfs->rpc, nfs_unlink_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send REMOVE call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -2298,10 +2308,44 @@ static int nfs_mknod_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
 {
        struct mknod_cb_data *cb_data = data->continue_data;
        char *str = cb_data->path;
+       MKNOD3args args;
        
        str = &str[strlen(str) + 1];
 
-       if (rpc_nfs_mknod_async(nfs->rpc, nfs_mknod_cb, &data->fh, str, cb_data->mode, cb_data->major, cb_data->minor, data) != 0) {
+       args.where.dir = data->fh;
+       args.where.name = str;
+       switch (cb_data->mode & S_IFMT) {
+       case S_IFCHR:
+               args.what.type = NF3CHR;
+               args.what.mknoddata3_u.chr_device.dev_attributes.mode.set_it = 1;
+               args.what.mknoddata3_u.chr_device.dev_attributes.mode.set_mode3_u.mode = cb_data->mode & (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
+               args.what.mknoddata3_u.chr_device.spec.specdata1 = cb_data->major;
+               args.what.mknoddata3_u.chr_device.spec.specdata2 = cb_data->minor;
+               break;
+       case S_IFBLK:
+               args.what.type = NF3BLK;
+               args.what.mknoddata3_u.blk_device.dev_attributes.mode.set_it = 1;
+               args.what.mknoddata3_u.blk_device.dev_attributes.mode.set_mode3_u.mode = cb_data->mode & (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
+               args.what.mknoddata3_u.blk_device.spec.specdata1 = cb_data->major;
+               args.what.mknoddata3_u.blk_device.spec.specdata2 = cb_data->minor;
+       case S_IFSOCK:
+               args.what.type = NF3SOCK;
+               args.what.mknoddata3_u.sock_attributes.mode.set_it = 1;
+               args.what.mknoddata3_u.sock_attributes.mode.set_mode3_u.mode = cb_data->mode & (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
+               break;
+       case S_IFIFO:
+               args.what.type = NF3FIFO;
+               args.what.mknoddata3_u.pipe_attributes.mode.set_it = 1;
+               args.what.mknoddata3_u.pipe_attributes.mode.set_mode3_u.mode = cb_data->mode & (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
+               break;
+       default:
+               rpc_set_error(nfs->rpc, "Invalid file type for NFS3/MKNOD call");
+               data->cb(-EINVAL, nfs, rpc_get_error(nfs->rpc), data->private_data);
+               free_nfs_cb_data(data);
+               return -1;
+       }
+
+       if (rpc_nfs3_mknod_async(nfs->rpc, nfs_mknod_cb, &args, data) != 0) {
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
                return -1;
@@ -2489,7 +2533,14 @@ static void nfs_opendir2_cb(struct rpc_context *rpc, int status, void *command_d
        }
 
        if (res->READDIR3res_u.resok.reply.eof == 0) {
-               if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir2_cb, &data->fh, cookie, res->READDIR3res_u.resok.cookieverf, 8192, data) != 0) {
+               READDIR3args args;
+
+               args.dir = data->fh;
+               args.cookie = cookie;
+               memcpy(&args.cookieverf, res->READDIR3res_u.resok.cookieverf, sizeof(cookieverf3)); 
+               args.count = 8192;
+
+               if (rpc_nfs3_readdir_async(nfs->rpc, nfs_opendir2_cb, &args, data) != 0) {
                        rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
                        data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                        nfs_free_nfsdir(nfsdir);
@@ -2557,9 +2608,14 @@ static void nfs_opendir_cb(struct rpc_context *rpc, int status, void *command_da
        assert(rpc->magic == RPC_CONTEXT_MAGIC);
 
        if (status == RPC_STATUS_ERROR || (status == RPC_STATUS_SUCCESS && res->status == NFS3ERR_NOTSUPP) ){
-               cookieverf3 cv;
+               READDIR3args args;
+
+               args.dir = data->fh;
+               args.cookie = cookie;
+               memset(&args.cookieverf, 0, sizeof(cookieverf3)); 
+               args.count = 8192;
 
-               if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir2_cb, &data->fh, 0, (char *)&cv, 8192, data) != 0) {
+               if (rpc_nfs3_readdir_async(nfs->rpc, nfs_opendir2_cb, &args, data) != 0) {
                        rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
                        data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                        nfs_free_nfsdir(nfsdir);
@@ -2630,7 +2686,15 @@ static void nfs_opendir_cb(struct rpc_context *rpc, int status, void *command_da
        }
 
        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) {
+               READDIRPLUS3args args;
+
+               args.dir = data->fh;
+               args.cookie = cookie;
+               memcpy(&args.cookieverf, res->READDIRPLUS3res_u.resok.cookieverf, sizeof(cookieverf3));
+               args.dircount = 8192;
+               args.maxcount = 8192;
+
+               if (rpc_nfs3_readdirplus_async(nfs->rpc, nfs_opendir_cb, &args, 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);
@@ -2651,10 +2715,14 @@ static void nfs_opendir_cb(struct rpc_context *rpc, int status, void *command_da
 
 static int nfs_opendir_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
-       cookieverf3 cv;
+       READDIRPLUS3args args;
 
-       memset(cv, 0, sizeof(cookieverf3));
-       if (rpc_nfs_readdirplus_async(nfs->rpc, nfs_opendir_cb, &data->fh, 0, (char *)&cv, 8192, data) != 0) {
+       args.dir = data->fh;
+       args.cookie = 0;
+       memset(&args.cookieverf, 0, sizeof(cookieverf3));
+       args.dircount = 8192;
+       args.maxcount = 8192;
+       if (rpc_nfs3_readdirplus_async(nfs->rpc, nfs_opendir_cb, &args, 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);
@@ -2777,8 +2845,7 @@ int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offse
        data->private_data = private_data;
 
        memset(&args, 0, sizeof(GETATTR3args));
-       args.object.data.data_len = nfsfh->fh.data.data_len; 
-       args.object.data.data_val = nfsfh->fh.data.data_val; 
+       args.object = nfsfh->fh; 
 
        if (rpc_nfs3_getattr_async(nfs->rpc, nfs_lseek_1_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send LSEEK GETATTR call");
@@ -2909,7 +2976,7 @@ static int nfs_readlink_continue_internal(struct nfs_context *nfs, struct nfs_cb
        args.symlink.data.data_len = data->fh.data.data_len; 
        args.symlink.data.data_val = data->fh.data.data_val; 
 
-       if (rpc_nfs_readlink_async(nfs->rpc, nfs_readlink_1_cb, &args, data) != 0) {
+       if (rpc_nfs3_readlink_async(nfs->rpc, nfs_readlink_1_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send READLINK call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -2975,7 +3042,7 @@ static int nfs_chmod_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
        args.new_attributes.mode.set_it = 1;
        args.new_attributes.mode.set_mode3_u.mode = data->continue_int;
 
-       if (rpc_nfs_setattr_async(nfs->rpc, nfs_chmod_cb, &args, data) != 0) {
+       if (rpc_nfs3_setattr_async(nfs->rpc, nfs_chmod_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send SETATTR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -3087,7 +3154,7 @@ static int nfs_chown_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
                args.new_attributes.gid.set_gid3_u.gid = chown_data->gid;
        }
 
-       if (rpc_nfs_setattr_async(nfs->rpc, nfs_chown_cb, &args, data) != 0) {
+       if (rpc_nfs3_setattr_async(nfs->rpc, nfs_chown_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send SETATTR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -3223,7 +3290,7 @@ static int nfs_utimes_continue_internal(struct nfs_context *nfs, struct nfs_cb_d
                args.new_attributes.mtime.set_it = SET_TO_SERVER_TIME;
        }
 
-       if (rpc_nfs_setattr_async(nfs->rpc, nfs_utimes_cb, &args, data) != 0) {
+       if (rpc_nfs3_setattr_async(nfs->rpc, nfs_utimes_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send SETATTR call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -3443,17 +3510,17 @@ static void nfs_symlink_cb(struct rpc_context *rpc, int status, void *command_da
 static int nfs_symlink_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
        struct nfs_symlink_data *symlink_data = data->continue_data;
-       SYMLINK3args sa;
+       SYMLINK3args args;
 
-       memset(&sa, 0, sizeof(SYMLINK3args));
-       sa.where.dir.data.data_len = data->fh.data.data_len;
-       sa.where.dir.data.data_val = data->fh.data.data_val;
-       sa.where.name = symlink_data->newpathobject;
-       sa.symlink.symlink_attributes.mode.set_it = 1;
-       sa.symlink.symlink_attributes.mode.set_mode3_u.mode = S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH;
-       sa.symlink.symlink_data = symlink_data->oldpath;
+       memset(&args, 0, sizeof(SYMLINK3args));
+       args.where.dir.data.data_len = data->fh.data.data_len;
+       args.where.dir.data.data_val = data->fh.data.data_val;
+       args.where.name = symlink_data->newpathobject;
+       args.symlink.symlink_attributes.mode.set_it = 1;
+       args.symlink.symlink_attributes.mode.set_mode3_u.mode = S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH;
+       args.symlink.symlink_data = symlink_data->oldpath;
 
-       if (rpc_nfs_symlink_async(nfs->rpc, nfs_symlink_cb, &sa, data) != 0) {
+       if (rpc_nfs3_symlink_async(nfs->rpc, nfs_symlink_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send SYMLINK call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -3580,13 +3647,18 @@ static void nfs_rename_cb(struct rpc_context *rpc, int status, void *command_dat
 static int nfs_rename_continue_2_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
        struct nfs_rename_data *rename_data = data->continue_data;
+       RENAME3args args;
 
        /* steal the filehandle */
        rename_data->newdir.data.data_len = data->fh.data.data_len;
        rename_data->newdir.data.data_val = data->fh.data.data_val;
        data->fh.data.data_val = NULL;
 
-       if (rpc_nfs_rename_async(nfs->rpc, nfs_rename_cb, &rename_data->olddir, rename_data->oldobject, &rename_data->newdir, rename_data->newobject, data) != 0) {
+       args.from.dir = rename_data->olddir;
+       args.from.name = rename_data->oldobject;
+       args.to.dir = rename_data->newdir;
+       args.to.name = rename_data->newobject;
+       if (rpc_nfs3_rename_async(nfs->rpc, nfs_rename_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send RENAME call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
@@ -3738,13 +3810,18 @@ static void nfs_link_cb(struct rpc_context *rpc, int status, void *command_data,
 static int nfs_link_continue_2_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
 {
        struct nfs_link_data *link_data = data->continue_data;
+       LINK3args args;
 
        /* steal the filehandle */
        link_data->newdir.data.data_len = data->fh.data.data_len;
        link_data->newdir.data.data_val = data->fh.data.data_val;
        data->fh.data.data_val = NULL;
 
-       if (rpc_nfs_link_async(nfs->rpc, nfs_link_cb, &link_data->oldfh, &link_data->newdir, link_data->newobject, data) != 0) {
+       memset(&args, 0, sizeof(LINK3args));
+       args.file = link_data->oldfh;
+       args.link.dir = link_data->newdir;
+       args.link.name = link_data->newobject;
+       if (rpc_nfs3_link_async(nfs->rpc, nfs_link_cb, &args, data) != 0) {
                rpc_set_error(nfs->rpc, "RPC error: Failed to send LINK call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);