#include <u.h> | |
#include <libc.h> | |
#include <authsrv.h> | |
static char *pbmsg = "AS protocol botch"; | |
int | |
_asrdresp(int fd, char *buf, int len) | |
{ | |
int n; | |
char error[64]; | |
if(read(fd, buf, 1) != 1){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
n = len; | |
switch(buf[0]){ | |
case AuthOK: | |
if(readn(fd, buf, len) != len){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
break; | |
case AuthErr: | |
if(readn(fd, error, sizeof error) != sizeof error){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
error[sizeof error-1] = '\0'; | |
werrstr("remote: %s", error); | |
return -1; | |
case AuthOKvar: | |
if(readn(fd, error, 5) != 5){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
error[5] = 0; | |
n = atoi(error); | |
if(n <= 0 || n > len){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
memset(buf, 0, len); | |
if(readn(fd, buf, n) != n){ | |
werrstr(pbmsg); | |
return -1; | |
} | |
break; | |
default: | |
werrstr(pbmsg); | |
return -1; | |
} | |
return n; | |
} |