extern "C" {
#endif
-
typedef u_quad_t uint64;
typedef quad_t int64;
};
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;
+};
+
+/* 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;
+
+ /* Timining information for generating statistics about response times. */
+ int64_t time_start;
+
+ /* 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 */
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