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