mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
140 lines
2 KiB
C
140 lines
2 KiB
C
|
#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){
|
||
|
werrstr("no tag");
|
||
|
return -1;
|
||
|
}
|
||
|
tag = strtoul(t, 0, 0);
|
||
|
if((ans = _strfindattr(a, "answer")) == nil){
|
||
|
werrstr("no answer");
|
||
|
return -1;
|
||
|
}
|
||
|
if(strcmp(ans, "yes") == 0)
|
||
|
allow = 1;
|
||
|
else if(strcmp(ans, "no") == 0)
|
||
|
allow = 0;
|
||
|
else{
|
||
|
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)
|
||
|
{
|
||
|
if(*confirminuse == 0)
|
||
|
return -1;
|
||
|
|
||
|
lbappend(&confbuf, "confirm tag=%lud %A %N", c->tag, k->attr, k->privattr);
|
||
|
c->state = "keyconfirm";
|
||
|
return recvul(c->keywait);
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
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);
|
||
|
return nbrecvul(c->keywait);
|
||
|
}
|