/*
	$Id: rpc-spec 304 2006-03-05 16:19:34Z ajw $

	XDR Specification for Remote Procedure Calls.
	See RFC 1057 for more details.

	StrongEd$Mode=C
*/

#define RPC_VERSION 2

enum auth_flavor {
	AUTH_NULL  = 0,
	AUTH_UNIX  = 1,
	AUTH_SHORT = 2,
	AUTH_DES   = 3
};

struct opaque_auth {
	auth_flavor flavor;
	opaque body<400>;
};

struct auth_unix {
	unsigned stamp;
	opaque machinename<255>;
	unsigned uid;
	unsigned gid;
	unsigned gids<16>;
};


enum msg_type {
	CALL = 0,
	REPLY = 1
};

enum reply_stat {
	MSG_ACCEPTED = 0,
	MSG_DENIED   = 1
};

enum accept_stat {
	SUCCESS = 0,
	PROG_UNAVAIL = 1,
	PROG_MISMATCH = 2,
	PROC_UNAVAIL = 3,
	GARBAGE_ARGS = 4
};

enum reject_stat {
	RPC_MISMATCH = 0,
	AUTH_ERROR = 1
};

enum auth_stat {
	AUTH_BADCRED = 1,
	AUTH_REJECTEDCRED = 2,
	AUTH_BADVERF = 3,
	AUTH_REJECTEDVERF = 4,
	AUTH_TOOWEAK = 5
};

struct call_body {
   unsigned rpcvers;
   unsigned prog;
   unsigned vers;
   unsigned proc;
   opaque_auth cred;
   opaque_auth verf;
   /* procedure specific parameters start here */
};

struct mismatch_info {
   unsigned low;
   unsigned high;
};

union reply_data switch (accept_stat stat) {
case SUCCESS:
  void;
  /* procedure-specific results start here */
case PROG_MISMATCH:
  mismatch_info mismatch_info;
default:
  /* Void.  Cases include PROG_UNAVAIL, PROC_UNAVAIL, and GARBAGE_ARGS. */
  void;
};

struct accepted_reply {
   opaque_auth verf;
   reply_data reply_data;
};

union rejected_reply switch (reject_stat stat) {
case RPC_MISMATCH:
   mismatch_info mismatch_info;
case AUTH_ERROR:
   auth_stat stat;
};

union reply_body switch (reply_stat stat) {
case MSG_ACCEPTED:
   accepted_reply areply;
case MSG_DENIED:
   rejected_reply rreply;
};

union body switch (msg_type mtype) {
case CALL:
	call_body cbody;
case REPLY:
	reply_body rbody;
};

struct rpc_msg {
	unsigned xid;
	body body;
};

