Blob


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