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