xref: /plan9/sys/src/cmd/unix/drawterm/libauthsrv/_asrdresp.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include <u.h>
2 #include <libc.h>
3 #include <authsrv.h>
4 
5 static char *pbmsg = "AS protocol botch";
6 
7 int
_asrdresp(int fd,char * buf,int len)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 }
57