8 typedef struct Afid Afid;
19 static uvlong authgen = 1ULL<<63;
27 afid = emalloc9p(sizeof(Afid));
28 afid->afd = open("/mnt/factotum/rpc", ORDWR);
32 if((afid->rpc = auth_allocrpc(afid->afd)) == nil)
35 if(r->ifcall.uname[0] == 0)
37 afid->uname = estrdup9p(r->ifcall.uname);
38 afid->aname = estrdup9p(r->ifcall.aname);
40 spec = r->srv->keyspec;
42 spec = "proto=p9any role=server";
44 if(auth_rpc(afid->rpc, "start", spec, strlen(spec)) != ARok)
47 r->afid->qid.type = QTAUTH;
48 r->afid->qid.path = ++authgen;
49 r->afid->qid.vers = 0;
50 r->afid->omode = ORDWR;
51 r->ofcall.qid = r->afid->qid;
58 auth_freerpc(afid->rpc);
70 _authread(Afid *afid, void *data, int count)
74 switch(auth_rpc(afid->rpc, "read", nil, 0)){
76 ai = auth_getinfo(afid->rpc);
81 fprint(2, "authenticate %s/%s: ok\n", afid->uname, afid->aname);
86 if(count < afid->rpc->narg){
87 werrstr("authread count too small");
90 count = afid->rpc->narg;
91 memmove(data, afid->rpc->arg, count);
96 werrstr("authrpc botch");
110 if(afid == nil || r->fid->qid.type != QTAUTH){
111 respond(r, "not an auth fid");
114 n = _authread(afid, r->ofcall.data, r->ifcall.count);
131 if(afid == nil || r->fid->qid.type != QTAUTH){
132 respond(r, "not an auth fid");
135 if(auth_rpc(afid->rpc, "write", r->ifcall.data, r->ifcall.count) != ARok){
139 r->ofcall.count = r->ifcall.count;
144 authdestroy(Fid *fid)
148 if((fid->qid.type & QTAUTH) && (afid = fid->aux) != nil){
150 auth_freerpc(afid->rpc);
166 respond(r, "not authenticated");
171 if((r->afid->qid.type&QTAUTH) == 0 || afid == nil){
172 respond(r, "not an auth fid");
177 if(_authread(afid, buf, 0) < 0){
183 if(strcmp(afid->uname, r->ifcall.uname) != 0){
184 snprint(buf, sizeof buf, "auth uname mismatch: %s vs %s",
185 afid->uname, r->ifcall.uname);
190 if(strcmp(afid->aname, r->ifcall.aname) != 0){
191 snprint(buf, sizeof buf, "auth aname mismatch: %s vs %s",
192 afid->aname, r->ifcall.aname);