#include #include #include typedef struct Test Test; struct Test { char *name; int (*server)(Test*, AuthRpc*, int); int (*client)(Test*, int); }; int ai2status(AuthInfo *ai) { if(ai == nil) return -1; auth_freeAI(ai); return 0; } int proxyserver(Test *t, AuthRpc *rpc, int fd) { char buf[1024]; sprint(buf, "proto=%q role=server", t->name); return ai2status(fauth_proxy(fd, rpc, nil, buf)); } int proxyclient(Test *t, int fd) { return ai2status(auth_proxy(fd, auth_getkey, "proto=%q role=client", t->name)); } Test test[] = { "apop", proxyserver, proxyclient, "cram", proxyserver, proxyclient, "p9sk1", proxyserver, proxyclient, "p9sk2", proxyserver, proxyclient, "p9any", proxyserver, proxyclient }; void usage(void) { fprint(2, "usage: test [name]...\n"); exits("usage"); } void runtest(AuthRpc *srpc, Test *t) { int p[2], bad; Waitmsg *w; if(pipe(p) < 0) sysfatal("pipe: %r"); print("%s...", t->name); switch(fork()){ case -1: sysfatal("fork: %r"); case 0: close(p[0]); if((*t->server)(t, srpc, p[1]) < 0){ print("\n\tserver: %r"); _exits("oops"); } close(p[1]); _exits(nil); default: close(p[1]); if((*t->client)(t, p[0]) < 0){ print("\n\tclient: %r"); bad = 1; } close(p[0]); break; } w = wait(); if(w->msg[0]) bad = 1; print("\n"); } void main(int argc, char **argv) { int i, j; int afd; AuthRpc *srpc; ARGBEGIN{ default: usage(); }ARGEND quotefmtinstall(); afd = open("/n/kremvax/factotum/rpc", ORDWR); if(afd < 0) sysfatal("open /n/kremvax/factotum/rpc: %r"); srpc = auth_allocrpc(afd); if(srpc == nil) sysfatal("auth_allocrpc: %r"); if(argc == 0) for(i=0; i