|  | enum | 
|  | { | 
|  | MaxRpc = 2048,	/* max size of any protocol message */ | 
|  |  | 
|  | /* keep in sync with rpc.c:/rpcname */ | 
|  | RpcUnknown = 0,		/* Rpc.op */ | 
|  | RpcAuthinfo, | 
|  | RpcAttr, | 
|  | RpcRead, | 
|  | RpcStart, | 
|  | RpcWrite, | 
|  | RpcReadHex, | 
|  | RpcWriteHex, | 
|  |  | 
|  | /* thread stack size - big buffers for printing */ | 
|  | STACK = 65536 | 
|  | }; | 
|  |  | 
|  | typedef struct Conv Conv; | 
|  | typedef struct Key Key; | 
|  | typedef struct Logbuf Logbuf; | 
|  | typedef struct Proto Proto; | 
|  | typedef struct Ring Ring; | 
|  | typedef struct Role Role; | 
|  | typedef struct Rpc Rpc; | 
|  |  | 
|  | struct Rpc | 
|  | { | 
|  | int op; | 
|  | void *data; | 
|  | int count; | 
|  | int hex;	/* should result of read be turned into hex? */ | 
|  | }; | 
|  |  | 
|  | struct Conv | 
|  | { | 
|  | int ref;			/* ref count */ | 
|  | int hangup;		/* flag: please hang up */ | 
|  | int active;			/* flag: there is an active thread */ | 
|  | int done;			/* flag: conversation finished successfully */ | 
|  | ulong tag;			/* identifying tag */ | 
|  | Conv *next;		/* in linked list */ | 
|  | char *sysuser;		/* system name for user speaking to us */ | 
|  | char *state;		/* for debugging */ | 
|  | char statebuf[128];	/* for formatted states */ | 
|  | char err[ERRMAX];	/* last error */ | 
|  |  | 
|  | Attr *attr;			/* current attributes */ | 
|  | Proto *proto;		/* protocol */ | 
|  |  | 
|  | Channel *rpcwait;		/* wait here for an rpc */ | 
|  | Rpc rpc;				/* current rpc. op==RpcUnknown means none */ | 
|  | char rpcbuf[MaxRpc];	/* buffer for rpc */ | 
|  | char reply[MaxRpc];		/* buffer for response */ | 
|  | int nreply;				/* count of response */ | 
|  | void (*kickreply)(Conv*);	/* call to send response */ | 
|  | Req *req;				/* 9P call to read response */ | 
|  |  | 
|  | Channel *keywait;	/* wait here for key confirmation */ | 
|  |  | 
|  | }; | 
|  |  | 
|  | struct Key | 
|  | { | 
|  | int ref;			/* ref count */ | 
|  | ulong tag;			/* identifying tag: sequence number */ | 
|  | Attr *attr;			/* public attributes */ | 
|  | Attr *privattr;		/* private attributes, like !password */ | 
|  | Proto *proto;		/* protocol owner of key */ | 
|  | void *priv;		/* protocol-specific storage */ | 
|  | }; | 
|  |  | 
|  | struct Logbuf | 
|  | { | 
|  | Req *wait; | 
|  | Req **waitlast; | 
|  | int rp; | 
|  | int wp; | 
|  | char *msg[128]; | 
|  | }; | 
|  |  | 
|  | struct Ring | 
|  | { | 
|  | Key **key; | 
|  | int nkey; | 
|  | }; | 
|  |  | 
|  | struct Proto | 
|  | { | 
|  | char *name;		/* name of protocol */ | 
|  | Role *roles;		/* list of roles and service functions */ | 
|  | char *keyprompt;	/* required attributes for key proto=name */ | 
|  | int (*checkkey)(Key*);	/* initialize k->priv or reject key */ | 
|  | void (*closekey)(Key*);	/* free k->priv */ | 
|  | }; | 
|  |  | 
|  | struct Role | 
|  | { | 
|  | char *name;		/* name of role */ | 
|  | int (*fn)(Conv*);	/* service function */ | 
|  | }; | 
|  |  | 
|  | extern char	*authaddr;	/* plan9.c */ | 
|  | extern int		*confirminuse;	/* fs.c */ | 
|  | extern Conv*	conv;		/* conv.c */ | 
|  | extern int		debug;		/* main.c */ | 
|  | extern char	*factname;	/* main.c */ | 
|  | extern Srv		fs;			/* fs.c */ | 
|  | extern int		*needkeyinuse;	/* fs.c */ | 
|  | extern char	*owner;		/* main.c */ | 
|  | extern Proto	*prototab[];	/* main.c */ | 
|  | extern Ring	ring;			/* key.c */ | 
|  | extern char	*rpcname[];	/* rpc.c */ | 
|  |  | 
|  | extern char	Easproto[];	/* err.c */ | 
|  |  | 
|  | void fsinit0(void); | 
|  |  | 
|  | /* provided by lib9p */ | 
|  | #define emalloc	emalloc9p | 
|  | #define erealloc	erealloc9p | 
|  | #define estrdup	estrdup9p | 
|  |  | 
|  | /* hidden in libauth */ | 
|  | #define attrfmt		_attrfmt | 
|  | #define copyattr	_copyattr | 
|  | #define delattr		_delattr | 
|  | #define findattr		_findattr | 
|  | #define freeattr		_freeattr | 
|  | #define mkattr		_mkattr | 
|  | #define parseattr	_parseattr | 
|  | #define strfindattr	_strfindattr | 
|  |  | 
|  | extern Attr*	addattr(Attr*, char*, ...); | 
|  | /* #pragma varargck argpos addattr 2 */ | 
|  | extern Attr*	addattrs(Attr*, Attr*); | 
|  | extern Attr*	sortattr(Attr*); | 
|  | extern int		attrnamefmt(Fmt*); | 
|  | /* #pragma varargck type "N" Attr* */ | 
|  | extern int		matchattr(Attr*, Attr*, Attr*); | 
|  | extern Attr*	parseattrfmt(char*, ...); | 
|  | /* #pragma varargck argpos parseattrfmt 1 */ | 
|  | extern Attr*	parseattrfmtv(char*, va_list); | 
|  |  | 
|  | extern void	confirmflush(Req*); | 
|  | extern void	confirmread(Req*); | 
|  | extern int		confirmwrite(char*); | 
|  | extern int		needkey(Conv*, Attr*); | 
|  | extern int		badkey(Conv*, Key*, char*, Attr*); | 
|  | extern int		confirmkey(Conv*, Key*); | 
|  |  | 
|  | extern Conv*	convalloc(char*); | 
|  | extern void	convclose(Conv*); | 
|  | extern void	convhangup(Conv*); | 
|  | extern int		convneedkey(Conv*, Attr*); | 
|  | extern int		convbadkey(Conv*, Key*, char*, Attr*); | 
|  | extern int		convread(Conv*, void*, int); | 
|  | extern int		convreadm(Conv*, char**); | 
|  | extern int		convprint(Conv*, char*, ...); | 
|  | /* #pragma varargck argpos convprint 2 */ | 
|  | extern int		convreadfn(Conv*, int(*)(void*, int), char**); | 
|  | extern void	convreset(Conv*); | 
|  | extern int		convwrite(Conv*, void*, int); | 
|  |  | 
|  | extern int		ctlwrite(char*); | 
|  |  | 
|  | extern char*	estrappend(char*, char*, ...); | 
|  | /* #pragma varargck argpos estrappend 2 */ | 
|  | extern int		hexparse(char*, uchar*, int); | 
|  |  | 
|  | extern void	keyadd(Key*); | 
|  | extern Key*	keylookup(char*, ...); | 
|  | extern Key*	keyiterate(int, char*, ...); | 
|  | /* #pragma varargck argpos keylookup 1 */ | 
|  | extern Key*	keyfetch(Conv*, char*, ...); | 
|  | /* #pragma varargck argpos keyfetch 2 */ | 
|  | extern void	keyclose(Key*); | 
|  | extern void	keyevict(Conv*, Key*, char*, ...); | 
|  | /* #pragma varargck argpos keyevict 3 */ | 
|  | extern Key*	keyreplace(Conv*, Key*, char*, ...); | 
|  | /* #pragma varargck argpos keyreplace 3 */ | 
|  |  | 
|  | extern void	lbkick(Logbuf*); | 
|  | extern void	lbappend(Logbuf*, char*, ...); | 
|  | extern void	lbvappend(Logbuf*, char*, va_list); | 
|  | /* #pragma varargck argpos lbappend 2 */ | 
|  | extern void	lbread(Logbuf*, Req*); | 
|  | extern void	lbflush(Logbuf*, Req*); | 
|  | extern void	flog(char*, ...); | 
|  | /* #pragma varargck argpos flog 1 */ | 
|  |  | 
|  | extern void	logflush(Req*); | 
|  | extern void	logread(Req*); | 
|  | extern void	logwrite(Req*); | 
|  |  | 
|  | extern void	needkeyread(Req*); | 
|  | extern void	needkeyflush(Req*); | 
|  | extern int		needkeywrite(char*); | 
|  | extern int		needkeyqueue(void); | 
|  |  | 
|  | extern Attr*	addcap(Attr*, char*, Ticket*); | 
|  | extern Key*	plan9authkey(Attr*); | 
|  | extern int		_authdial(char*, char*); | 
|  |  | 
|  | extern int		memrandom(void*, int); | 
|  |  | 
|  | extern Proto*	protolookup(char*); | 
|  |  | 
|  | extern int		rpcwrite(Conv*, void*, int); | 
|  | extern void	rpcrespond(Conv*, char*, ...); | 
|  | /* #pragma varargck argpos rpcrespond 2 */ | 
|  | extern void	rpcrespondn(Conv*, char*, void*, int); | 
|  | extern void	rpcexec(Conv*); | 
|  |  | 
|  | extern int		xioauthdial(char*, char*); | 
|  | extern void	xioclose(int); | 
|  | extern int		xiodial(char*, char*, char*, int*); | 
|  | extern int		xiowrite(int, void*, int); | 
|  | extern int		xioasrdresp(int, void*, int); | 
|  | extern int		xioasgetticket(int, char*, char*); | 
|  |  | 
|  | /* pkcs1.c - maybe should be in libsec */ | 
|  | typedef DigestState *DigestAlg(uchar*, ulong, uchar*, DigestState*); | 
|  | int	rsasign(RSApriv*, DigestAlg*, uchar*, uint, uchar*, uint); | 
|  | int	rsaverify(RSApub*, DigestAlg*, uchar*, uint, uchar*, uint); | 
|  | void	mptoberjust(mpint*, uchar*, uint); | 
|  |  | 
|  |  | 
|  | extern int		extrafactotumdir; | 
|  |  | 
|  | int		havesecstore(void); | 
|  | int		secstorefetch(void); |