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