mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
225 lines
5.9 KiB
C
225 lines
5.9 KiB
C
|
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,
|
||
|
|
||
|
/* thread stack size */
|
||
|
STACK = 8192,
|
||
|
};
|
||
|
|
||
|
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;
|
||
|
};
|
||
|
|
||
|
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 */
|
||
|
|
||
|
extern Proto apop; /* apop.c */
|
||
|
extern Proto chap; /* chap.c */
|
||
|
extern Proto cram; /* cram.c */
|
||
|
extern Proto mschap; /* mschap.c */
|
||
|
extern Proto p9any; /* p9any.c */
|
||
|
extern Proto p9sk1; /* p9sk1.c */
|
||
|
extern Proto p9sk2; /* p9sk2.c */
|
||
|
|
||
|
/* 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*, ...);
|
||
|
/* #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 char* readcons(char *prompt, char *def, int raw);
|
||
|
|
||
|
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*);
|