plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

_asrdresp.c (874B)


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