NFS: Add new function signatures for rpc_nfs3_ that takes *3args arguments

to match the XDR.

Leave the existing ad-hoc rpc_nfs_* functions for backward compatibility.
libnfs-4.0.0-vitalif
Ronnie Sahlberg 2013-12-24 11:16:21 -08:00
parent 21668dcef4
commit 463d59bf8e
4 changed files with 534 additions and 297 deletions

View File

@ -135,7 +135,7 @@ EXTERN int rpc_pmap_null_async(struct rpc_context *rpc, rpc_cb cb, void *private
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_pmap_getport_async(struct rpc_context *rpc, int program, int version, int protocol, rpc_cb cb, void *private_data);
EXTERN int rpc_pmap_getport_async(struct rpc_context *rpc, int program, int version, int protocol, rpc_cb cb, void *private_data);
/*
* Call PORTMAPPER/SET
@ -151,7 +151,7 @@ int rpc_pmap_getport_async(struct rpc_context *rpc, int program, int version, in
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_pmap_set_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data);
EXTERN int rpc_pmap_set_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data);
/*
* Call PORTMAPPER/UNSET
@ -167,7 +167,7 @@ int rpc_pmap_set_async(struct rpc_context *rpc, int program, int version, int pr
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_pmap_unset_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data);
EXTERN int rpc_pmap_unset_async(struct rpc_context *rpc, int program, int version, int protocol, int port, rpc_cb cb, void *private_data);
/*
* Call PORTMAPPER/CALLIT.
@ -183,7 +183,7 @@ int rpc_pmap_unset_async(struct rpc_context *rpc, int program, int version, int
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_pmap_callit_async(struct rpc_context *rpc, int program, int version, int procedure, char *data, int datalen, rpc_cb cb, void *private_data);
EXTERN int rpc_pmap_callit_async(struct rpc_context *rpc, int program, int version, int procedure, char *data, int datalen, rpc_cb cb, void *private_data);
/*
* MOUNT FUNCTIONS
@ -295,14 +295,14 @@ EXTERN int rpc_mount_export_async(struct rpc_context *rpc, rpc_cb cb, void *priv
/*
* NFS FUNCTIONS
* NFS v3 FUNCTIONS
*/
struct nfs_fh3;
char *nfsstat3_to_str(int error);
int nfsstat3_to_errno(int error);
/*
* Call NFS/NULL
* Call NFS3/NULL
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -315,10 +315,11 @@ int nfsstat3_to_errno(int error);
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
EXTERN int rpc_nfs3_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
EXTERN int rpc_nfs_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
/*
* Call NFS/GETATTR
* Call NFS3/GETATTR
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -331,10 +332,12 @@ EXTERN int rpc_nfs_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct GETATTR3args;
EXTERN int rpc_nfs3_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct GETATTR3args *args, void *private_data);
EXTERN int rpc_nfs_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data);
/*
* Call NFS/PATHCONF
* Call NFS3/PATHCONF
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -347,10 +350,12 @@ EXTERN int rpc_nfs_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct PATHCONF3args;
EXTERN int rpc_nfs3_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct PATHCONF3args *args, void *private_data);
EXTERN int rpc_nfs_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data);
/*
* Call NFS/LOOKUP
* Call NFS3/LOOKUP
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -363,10 +368,12 @@ EXTERN int rpc_nfs_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct nfs
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct LOOKUP3args;
EXTERN int rpc_nfs3_lookup_async(struct rpc_context *rpc, rpc_cb cb, struct LOOKUP3args *args, void *private_data);
EXTERN int rpc_nfs_lookup_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *name, void *private_data);
/*
* Call NFS/ACCESS
* Call NFS3/ACCESS
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -379,10 +386,12 @@ EXTERN int rpc_nfs_lookup_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct ACCESS3args;
EXTERN int rpc_nfs3_access_async(struct rpc_context *rpc, rpc_cb cb, struct ACCESS3args *args, void *private_data);
EXTERN int rpc_nfs_access_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, int access, void *private_data);
/*
* Call NFS/READ
* Call NFS3/READ
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -395,10 +404,12 @@ EXTERN int rpc_nfs_access_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct READ3args;
EXTERN int rpc_nfs3_read_async(struct rpc_context *rpc, rpc_cb cb, struct READ3args *args, void *private_data);
EXTERN int rpc_nfs_read_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t offset, uint64_t count, void *private_data);
/*
* Call NFS/WRITE
* Call NFS3/WRITE
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -411,10 +422,12 @@ EXTERN int rpc_nfs_read_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct WRITE3args;
EXTERN int rpc_nfs3_write_async(struct rpc_context *rpc, rpc_cb cb, struct WRITE3args *args, void *private_data);
EXTERN int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *buf, uint64_t offset, uint64_t count, int stable_how, void *private_data);
/*
* Call NFS/COMMIT
* Call NFS3/COMMIT
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -427,11 +440,12 @@ EXTERN int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct COMMIT3args;
EXTERN int rpc_nfs3_commit_async(struct rpc_context *rpc, rpc_cb cb, struct COMMIT3args *args, void *private_data);
EXTERN int rpc_nfs_commit_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data);
/*
* Call NFS/SETATTR
* Call NFS3/SETATTR
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -445,12 +459,11 @@ EXTERN int rpc_nfs_commit_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* data is NULL.
*/
struct SETATTR3args;
EXTERN int rpc_nfs3_setattr_async(struct rpc_context *rpc, rpc_cb cb, struct SETATTR3args *args, void *private_data);
EXTERN int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, struct SETATTR3args *args, void *private_data);
/*
* Call NFS/MKDIR
* Call NFS3/MKDIR
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -464,14 +477,11 @@ EXTERN int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, struct SETA
* data is NULL.
*/
struct MKDIR3args;
EXTERN int rpc_nfs3_mkdir_async(struct rpc_context *rpc, rpc_cb cb, struct MKDIR3args *args, void *private_data);
EXTERN int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, struct MKDIR3args *args, void *private_data);
/*
* Call NFS/RMDIR
* Call NFS3/RMDIR
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -484,13 +494,12 @@ EXTERN int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, struct MKDIR3
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct RMDIR3args;
EXTERN int rpc_nfs3_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct RMDIR3args *args, void *private_data);
EXTERN int rpc_nfs_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *dir, void *private_data);
/*
* Call NFS/CREATE
* Call NFS3/CREATE
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -504,11 +513,11 @@ EXTERN int rpc_nfs_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh
* data is NULL.
*/
struct CREATE3args;
EXTERN int rpc_nfs3_create_async(struct rpc_context *rpc, rpc_cb cb, struct CREATE3args *args, void *private_data);
EXTERN int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, struct CREATE3args *args, void *private_data);
/*
* Call NFS/MKNOD
* Call NFS3/MKNOD
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -521,11 +530,12 @@ EXTERN int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, struct CREAT
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct MKNOD3args;
EXTERN int rpc_nfs3_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct MKNOD3args *args, void *private_data);
EXTERN int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *file, int mode, int major, int minor, void *private_data);
/*
* Call NFS/REMOVE
* Call NFS3/REMOVE
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -538,12 +548,12 @@ EXTERN int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct REMOVE3args;
EXTERN int rpc_nfs3_remove_async(struct rpc_context *rpc, rpc_cb cb, struct REMOVE3args *args, void *private_data);
EXTERN int rpc_nfs_remove_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *name, void *private_data);
/*
* Call NFS/READDIR
* Call NFS3/READDIR
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -556,10 +566,12 @@ EXTERN int rpc_nfs_remove_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct READDIR3args;
EXTERN int rpc_nfs3_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct READDIR3args *args, void *private_data);
EXTERN int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data);
/*
* Call NFS/READDIRPLUS
* Call NFS3/READDIRPLUS
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -572,10 +584,12 @@ EXTERN int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct READDIRPLUS3args;
EXTERN int rpc_nfs3_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct READDIRPLUS3args *args, void *private_data);
EXTERN int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data);
/*
* Call NFS/FSSTAT
* Call NFS3/FSSTAT
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -588,12 +602,12 @@ EXTERN int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct FSSTAT3args;
EXTERN int rpc_nfs3_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct FSSTAT3args *args, void *private_data);
EXTERN int rpc_nfs_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data);
/*
* Call NFS/FSINFO
* Call NFS3/FSINFO
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -606,12 +620,12 @@ EXTERN int rpc_nfs_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct FSINFO3args;
EXTERN int rpc_nfs3_fsinfo_async(struct rpc_context *rpc, rpc_cb cb, struct FSINFO3args *args, void *private_data);
EXTERN int rpc_nfs_fsinfo_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data);
/*
* Call NFS/READLINK
* Call NFS3/READLINK
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -625,12 +639,11 @@ EXTERN int rpc_nfs_fsinfo_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* data is NULL.
*/
struct READLINK3args;
EXTERN int rpc_nfs3_readlink_async(struct rpc_context *rpc, rpc_cb cb, struct READLINK3args *args, void *private_data);
EXTERN int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, struct READLINK3args *args, void *private_data);
/*
* Call NFS/SYMLINK
* Call NFS3/SYMLINK
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -644,11 +657,11 @@ EXTERN int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, struct REA
* data is NULL.
*/
struct SYMLINK3args;
EXTERN int rpc_nfs3_symlink_async(struct rpc_context *rpc, rpc_cb cb, struct SYMLINK3args *args, void *private_data);
EXTERN int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, struct SYMLINK3args *args, void *private_data);
/*
* Call NFS/RENAME
* Call NFS3/RENAME
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -661,12 +674,12 @@ EXTERN int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, struct SYML
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct RENAME3args;
EXTERN int rpc_nfs3_rename_async(struct rpc_context *rpc, rpc_cb cb, struct RENAME3args *args, void *private_data);
EXTERN int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *olddir, char *oldname, struct nfs_fh3 *newdir, char *newname, void *private_data);
/*
* Call NFS/LINK
* Call NFS3/LINK
* Function returns
* 0 : The call was initiated. The callback will be invoked when the call completes.
* <0 : An error occured when trying to set up the call. The callback will not be invoked.
@ -679,11 +692,11 @@ EXTERN int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_f
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
struct LINK3args;
EXTERN int rpc_nfs3_link_async(struct rpc_context *rpc, rpc_cb cb, struct LINK3args *args, void *private_data);
EXTERN int rpc_nfs_link_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *file, struct nfs_fh3 *newdir, char *newname, void *private_data);
/*
* RQUOTA FUNCTIONS
*/
@ -878,7 +891,7 @@ char *nlmstat4_to_str(int stat);
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_nlm4_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
EXTERN int rpc_nlm4_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
/*
* Call NLM/TEST
@ -897,7 +910,7 @@ int rpc_nlm4_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
* data is NULL.
*/
struct NLM4_TESTargs;
int rpc_nlm4_test_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_TESTargs *args, void *private_data);
EXTERN int rpc_nlm4_test_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_TESTargs *args, void *private_data);
/*
* Call NLM/LOCK
@ -916,7 +929,7 @@ int rpc_nlm4_test_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_TESTargs
* data is NULL.
*/
struct NLM4_LOCKargs;
int rpc_nlm4_lock_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_LOCKargs *args, void *private_data);
EXTERN int rpc_nlm4_lock_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_LOCKargs *args, void *private_data);
/*
* Call NLM/CANCEL
@ -935,7 +948,7 @@ int rpc_nlm4_lock_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_LOCKargs
* data is NULL.
*/
struct NLM4_CANCargs;
int rpc_nlm4_cancel_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_CANCargs *args, void *private_data);
EXTERN int rpc_nlm4_cancel_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_CANCargs *args, void *private_data);
/*
* Call NLM/UNLOCK
@ -954,7 +967,7 @@ int rpc_nlm4_cancel_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_CANCar
* data is NULL.
*/
struct NLM4_UNLOCKargs;
int rpc_nlm4_unlock_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_UNLOCKargs *args, void *private_data);
EXTERN int rpc_nlm4_unlock_async(struct rpc_context *rpc, rpc_cb cb, struct NLM4_UNLOCKargs *args, void *private_data);
/*
* NSM functions
@ -977,7 +990,7 @@ char *nsmstat1_to_str(int stat);
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_nsm1_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
EXTERN int rpc_nsm1_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
/*
* Call NSM/STAT
@ -996,7 +1009,7 @@ int rpc_nsm1_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
* data is NULL.
*/
struct NSM1_STATargs;
int rpc_nsm1_stat_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_STATargs *args, void *private_data);
EXTERN int rpc_nsm1_stat_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_STATargs *args, void *private_data);
/*
* Call NSM/MON
@ -1015,7 +1028,7 @@ int rpc_nsm1_stat_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_STATargs
* data is NULL.
*/
struct NSM1_MONargs;
int rpc_nsm1_mon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_MONargs *args, void *private_data);
EXTERN int rpc_nsm1_mon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_MONargs *args, void *private_data);
/*
* Call NSM/UNMON
@ -1034,7 +1047,7 @@ int rpc_nsm1_mon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_MONargs *
* data is NULL.
*/
struct NSM1_UNMONargs;
int rpc_nsm1_unmon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMONargs *args, void *private_data);
EXTERN int rpc_nsm1_unmon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMONargs *args, void *private_data);
/*
* Call NSM/UNMONALL
@ -1053,7 +1066,7 @@ int rpc_nsm1_unmon_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMONar
* data is NULL.
*/
struct NSM1_UNMONALLargs;
int rpc_nsm1_unmonall_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMONALLargs *args, void *private_data);
EXTERN int rpc_nsm1_unmonall_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMONALLargs *args, void *private_data);
/*
* Call NSM/SIMUCRASH
@ -1071,7 +1084,7 @@ int rpc_nsm1_unmonall_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_UNMO
* RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
* data is NULL.
*/
int rpc_nsm1_simucrash_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
EXTERN int rpc_nsm1_simucrash_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
/*
* Call NSM/NOTIFY
@ -1090,6 +1103,6 @@ int rpc_nsm1_simucrash_async(struct rpc_context *rpc, rpc_cb cb, void *private_d
* data is NULL.
*/
struct NSM1_NOTIFYargs;
int rpc_nsm1_notify_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_NOTIFYargs *args, void *private_data);
EXTERN int rpc_nsm1_notify_async(struct rpc_context *rpc, rpc_cb cb, struct NSM1_NOTIFYargs *args, void *private_data);
#endif

View File

@ -121,6 +121,28 @@ rpc_nfs_readlink_async
rpc_nfs_symlink_async
rpc_nfs_rename_async
rpc_nfs_link_async
rpc_nfs3_null_async
rpc_nfs3_getattr_async
rpc_nfs3_pathconf_async
rpc_nfs3_lookup_async
rpc_nfs3_access_async
rpc_nfs3_read_async
rpc_nfs3_write_async
rpc_nfs3_commit_async
rpc_nfs3_setattr_async
rpc_nfs3_mkdir_async
rpc_nfs3_rmdir_async
rpc_nfs3_create_async
rpc_nfs3_mknod_async
rpc_nfs3_remove_async
rpc_nfs3_readdir_async
rpc_nfs3_readdirplus_async
rpc_nfs3_fsstat_async
rpc_nfs3_fsinfo_async
rpc_nfs3_readlink_async
rpc_nfs3_symlink_async
rpc_nfs3_rename_async
rpc_nfs3_link_async
rpc_nlm4_null_async
rpc_nlm4_test_async
rpc_nlm4_lock_async

View File

@ -424,6 +424,7 @@ static void nfs_mount_9_cb(struct rpc_context *rpc, int status, void *command_da
struct nfs_cb_data *data = private_data;
struct nfs_context *nfs = data->nfs;
FSINFO3res *res = command_data;
struct GETATTR3args args;
assert(rpc->magic == RPC_CONTEXT_MAGIC);
@ -441,7 +442,11 @@ static void nfs_mount_9_cb(struct rpc_context *rpc, int status, void *command_da
nfs->readmax = res->FSINFO3res_u.resok.rtmax;
nfs->writemax = res->FSINFO3res_u.resok.wtmax;
if (rpc_nfs_getattr_async(rpc, nfs_mount_10_cb, &nfs->rootfh, data) != 0) {
memset(&args, 0, sizeof(GETATTR3args));
args.object.data.data_len = nfs->rootfh.data.data_len;
args.object.data.data_val = nfs->rootfh.data.data_val;
if (rpc_nfs3_getattr_async(rpc, nfs_mount_10_cb, &args, data) != 0) {
data->cb(-ENOMEM, nfs, command_data, data->private_data);
free_nfs_cb_data(data);
return;
@ -774,6 +779,7 @@ static void nfs_lookup_path_1_cb(struct rpc_context *rpc, int status, void *comm
static int nfs_lookup_path_async_internal(struct nfs_context *nfs, struct nfs_cb_data *data, struct nfs_fh3 *fh)
{
char *path, *str;
LOOKUP3args args;
while (*data->path == '/') {
data->path++;
@ -804,7 +810,13 @@ static int nfs_lookup_path_async_internal(struct nfs_context *nfs, struct nfs_cb
return 0;
}
if (rpc_nfs_lookup_async(nfs->rpc, nfs_lookup_path_1_cb, fh, path, data) != 0) {
memset(&args, 0, sizeof(LOOKUP3args));
args.what.dir.data.data_len = fh->data.data_len;
args.what.dir.data.data_val = fh->data.data_val;
args.what.name = path;
if (rpc_nfs3_lookup_async(nfs->rpc, nfs_lookup_path_1_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send lookup call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -913,7 +925,13 @@ static void nfs_stat_1_cb(struct rpc_context *rpc, int status, void *command_dat
static int nfs_stat_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
{
if (rpc_nfs_getattr_async(nfs->rpc, nfs_stat_1_cb, &data->fh, data) != 0) {
struct GETATTR3args args;
memset(&args, 0, sizeof(GETATTR3args));
args.object.data.data_len = data->fh.data.data_len;
args.object.data.data_val = data->fh.data.data_val;
if (rpc_nfs3_getattr_async(nfs->rpc, nfs_stat_1_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send STAT GETATTR call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -1017,6 +1035,7 @@ static void nfs_open_cb(struct rpc_context *rpc, int status, void *command_data,
static int nfs_open_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
{
int nfsmode = 0;
ACCESS3args args;
if (data->continue_int & O_WRONLY) {
nfsmode |= ACCESS3_MODIFY;
@ -1028,7 +1047,12 @@ static int nfs_open_continue_internal(struct nfs_context *nfs, struct nfs_cb_dat
nfsmode |= ACCESS3_READ;
}
if (rpc_nfs_access_async(nfs->rpc, nfs_open_cb, &data->fh, nfsmode, data) != 0) {
memset(&args, 0, sizeof(ACCESS3args));
args.object.data.data_len = data->fh.data.data_len;
args.object.data.data_val = data->fh.data.data_val;
args.access = nfsmode;
if (rpc_nfs3_access_async(nfs->rpc, nfs_open_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send OPEN ACCESS call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -1166,7 +1190,15 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offse
nfsfh->offset = offset;
if (count <= nfs_get_readmax(nfs)) {
if (rpc_nfs_read_async(nfs->rpc, nfs_pread_cb, &nfsfh->fh, offset, count, data) != 0) {
READ3args args;
memset(&args, 0, sizeof(READ3args));
args.file.data.data_len = nfsfh->fh.data.data_len;
args.file.data.data_val = nfsfh->fh.data.data_val;
args.offset = offset;
args.count = count;
if (rpc_nfs3_read_async(nfs->rpc, nfs_pread_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send READ call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -1193,6 +1225,7 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offse
while (count > 0) {
uint64_t readcount = count;
struct nfs_mcb_data *mdata;
READ3args args;
if (readcount > nfs_get_readmax(nfs)) {
readcount = nfs_get_readmax(nfs);
@ -1207,7 +1240,14 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offse
mdata->data = data;
mdata->offset = offset;
mdata->count = readcount;
if (rpc_nfs_read_async(nfs->rpc, nfs_pread_mcb, &nfsfh->fh, offset, readcount, mdata) != 0) {
memset(&args, 0, sizeof(READ3args));
args.file.data.data_len = nfsfh->fh.data.data_len;
args.file.data.data_val = nfsfh->fh.data.data_val;
args.offset = offset;
args.count = readcount;
if (rpc_nfs3_read_async(nfs->rpc, nfs_pread_mcb, &args, mdata) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send READ call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free(mdata);
@ -1346,7 +1386,18 @@ int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offs
nfsfh->offset = offset;
if (count <= nfs_get_writemax(nfs)) {
if (rpc_nfs_write_async(nfs->rpc, nfs_pwrite_cb, &nfsfh->fh, buf, offset, count, nfsfh->is_sync?FILE_SYNC:UNSTABLE, data) != 0) {
WRITE3args args;
memset(&args, 0, sizeof(WRITE3args));
args.file.data.data_len = nfsfh->fh.data.data_len;
args.file.data.data_val = nfsfh->fh.data.data_val;
args.offset = offset;
args.count = count;
args.stable = nfsfh->is_sync?FILE_SYNC:UNSTABLE;
args.data.data_len = count;
args.data.data_val = buf;
if (rpc_nfs3_write_async(nfs->rpc, nfs_pwrite_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send WRITE call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -1365,6 +1416,7 @@ int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offs
while (count > 0) {
uint64_t writecount = count;
struct nfs_mcb_data *mdata;
WRITE3args args;
if (writecount > nfs_get_writemax(nfs)) {
writecount = nfs_get_writemax(nfs);
@ -1380,7 +1432,16 @@ int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offs
mdata->offset = offset;
mdata->count = writecount;
if (rpc_nfs_write_async(nfs->rpc, nfs_pwrite_mcb, &nfsfh->fh, &buf[offset - data->start_offset], offset, writecount, nfsfh->is_sync?FILE_SYNC:UNSTABLE, mdata) != 0) {
memset(&args, 0, sizeof(WRITE3args));
args.file.data.data_len = nfsfh->fh.data.data_len;
args.file.data.data_val = nfsfh->fh.data.data_val;
args.offset = offset;
args.count = writecount;
args.stable = nfsfh->is_sync?FILE_SYNC:UNSTABLE;
args.data.data_len = writecount;
args.data.data_val = &buf[offset - data->start_offset];
if (rpc_nfs3_write_async(nfs->rpc, nfs_pwrite_mcb, &args, mdata) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send WRITE call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free(mdata);
@ -1432,6 +1493,7 @@ int nfs_close_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, voi
int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data)
{
struct nfs_cb_data *data;
struct GETATTR3args args;
data = malloc(sizeof(struct nfs_cb_data));
if (data == NULL) {
@ -1443,7 +1505,11 @@ int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, voi
data->cb = cb;
data->private_data = private_data;
if (rpc_nfs_getattr_async(nfs->rpc, nfs_stat_1_cb, &nfsfh->fh, data) != 0) {
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;
if (rpc_nfs3_getattr_async(nfs->rpc, nfs_stat_1_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send STAT GETATTR call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -1849,6 +1915,7 @@ static void nfs_creat_1_cb(struct rpc_context *rpc, int status, void *command_da
struct nfs_cb_data *data = private_data;
struct nfs_context *nfs = data->nfs;
char *str = data->continue_data;
LOOKUP3args args;
assert(rpc->magic == RPC_CONTEXT_MAGIC);
@ -1872,7 +1939,12 @@ static void nfs_creat_1_cb(struct rpc_context *rpc, int status, void *command_da
return;
}
if (rpc_nfs_lookup_async(nfs->rpc, nfs_create_2_cb, &data->fh, str, data) != 0) {
memset(&args, 0, sizeof(LOOKUP3args));
args.what.dir.data.data_len = data->fh.data.data_len;
args.what.dir.data.data_val = data->fh.data.data_val;
args.what.name = str;
if (rpc_nfs3_lookup_async(nfs->rpc, nfs_create_2_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send lookup call for %s/%s", data->saved_path, str);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);
@ -2282,12 +2354,18 @@ static void nfs_opendir2_cb(struct rpc_context *rpc, int status, void *command_d
rdpe_cb_data->data = data;
for (nfsdirent = nfsdir->entries; nfsdirent; nfsdirent = nfsdirent->next) {
struct rdpe_lookup_cb_data *rdpe_lookup_cb_data;
LOOKUP3args args;
rdpe_lookup_cb_data = malloc(sizeof(struct rdpe_lookup_cb_data));
rdpe_lookup_cb_data->rdpe_cb_data = rdpe_cb_data;
rdpe_lookup_cb_data->nfsdirent = nfsdirent;
if (rpc_nfs_lookup_async(nfs->rpc, nfs_opendir3_cb, &data->fh, nfsdirent->name, rdpe_lookup_cb_data) != 0) {
memset(&args, 0, sizeof(LOOKUP3args));
args.what.dir.data.data_len = data->fh.data.data_len;
args.what.dir.data.data_val = data->fh.data.data_val;
args.what.name = nfsdirent->name;
if (rpc_nfs3_lookup_async(nfs->rpc, nfs_opendir3_cb, &args, rdpe_lookup_cb_data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR LOOKUP call");
/* if we have already commands in flight, we cant just stop, we have to wait for the
@ -2518,6 +2596,7 @@ static void nfs_lseek_1_cb(struct rpc_context *rpc, int status, void *command_da
int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, nfs_cb cb, void *private_data)
{
struct lseek_cb_data *data;
struct GETATTR3args args;
if (whence == SEEK_SET) {
nfsfh->offset = offset;
@ -2542,7 +2621,11 @@ int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offse
data->cb = cb;
data->private_data = private_data;
if (rpc_nfs_getattr_async(nfs->rpc, nfs_lseek_1_cb, &nfsfh->fh, data) != 0) {
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;
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");
free(data);
return -1;
@ -3104,6 +3187,7 @@ static void nfs_access_cb(struct rpc_context *rpc, int status, void *command_dat
static int nfs_access_continue_internal(struct nfs_context *nfs, struct nfs_cb_data *data)
{
int nfsmode = 0;
ACCESS3args args;
if (data->continue_int & R_OK) {
nfsmode |= ACCESS3_READ;
@ -3115,7 +3199,12 @@ static int nfs_access_continue_internal(struct nfs_context *nfs, struct nfs_cb_d
nfsmode |= ACCESS3_EXECUTE;
}
if (rpc_nfs_access_async(nfs->rpc, nfs_access_cb, &data->fh, nfsmode, data) != 0) {
memset(&args, 0, sizeof(ACCESS3args));
args.object.data.data_len = data->fh.data.data_len;
args.object.data.data_val = data->fh.data.data_val;
args.access = nfsmode;
if (rpc_nfs3_access_async(nfs->rpc, nfs_access_cb, &args, data) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send OPEN ACCESS call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
free_nfs_cb_data(data);

553
nfs/nfs.c
View File

@ -103,18 +103,21 @@ int nfsstat3_to_errno(int error)
}
int rpc_nfs_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
/*
* NFSv3
*/
int rpc_nfs3_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_NULL, cb, private_data, (zdrproc_t)zdr_void, 0);
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/null call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/NULL call");
return -1;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/null call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/NULL call");
rpc_free_pdu(rpc, pdu);
return -2;
}
@ -122,28 +125,65 @@ int rpc_nfs_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
return 0;
}
int rpc_nfs_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
int rpc_nfs_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
{
return rpc_nfs3_null_async(rpc, cb, private_data);
}
int rpc_nfs3_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct GETATTR3args *args, void *private_data)
{
struct rpc_pdu *pdu;
GETATTR3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_GETATTR, cb, private_data, (zdrproc_t)zdr_GETATTR3res, sizeof(GETATTR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/null call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/GETATTR call");
return -1;
}
args.object.data.data_len = fh->data.data_len;
args.object.data.data_val = fh->data.data_val;
if (zdr_GETATTR3args(&pdu->zdr, &args) == 0) {
if (zdr_GETATTR3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode GETATTR3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/getattr call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/GETATTR call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
}
int rpc_nfs_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
{
GETATTR3args args;
memset(&args, 0, sizeof(GETATTR3args));
args.object.data.data_len = fh->data.data_len;
args.object.data.data_val = fh->data.data_val;
return rpc_nfs3_getattr_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct PATHCONF3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_PATHCONF, cb, private_data, (zdrproc_t)zdr_PATHCONF3res, sizeof(PATHCONF3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/PATHCONF call");
return -1;
}
if (zdr_PATHCONF3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode PATHCONF3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/PATHCONF call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -153,26 +193,33 @@ int rpc_nfs_getattr_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh
int rpc_nfs_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
{
struct rpc_pdu *pdu;
PATHCONF3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_PATHCONF, cb, private_data, (zdrproc_t)zdr_PATHCONF3res, sizeof(PATHCONF3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/pathconf call");
return -1;
}
memset(&args, 0, sizeof(PATHCONF3args));
args.object.data.data_len = fh->data.data_len;
args.object.data.data_val = fh->data.data_val;
if (zdr_PATHCONF3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode PATHCONF3args");
return rpc_nfs3_pathconf_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_lookup_async(struct rpc_context *rpc, rpc_cb cb, struct LOOKUP3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_LOOKUP, cb, private_data, (zdrproc_t)zdr_LOOKUP3res, sizeof(LOOKUP3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/LOOKUP call");
return -1;
}
if (zdr_LOOKUP3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode LOOKUP3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/pathconf call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/LOOKUP call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -182,58 +229,34 @@ int rpc_nfs_pathconf_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *f
int rpc_nfs_lookup_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *name, void *private_data)
{
struct rpc_pdu *pdu;
LOOKUP3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_LOOKUP, cb, private_data, (zdrproc_t)zdr_LOOKUP3res, sizeof(LOOKUP3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/lookup call");
return -1;
}
memset(&args, 0, sizeof(LOOKUP3args));
args.what.dir.data.data_len = fh->data.data_len;
args.what.dir.data.data_val = fh->data.data_val;
args.what.name = name;
if (zdr_LOOKUP3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode LOOKUP3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/lookup call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
return rpc_nfs3_lookup_async(rpc, cb, &args, private_data);
}
int rpc_nfs_access_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, int access, void *private_data)
int rpc_nfs3_access_async(struct rpc_context *rpc, rpc_cb cb, struct ACCESS3args *args, void *private_data)
{
struct rpc_pdu *pdu;
ACCESS3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_ACCESS, cb, private_data, (zdrproc_t)zdr_ACCESS3res, sizeof(ACCESS3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/access call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/ACCESS call");
return -1;
}
args.object.data.data_len = fh->data.data_len;
args.object.data.data_val = fh->data.data_val;
args.access = access;
if (zdr_ACCESS3args(&pdu->zdr, &args) == 0) {
if (zdr_ACCESS3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode ACCESS3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/access call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/ACCESS call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -241,32 +264,36 @@ int rpc_nfs_access_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
return 0;
}
int rpc_nfs_access_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, int access, void *private_data)
{
ACCESS3args args;
memset(&args, 0, sizeof(ACCESS3args));
args.object.data.data_len = fh->data.data_len;
args.object.data.data_val = fh->data.data_val;
args.access = access;
int rpc_nfs_read_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t offset, uint64_t count, void *private_data)
return rpc_nfs3_access_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_read_async(struct rpc_context *rpc, rpc_cb cb, struct READ3args *args, void *private_data)
{
struct rpc_pdu *pdu;
READ3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READ, cb, private_data, (zdrproc_t)zdr_READ3res, sizeof(READ3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/read call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/READ call");
return -1;
}
args.file.data.data_len = fh->data.data_len;
args.file.data.data_val = fh->data.data_val;
args.offset = offset;
args.count = count;
if (zdr_READ3args(&pdu->zdr, &args) == 0) {
if (zdr_READ3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode READ3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/read call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/READ call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -274,18 +301,49 @@ int rpc_nfs_read_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, u
return 0;
}
int rpc_nfs_read_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t offset, uint64_t count, void *private_data)
{
READ3args args;
int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *buf, uint64_t offset, uint64_t count, int stable_how, void *private_data)
memset(&args, 0, sizeof(READ3args));
args.file.data.data_len = fh->data.data_len;
args.file.data.data_val = fh->data.data_val;
args.offset = offset;
args.count = count;
return rpc_nfs3_read_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_write_async(struct rpc_context *rpc, rpc_cb cb, struct WRITE3args *args, void *private_data)
{
struct rpc_pdu *pdu;
WRITE3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_WRITE, cb, private_data, (zdrproc_t)zdr_WRITE3res, sizeof(WRITE3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/write call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/WRITE call");
return -1;
}
if (zdr_WRITE3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode WRITE3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/WRITE call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
}
int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *buf, uint64_t offset, uint64_t count, int stable_how, void *private_data)
{
WRITE3args args;
memset(&args, 0, sizeof(WRITE3args));
args.file.data.data_len = fh->data.data_len;
args.file.data.data_val = fh->data.data_val;
args.offset = offset;
@ -294,14 +352,27 @@ int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
args.data.data_len = count;
args.data.data_val = buf;
if (zdr_WRITE3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode WRITE3args");
return rpc_nfs3_write_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_commit_async(struct rpc_context *rpc, rpc_cb cb, struct COMMIT3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_COMMIT, cb, private_data, (zdrproc_t)zdr_COMMIT3res, sizeof(COMMIT3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/COMMIT call");
return -1;
}
if (zdr_COMMIT3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode COMMIT3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/write call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/COMMIT call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -309,47 +380,26 @@ int rpc_nfs_write_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
return 0;
}
int rpc_nfs_commit_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
{
struct rpc_pdu *pdu;
COMMIT3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_COMMIT, cb, private_data, (zdrproc_t)zdr_COMMIT3res, sizeof(COMMIT3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/commit call");
return -1;
}
memset(&args, 0, sizeof(COMMIT3args));
args.file.data.data_len = fh->data.data_len;
args.file.data.data_val = fh->data.data_val;
args.offset = 0;
args.count = 0;
if (zdr_COMMIT3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode WRITE3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/commit call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
return rpc_nfs3_commit_async(rpc, cb, &args, private_data);
}
int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, SETATTR3args *args, void *private_data)
int rpc_nfs3_setattr_async(struct rpc_context *rpc, rpc_cb cb, SETATTR3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_SETATTR, cb, private_data, (zdrproc_t)zdr_SETATTR3res, sizeof(SETATTR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/setattr call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/SETATTR call");
return -1;
}
@ -360,7 +410,7 @@ int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, SETATTR3args *args
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/setattr call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/SETATTR call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -368,15 +418,18 @@ int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, SETATTR3args *args
return 0;
}
int rpc_nfs_setattr_async(struct rpc_context *rpc, rpc_cb cb, SETATTR3args *args, void *private_data)
{
return rpc_nfs3_setattr_async(rpc, cb, args, private_data);
}
int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, MKDIR3args *args, void *private_data)
int rpc_nfs3_mkdir_async(struct rpc_context *rpc, rpc_cb cb, MKDIR3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_MKDIR, cb, private_data, (zdrproc_t)zdr_MKDIR3res, sizeof(MKDIR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/setattr call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/MKDIR call");
return -1;
}
@ -387,7 +440,7 @@ int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, MKDIR3args *args, vo
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/mkdir call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/MKDIR call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -395,33 +448,29 @@ int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, MKDIR3args *args, vo
return 0;
}
int rpc_nfs_mkdir_async(struct rpc_context *rpc, rpc_cb cb, MKDIR3args *args, void *private_data)
{
return rpc_nfs3_mkdir_async(rpc, cb, args, private_data);
}
int rpc_nfs_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *dir, void *private_data)
int rpc_nfs3_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct RMDIR3args *args, void *private_data)
{
struct rpc_pdu *pdu;
RMDIR3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_RMDIR, cb, private_data, (zdrproc_t)zdr_RMDIR3res, sizeof(RMDIR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/rmdir call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/RMDIR call");
return -1;
}
memset(&args, 0, sizeof(RMDIR3args));
args.object.dir.data.data_len = fh->data.data_len;
args.object.dir.data.data_val = fh->data.data_val;
args.object.name = dir;
if (zdr_RMDIR3args(&pdu->zdr, &args) == 0) {
if (zdr_RMDIR3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode RMDIR3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/rmdir call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/RMDIR call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -429,15 +478,25 @@ int rpc_nfs_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
return 0;
}
int rpc_nfs_rmdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *dir, void *private_data)
{
RMDIR3args args;
memset(&args, 0, sizeof(RMDIR3args));
args.object.dir.data.data_len = fh->data.data_len;
args.object.dir.data.data_val = fh->data.data_val;
args.object.name = dir;
int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, CREATE3args *args, void *private_data)
return rpc_nfs3_rmdir_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_create_async(struct rpc_context *rpc, rpc_cb cb, CREATE3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_CREATE, cb, private_data, (zdrproc_t)zdr_CREATE3res, sizeof(CREATE3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/create call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/CREATE call");
return -1;
}
@ -448,7 +507,7 @@ int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, CREATE3args *args,
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/create call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/CREATE call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -456,23 +515,45 @@ int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, CREATE3args *args,
return 0;
}
int rpc_nfs_create_async(struct rpc_context *rpc, rpc_cb cb, CREATE3args *args, void *private_data)
{
return rpc_nfs3_create_async(rpc, cb, args, private_data);
}
int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *file, int mode, int major, int minor, void *private_data)
int rpc_nfs3_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct MKNOD3args *args, void *private_data)
{
struct rpc_pdu *pdu;
MKNOD3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_MKNOD, cb, private_data, (zdrproc_t)zdr_MKNOD3res, sizeof(MKNOD3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/mknod call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/MKNOD call");
return -1;
}
if (zdr_MKNOD3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode MKNOD3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/MKNOD call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
}
int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *file, int mode, int major, int minor, void *private_data)
{
MKNOD3args args;
memset(&args, 0, sizeof(MKNOD3args));
args.where.dir.data.data_len = fh->data.data_len;
args.where.dir.data.data_val = fh->data.data_val;
args.where.name = file;
switch (mode & S_IFMT) {
case S_IFCHR:
args.what.type = NF3CHR;
@ -498,19 +579,31 @@ int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
args.what.mknoddata3_u.pipe_attributes.mode.set_mode3_u.mode = mode & (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
break;
default:
rpc_set_error(rpc, "Invalid file type for nfs/mknod call");
rpc_free_pdu(rpc, pdu);
rpc_set_error(rpc, "Invalid file type for NFS3/MKNOD call");
return -1;
}
if (zdr_MKNOD3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode MKNOD3args");
return rpc_nfs3_mknod_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_remove_async(struct rpc_context *rpc, rpc_cb cb, struct REMOVE3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_REMOVE, cb, private_data, (zdrproc_t)zdr_REMOVE3res, sizeof(REMOVE3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/REMOVE call");
return -1;
}
if (zdr_REMOVE3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode REMOVE3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/mknod call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/REMOVE call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -518,31 +611,36 @@ int rpc_nfs_mknod_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
return 0;
}
int rpc_nfs_remove_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, char *file, void *private_data)
{
struct rpc_pdu *pdu;
REMOVE3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_REMOVE, cb, private_data, (zdrproc_t)zdr_REMOVE3res, sizeof(REMOVE3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/remove call");
return -1;
}
memset(&args, 0, sizeof(REMOVE3args));
args.object.dir.data.data_len = fh->data.data_len;
args.object.dir.data.data_val = fh->data.data_val;
args.object.name = file;
if (zdr_REMOVE3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode REMOVE3args");
return rpc_nfs3_remove_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct READDIR3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READDIR, cb, private_data, (zdrproc_t)zdr_READDIR3res, sizeof(READDIR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/READDIR call");
return -1;
}
if (zdr_READDIR3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode READDIR3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/remove call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/READDIR call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -552,15 +650,8 @@ int rpc_nfs_remove_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data)
{
struct rpc_pdu *pdu;
READDIR3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READDIR, cb, private_data, (zdrproc_t)zdr_READDIR3res, sizeof(READDIR3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/readdir call");
return -1;
}
memset(&args, 0, sizeof(READDIR3args));
args.dir.data.data_len = fh->data.data_len;
args.dir.data.data_val = fh->data.data_val;
@ -568,14 +659,27 @@ int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh
memcpy(&args.cookieverf, cookieverf, sizeof(cookieverf3));
args.count = count;
if (zdr_READDIR3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode READDIR3args");
return rpc_nfs3_readdir_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct READDIRPLUS3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READDIRPLUS, cb, private_data, (zdrproc_t)zdr_READDIRPLUS3res, sizeof(READDIRPLUS3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/READDIRPLUS call");
return -1;
}
if (zdr_READDIRPLUS3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode READDIRPLUS3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/readdir call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/READDIRPLUS call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -585,15 +689,8 @@ int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh
int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data)
{
struct rpc_pdu *pdu;
READDIRPLUS3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READDIRPLUS, cb, private_data, (zdrproc_t)zdr_READDIRPLUS3res, sizeof(READDIRPLUS3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/readdirplus call");
return -1;
}
memset(&args, 0, sizeof(READDIRPLUS3args));
args.dir.data.data_len = fh->data.data_len;
args.dir.data.data_val = fh->data.data_val;
@ -602,14 +699,27 @@ int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3
args.dircount = count;
args.maxcount = count;
if (zdr_READDIRPLUS3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode READDIRPLUS3args");
return rpc_nfs3_readdirplus_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct FSSTAT3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_FSSTAT, cb, private_data, (zdrproc_t)zdr_FSSTAT3res, sizeof(FSSTAT3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/FSSTAT call");
return -1;
}
if (zdr_FSSTAT3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode FSSTAT3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/readdirplus call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/FSSTAT call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -619,26 +729,33 @@ int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3
int rpc_nfs_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
{
struct rpc_pdu *pdu;
FSSTAT3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_FSSTAT, cb, private_data, (zdrproc_t)zdr_FSSTAT3res, sizeof(FSSTAT3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/fsstat call");
return -1;
}
memset(&args, 0, sizeof(FSSTAT3args));
args.fsroot.data.data_len = fh->data.data_len;
args.fsroot.data.data_val = fh->data.data_val;
if (zdr_FSSTAT3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode FSSTAT3args");
return rpc_nfs3_fsstat_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_fsinfo_async(struct rpc_context *rpc, rpc_cb cb, struct FSINFO3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_FSINFO, cb, private_data, (zdrproc_t)zdr_FSINFO3res, sizeof(FSINFO3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/FSINFO call");
return -1;
}
if (zdr_FSINFO3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode FSINFO3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/fsstat call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/FSINFO call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -648,40 +765,22 @@ int rpc_nfs_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh,
int rpc_nfs_fsinfo_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
{
struct rpc_pdu *pdu;
FSINFO3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_FSINFO, cb, private_data, (zdrproc_t)zdr_FSINFO3res, sizeof(FSINFO3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/fsinfo call");
return -1;
}
memset(&args, 0, sizeof(FSINFO3args));
args.fsroot.data.data_len = fh->data.data_len;
args.fsroot.data.data_val = fh->data.data_val;
if (zdr_FSINFO3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode FSINFO3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/fsinfo call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
return rpc_nfs3_fsinfo_async(rpc, cb, fh, private_data);
}
int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, READLINK3args *args, void *private_data)
int rpc_nfs3_readlink_async(struct rpc_context *rpc, rpc_cb cb, READLINK3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READLINK, cb, private_data, (zdrproc_t)zdr_READLINK3res, sizeof(READLINK3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/readlink call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/READLINK call");
return -1;
}
@ -692,7 +791,7 @@ int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, READLINK3args *ar
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/readlink call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/READLINK call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -700,14 +799,18 @@ int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, READLINK3args *ar
return 0;
}
int rpc_nfs_readlink_async(struct rpc_context *rpc, rpc_cb cb, READLINK3args *args, void *private_data)
{
return rpc_nfs3_readlink_async(rpc, cb, args, private_data);
}
int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, SYMLINK3args *args, void *private_data)
int rpc_nfs3_symlink_async(struct rpc_context *rpc, rpc_cb cb, SYMLINK3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_SYMLINK, cb, private_data, (zdrproc_t)zdr_SYMLINK3res, sizeof(SYMLINK3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/symlink call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/SYMLINK call");
return -1;
}
@ -718,7 +821,7 @@ int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, SYMLINK3args *args
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/symlink call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/SYMLINK call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -726,20 +829,40 @@ int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, SYMLINK3args *args
return 0;
}
int rpc_nfs_symlink_async(struct rpc_context *rpc, rpc_cb cb, SYMLINK3args *args, void *private_data)
{
return rpc_nfs3_symlink_async(rpc, cb, args, private_data);
}
int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *olddir, char *oldname, struct nfs_fh3 *newdir, char *newname, void *private_data)
int rpc_nfs3_rename_async(struct rpc_context *rpc, rpc_cb cb, struct RENAME3args *args, void *private_data)
{
struct rpc_pdu *pdu;
RENAME3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_RENAME, cb, private_data, (zdrproc_t)zdr_RENAME3res, sizeof(RENAME3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/rename call");
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/RENAME call");
return -1;
}
if (zdr_RENAME3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode RENAME3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/RENAME call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
}
int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *olddir, char *oldname, struct nfs_fh3 *newdir, char *newname, void *private_data)
{
RENAME3args args;
memset(&args, 0, sizeof(RENAME3args));
args.from.dir.data.data_len = olddir->data.data_len;
args.from.dir.data.data_val = olddir->data.data_val;
@ -748,14 +871,27 @@ int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *old
args.to.dir.data.data_val = newdir->data.data_val;
args.to.name = newname;
if (zdr_RENAME3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode RENAME3args");
return rpc_nfs3_rename_async(rpc, cb, &args, private_data);
}
int rpc_nfs3_link_async(struct rpc_context *rpc, rpc_cb cb, struct LINK3args *args, void *private_data)
{
struct rpc_pdu *pdu;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_LINK, cb, private_data, (zdrproc_t)zdr_LINK3res, sizeof(LINK3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for NFS3/LINK call");
return -1;
}
if (zdr_LINK3args(&pdu->zdr, args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode LINK3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/rename call");
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for NFS3/LINK call");
rpc_free_pdu(rpc, pdu);
return -3;
}
@ -763,20 +899,10 @@ int rpc_nfs_rename_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *old
return 0;
}
int rpc_nfs_link_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *file, struct nfs_fh3 *newdir, char *newname, void *private_data)
{
struct rpc_pdu *pdu;
LINK3args args;
pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_LINK, cb, private_data, (zdrproc_t)zdr_LINK3res, sizeof(LINK3res));
if (pdu == NULL) {
rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/link call");
return -1;
}
memset(&args, 0, sizeof(LINK3args));
args.file.data.data_len = file->data.data_len;
args.file.data.data_val = file->data.data_val;
@ -784,21 +910,8 @@ int rpc_nfs_link_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *file,
args.link.dir.data.data_val = newdir->data.data_val;
args.link.name = newname;
if (zdr_LINK3args(&pdu->zdr, &args) == 0) {
rpc_set_error(rpc, "ZDR error: Failed to encode LINK3args");
rpc_free_pdu(rpc, pdu);
return -2;
}
if (rpc_queue_pdu(rpc, pdu) != 0) {
rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/link call");
rpc_free_pdu(rpc, pdu);
return -3;
}
return 0;
return rpc_nfs3_link_async(rpc, cb, &args, private_data);
}