aboutsummaryrefslogtreecommitdiff
path: root/src/libauthsrv/_asrdresp.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-06-17 03:28:08 +0000
committerrsc <devnull@localhost>2004-06-17 03:28:08 +0000
commit4180d05ba41196e0633252de26750bb19f3a6da8 (patch)
treedb31b1dd561963f8e4b922d63573d971757ec122 /src/libauthsrv/_asrdresp.c
parentbe8b315d1522fa1c109a49435c1638bafd838b91 (diff)
downloadplan9port-4180d05ba41196e0633252de26750bb19f3a6da8.tar.gz
plan9port-4180d05ba41196e0633252de26750bb19f3a6da8.tar.bz2
plan9port-4180d05ba41196e0633252de26750bb19f3a6da8.zip
these do work
Diffstat (limited to 'src/libauthsrv/_asrdresp.c')
-rw-r--r--src/libauthsrv/_asrdresp.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/libauthsrv/_asrdresp.c b/src/libauthsrv/_asrdresp.c
new file mode 100644
index 00000000..8a7daf8c
--- /dev/null
+++ b/src/libauthsrv/_asrdresp.c
@@ -0,0 +1,56 @@
+#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;
+}