/* * open-coded SunRPC structures */ #ifndef NFSMOUNT_SUNRPC_H #define NFSMOUNT_SUNRPC_H #include #include #define SUNRPC_PORT 111 #define MOUNT_PORT 627 #define RPC_CALL 0 #define RPC_REPLY 1 #define PORTMAP_PROGRAM 100000 #define NLM_PROGRAM 100021 #define RPC_PMAP_PROGRAM 100000 #define RPC_PMAP_VERSION 2 #define RPC_PMAP_PORT 111 #define PMAP_PROC_NULL 0 #define PMAP_PROC_SET 1 #define PMAP_PROC_UNSET 2 #define PMAP_PROC_GETPORT 3 #define PMAP_PROC_DUMP 4 #define LAST_FRAG 0x80000000 #define REPLY_OK 0 #define REPLY_DENIED 1 #define SUCCESS 0 #define PROG_UNAVAIL 1 #define PROG_MISMATCH 2 #define PROC_UNAVAIL 3 #define GARBAGE_ARGS 4 #define SYSTEM_ERR 5 enum { AUTH_NULL, AUTH_UNIX, }; struct rpc_auth { uint32_t flavor; uint32_t len; uint32_t body[]; }; struct rpc_udp_header { uint32_t xid; uint32_t msg_type; }; struct rpc_header { uint32_t frag_hdr; struct rpc_udp_header udp; }; struct rpc_call { struct rpc_header hdr; uint32_t rpc_vers; uint32_t program; uint32_t prog_vers; uint32_t proc; uint32_t cred_flavor; uint32_t cred_len; uint32_t vrf_flavor; uint32_t vrf_len; }; struct rpc_reply { struct rpc_header hdr; uint32_t reply_state; uint32_t vrf_flavor; uint32_t vrf_len; uint32_t state; }; struct rpc { struct rpc_call *call; size_t call_len; struct rpc_reply *reply; size_t reply_len; }; struct client; typedef int (*call_stub) (struct client *, struct rpc *); struct client { int sock; call_stub call_stub; }; #define CLI_RESVPORT 00000001 struct client *tcp_client(uint32_t server, uint16_t port, uint32_t flags); struct client *udp_client(uint32_t server, uint16_t port, uint32_t flags); void client_free(struct client *client); int rpc_call(struct client *client, struct rpc *rpc); uint32_t portmap(uint32_t server, uint32_t program, uint32_t version, uint32_t proto); #endif /* NFSMOUNT_SUNRPC_H */