#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); }