X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=nfs3%2Fnfs3_prot.h;h=2f8a3737ddf5e6f4d86e444ff8745f4140fb8f55;hb=1e529ae15592d672b0825fd0e76c7b2b87fd95bb;hp=d5152a119d142134758ffb8e30a1e7acf9f8cfe4;hpb=75cfdd01b043196a7d32c93a84fb540b31c93327;p=bluesky.git diff --git a/nfs3/nfs3_prot.h b/nfs3/nfs3_prot.h index d5152a1..2f8a373 100644 --- a/nfs3/nfs3_prot.h +++ b/nfs3/nfs3_prot.h @@ -10,7 +10,6 @@ extern "C" { #endif - typedef u_quad_t uint64; typedef quad_t int64; @@ -23,6 +22,8 @@ typedef int int32; #define NFS3_CREATEVERFSIZE 8 #define NFS3_WRITEVERFSIZE 8 +extern char nfsd_instance_verf_cookie[NFS3_WRITEVERFSIZE]; + typedef char *filename3; typedef char *nfspath3; @@ -639,54 +640,130 @@ struct commit3res { }; typedef struct commit3res commit3res; +/* Structure for tracking a single incoming TCP connection for RPCs. For now, + * used for NFS only. */ +typedef struct { + GIOChannel *channel; + + /* The reassembled message, thus far. */ + GString *msgbuf; + + /* Remaining number of bytes in this message fragment; 0 if we next expect + * another fragment header. */ + uint32_t frag_len; + + /* If frag_len is zero: the number of bytes of the fragment header that + * have been read so far. */ + int frag_hdr_bytes; + + /* Mutex protecting send operations on the socket (to ensure that replies + * are not accidentally interleaved). */ + GMutex *send_lock; + + /* Is this a UDP connection? */ + gboolean udp_transport; + + /* For UDP connections only, the address of the sender. */ + struct sockaddr_in peer; + + /* For UDP only, a buffer for accumulating the full contents of a message + * before it is sent */ + GString *sendbuf; +} RPCConnection; + +/* Linked list of cleanup functions to call when a request is completed. */ +struct cleanup_list { + void (*func)(void *arg); + void *arg; + struct cleanup_list *next; +}; + +struct BlueSkyProfile; + +/* Used to track a single outstanding RPC request. Not all of the fields are + * initially filled in, but more are filled in as the request is processed. */ +typedef struct { + /* The corresponding connection on which the request was made. */ + RPCConnection *connection; + + /* To track the time to complete this request and a timing breakdown. */ + struct BlueSkyProfile *profile; + + /* Transaction ID of the request, in host byte order. */ + uint32_t xid; + + /* Raw XDR arguments for the call, including headers (everything except the + * fragment headers). Also, the offset to the actual arguments (number of + * bytes making up the headers). */ + GString *raw_args; + size_t raw_args_header_bytes; + + /* Decoded header information. */ + int req_proc; + + /* The XDR-decoded argument of the call, and the procedure to use for + * freeing these arguments. The actual freeing is done automatically when + * the response is sent. */ + void *args; + xdrproc_t xdr_args_free; + + /* Procedure to be used for encoding the eventual return value into XDR. */ + xdrproc_t xdr_result; + + /* Functions to be called when the response is sent to clean up any + * resources. */ + struct cleanup_list *cleanup; +} RPCRequest; + +extern void async_rpc_send_reply(RPCRequest *req, void *result); + #define NFS_PROGRAM 100003 #define NFS_V3 3 #define NFSPROC3_NULL 0 -extern void * nfsproc3_null_3_svc(void *, struct svc_req *); +extern void nfsproc3_null_3_svc(void *, RPCRequest *); #define NFSPROC3_GETATTR 1 -extern getattr3res * nfsproc3_getattr_3_svc(nfs_fh3 *, struct svc_req *); +extern void nfsproc3_getattr_3_svc(nfs_fh3 *, RPCRequest *); #define NFSPROC3_SETATTR 2 -extern wccstat3 * nfsproc3_setattr_3_svc(setattr3args *, struct svc_req *); +extern void nfsproc3_setattr_3_svc(setattr3args *, RPCRequest *); #define NFSPROC3_LOOKUP 3 -extern lookup3res * nfsproc3_lookup_3_svc(diropargs3 *, struct svc_req *); +extern void nfsproc3_lookup_3_svc(diropargs3 *, RPCRequest *); #define NFSPROC3_ACCESS 4 -extern access3res * nfsproc3_access_3_svc(access3args *, struct svc_req *); +extern void nfsproc3_access_3_svc(access3args *, RPCRequest *); #define NFSPROC3_READLINK 5 -extern readlink3res * nfsproc3_readlink_3_svc(nfs_fh3 *, struct svc_req *); +extern void nfsproc3_readlink_3_svc(nfs_fh3 *, RPCRequest *); #define NFSPROC3_READ 6 -extern read3res * nfsproc3_read_3_svc(read3args *, struct svc_req *); +extern void nfsproc3_read_3_svc(read3args *, RPCRequest *); #define NFSPROC3_WRITE 7 -extern write3res * nfsproc3_write_3_svc(write3args *, struct svc_req *); +extern void nfsproc3_write_3_svc(write3args *, RPCRequest *); #define NFSPROC3_CREATE 8 -extern diropres3 * nfsproc3_create_3_svc(create3args *, struct svc_req *); +extern void nfsproc3_create_3_svc(create3args *, RPCRequest *); #define NFSPROC3_MKDIR 9 -extern diropres3 * nfsproc3_mkdir_3_svc(mkdir3args *, struct svc_req *); +extern void nfsproc3_mkdir_3_svc(mkdir3args *, RPCRequest *); #define NFSPROC3_SYMLINK 10 -extern diropres3 * nfsproc3_symlink_3_svc(symlink3args *, struct svc_req *); +extern void nfsproc3_symlink_3_svc(symlink3args *, RPCRequest *); #define NFSPROC3_MKNOD 11 -extern diropres3 * nfsproc3_mknod_3_svc(mknod3args *, struct svc_req *); +extern void nfsproc3_mknod_3_svc(mknod3args *, RPCRequest *); #define NFSPROC3_REMOVE 12 -extern wccstat3 * nfsproc3_remove_3_svc(diropargs3 *, struct svc_req *); +extern void nfsproc3_remove_3_svc(diropargs3 *, RPCRequest *); #define NFSPROC3_RMDIR 13 -extern wccstat3 * nfsproc3_rmdir_3_svc(diropargs3 *, struct svc_req *); +extern void nfsproc3_rmdir_3_svc(diropargs3 *, RPCRequest *); #define NFSPROC3_RENAME 14 -extern rename3res * nfsproc3_rename_3_svc(rename3args *, struct svc_req *); +extern void nfsproc3_rename_3_svc(rename3args *, RPCRequest *); #define NFSPROC3_LINK 15 -extern link3res * nfsproc3_link_3_svc(link3args *, struct svc_req *); +extern void nfsproc3_link_3_svc(link3args *, RPCRequest *); #define NFSPROC3_READDIR 16 -extern readdir3res * nfsproc3_readdir_3_svc(readdir3args *, struct svc_req *); +extern void nfsproc3_readdir_3_svc(readdir3args *, RPCRequest *); #define NFSPROC3_READDIRPLUS 17 -extern readdirplus3res * nfsproc3_readdirplus_3_svc(readdirplus3args *, struct svc_req *); +extern void nfsproc3_readdirplus_3_svc(readdirplus3args *, RPCRequest *); #define NFSPROC3_FSSTAT 18 -extern fsstat3res * nfsproc3_fsstat_3_svc(nfs_fh3 *, struct svc_req *); +extern void nfsproc3_fsstat_3_svc(nfs_fh3 *, RPCRequest *); #define NFSPROC3_FSINFO 19 -extern fsinfo3res * nfsproc3_fsinfo_3_svc(nfs_fh3 *, struct svc_req *); +extern void nfsproc3_fsinfo_3_svc(nfs_fh3 *, RPCRequest *); #define NFSPROC3_PATHCONF 20 -extern pathconf3res * nfsproc3_pathconf_3_svc(nfs_fh3 *, struct svc_req *); +extern void nfsproc3_pathconf_3_svc(nfs_fh3 *, RPCRequest *); #define NFSPROC3_COMMIT 21 -extern commit3res * nfsproc3_commit_3_svc(commit3args *, struct svc_req *); -extern int nfs_program_3_freeresult (SVCXPRT *, xdrproc_t, caddr_t); +extern void nfsproc3_commit_3_svc(commit3args *, RPCRequest *); /* the xdr functions */ @@ -771,6 +848,8 @@ extern bool_t xdr_commit3args (XDR *, commit3args*); extern bool_t xdr_commit3resok (XDR *, commit3resok*); extern bool_t xdr_commit3res (XDR *, commit3res*); +extern void xdr_string_create(XDR *xdrs, GString *string, enum xdr_op op); + #ifdef __cplusplus } #endif