#include "std.h"
#include "dat.h"
Logbuf confbuf;
void
confirmread(Req *r)
{
lbread(&confbuf, r);
}
void
confirmflush(Req *r)
{
lbflush(&confbuf, r);
}
int
confirmwrite(char *s)
{
char *t, *ans;
int allow;
ulong tag;
Attr *a;
Conv *c;
a = _parseattr(s);
if(a == nil){
werrstr("bad attr");
return -1;
}
if((t = _strfindattr(a, "tag")) == nil){
flog("bad confirm write: no tag");
werrstr("no tag");
return -1;
}
tag = strtoul(t, 0, 0);
if((ans = _strfindattr(a, "answer")) == nil){
flog("bad confirm write: no answer");
werrstr("no answer");
return -1;
}
if(strcmp(ans, "yes") == 0)
allow = 1;
else if(strcmp(ans, "no") == 0)
allow = 0;
else{
flog("bad confirm write: bad answer");
werrstr("bad answer");
return -1;
}
for(c=conv; c; c=c->next){
if(tag == c->tag){
nbsendul(c->keywait, allow);
break;
}
}
if(c == nil){
werrstr("tag not found");
return -1;
}
return 0;
}
int
confirmkey(Conv *c, Key *k)
{
int ret;
if(*confirminuse == 0)
return -1;
lbappend(&confbuf, "confirm tag=%lud %A %N", c->tag, k->attr, k->privattr);
flog("confirm %A %N", k->attr, k->privattr);
c->state = "keyconfirm";
ret = recvul(c->keywait);
flog("confirm=%d %A %N", ret, k->attr, k->privattr);
return ret;
}
Logbuf needkeybuf;
void
needkeyread(Req *r)
{
lbread(&needkeybuf, r);
}
void
needkeyflush(Req *r)
{
lbflush(&needkeybuf, r);
}
int
needkeywrite(char *s)
{
char *t;
ulong tag;
Attr *a;
Conv *c;
a = _parseattr(s);
if(a == nil){
werrstr("empty write");
return -1;
}
if((t = _strfindattr(a, "tag")) == nil){
werrstr("no tag");
freeattr(a);
return -1;
}
tag = strtoul(t, 0, 0);
for(c=conv; c; c=c->next)
if(c->tag == tag){
nbsendul(c->keywait, 0);
break;
}
if(c == nil){
werrstr("tag not found");
freeattr(a);
return -1;
}
freeattr(a);
return 0;
}
int
needkey(Conv *c, Attr *a)
{
if(c == nil || *needkeyinuse == 0)
return -1;
lbappend(&needkeybuf, "needkey tag=%lud %A", c->tag, a);
flog("needkey %A", a);
return nbrecvul(c->keywait);
}
int
badkey(Conv *c, Key *k, char *msg, Attr *a)
{
if(c == nil || *needkeyinuse == 0)
return -1;
lbappend(&needkeybuf, "badkey tag=%lud %A %N\n%s\n%A",
c->tag, k->attr, k->privattr, msg, a);
flog("badkey %A / %N / %s / %A",
k->attr, k->privattr, msg, a);
return nbrecvul(c->keywait);
}
|