rsc | 4180d05 | 2004-06-17 03:28:08 +0000 | [diff] [blame] | 1 | #include <u.h> |
| 2 | #include <libc.h> |
| 3 | #include <authsrv.h> |
| 4 | |
| 5 | static char *pbmsg = "AS protocol botch"; |
| 6 | |
| 7 | int |
| 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 | } |