Blob
1 #include <u.h>2 #include <libc.h>3 #include <authsrv.h>5 static char *pbmsg = "AS protocol botch";7 int8 _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 }