blob: 8a7daf8cceb1a3b9a71b44af25de340a55f0432b [file] [log] [blame]
rsc4180d052004-06-17 03:28:08 +00001#include <u.h>
2#include <libc.h>
3#include <authsrv.h>
4
5static char *pbmsg = "AS protocol botch";
6
7int
8_asrdresp(int fd, char *buf, int len)
9{
10 int n;
11 char error[64];
12
13 if(read(fd, buf, 1) != 1){
14 werrstr(pbmsg);
15 return -1;
16 }
17
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}