struct Fsstate
{
char *sysuser; /* user according to system */
/* keylist, protolist */
int listoff;
/* per-rpc transient information */
int pending;
struct {
char *arg, buf[Maxrpc], *verb;
int iverb, narg, nbuf, nwant;
} rpc;
/* persistent (cross-rpc) information */
char err[ERRMAX];
char keyinfo[3*Maxname]; /* key request */
char **phasename;
int haveai, maxphase, phase, seqnum, started;
Attr *attr;
AuthInfo ai;
Proto *proto;
State *ps;
struct { /* pending or finished key confirmations */
Key *key;
int canuse;
ulong tag;
} *conf;
int nconf;
};
struct Key
{
int ref;
Attr *attr;
Attr *privattr; /* private attributes, like *data */
Proto *proto;
void *priv; /* protocol-specific; a parsed key, perhaps */
};
struct Keyring
{
Key **key;
int nkey;
};
struct Logbuf
{
Req *wait;
Req **waitlast;
int rp;
int wp;
char *msg[128];
};
struct Proto
{
char *name;
int (*init)(Proto*, Fsstate*);
int (*addkey)(Key*);
void (*closekey)(Key*);
int (*write)(Fsstate*, void*, uint);
int (*read)(Fsstate*, void*, uint*);
void (*close)(Fsstate*);
char *keyprompt;
};
/* confirm.c */
void confirmread(Req*);
void confirmflush(Req*);
int confirmwrite(char*);
void confirmqueue(Req*, Fsstate*);
void needkeyread(Req*);
void needkeyflush(Req*);
int needkeywrite(char*);
int needkeyqueue(Req*, Fsstate*);
/* fs.c */
extern int askforkeys;
extern char *authaddr;
extern int *confirminuse;
extern int debug;
extern int gflag;
extern int kflag;
extern int *needkeyinuse;
extern int sflag;
extern int uflag;
extern char *mtpt;
extern char *service;
extern Proto *prototab[];
extern Keyring *ring;