1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <authsrv.h>
4*9a747e4fSDavid du Colombier
5*9a747e4fSDavid du Colombier static char *pbmsg = "AS protocol botch";
6*9a747e4fSDavid du Colombier
7*9a747e4fSDavid du Colombier int
_asrdresp(int fd,char * buf,int len)8*9a747e4fSDavid du Colombier _asrdresp(int fd, char *buf, int len)
9*9a747e4fSDavid du Colombier {
10*9a747e4fSDavid du Colombier int n;
11*9a747e4fSDavid du Colombier char error[64];
12*9a747e4fSDavid du Colombier
13*9a747e4fSDavid du Colombier if(read(fd, buf, 1) != 1){
14*9a747e4fSDavid du Colombier werrstr(pbmsg);
15*9a747e4fSDavid du Colombier return -1;
16*9a747e4fSDavid du Colombier }
17*9a747e4fSDavid du Colombier
18*9a747e4fSDavid du Colombier n = len;
19*9a747e4fSDavid du Colombier switch(buf[0]){
20*9a747e4fSDavid du Colombier case AuthOK:
21*9a747e4fSDavid du Colombier if(readn(fd, buf, len) != len){
22*9a747e4fSDavid du Colombier werrstr(pbmsg);
23*9a747e4fSDavid du Colombier return -1;
24*9a747e4fSDavid du Colombier }
25*9a747e4fSDavid du Colombier break;
26*9a747e4fSDavid du Colombier case AuthErr:
27*9a747e4fSDavid du Colombier if(readn(fd, error, sizeof error) != sizeof error){
28*9a747e4fSDavid du Colombier werrstr(pbmsg);
29*9a747e4fSDavid du Colombier return -1;
30*9a747e4fSDavid du Colombier }
31*9a747e4fSDavid du Colombier error[sizeof error-1] = '\0';
32*9a747e4fSDavid du Colombier werrstr("remote: %s", error);
33*9a747e4fSDavid du Colombier return -1;
34*9a747e4fSDavid du Colombier case AuthOKvar:
35*9a747e4fSDavid du Colombier if(readn(fd, error, 5) != 5){
36*9a747e4fSDavid du Colombier werrstr(pbmsg);
37*9a747e4fSDavid du Colombier return -1;
38*9a747e4fSDavid du Colombier }
39*9a747e4fSDavid du Colombier error[5] = 0;
40*9a747e4fSDavid du Colombier n = atoi(error);
41*9a747e4fSDavid du Colombier if(n <= 0 || n > len){
42*9a747e4fSDavid du Colombier werrstr(pbmsg);
43*9a747e4fSDavid du Colombier return -1;
44*9a747e4fSDavid du Colombier }
45*9a747e4fSDavid du Colombier memset(buf, 0, len);
46*9a747e4fSDavid du Colombier if(readn(fd, buf, n) != n){
47*9a747e4fSDavid du Colombier werrstr(pbmsg);
48*9a747e4fSDavid du Colombier return -1;
49*9a747e4fSDavid du Colombier }
50*9a747e4fSDavid du Colombier break;
51*9a747e4fSDavid du Colombier default:
52*9a747e4fSDavid du Colombier werrstr(pbmsg);
53*9a747e4fSDavid du Colombier return -1;
54*9a747e4fSDavid du Colombier }
55*9a747e4fSDavid du Colombier return n;
56*9a747e4fSDavid du Colombier }
57