diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-01-06 03:09:00 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-01-06 03:09:00 +0100 |
commit | 2dae1ed53a73d81bfb86778793a6bda265d5140d (patch) | |
tree | e037c4a663fc9d17906cc2045c488232ac223ece /sys/src/libauthsrv/_asgetticket.c | |
parent | e064752dd476b7a2f76567f8cc15f9c2645e5d3d (diff) |
auth: release dp9ik implementation and reentrant factotum
Diffstat (limited to 'sys/src/libauthsrv/_asgetticket.c')
-rw-r--r-- | sys/src/libauthsrv/_asgetticket.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/sys/src/libauthsrv/_asgetticket.c b/sys/src/libauthsrv/_asgetticket.c index 11a344621..d7e30b2a8 100644 --- a/sys/src/libauthsrv/_asgetticket.c +++ b/sys/src/libauthsrv/_asgetticket.c @@ -2,16 +2,36 @@ #include <libc.h> #include <authsrv.h> -static char *pbmsg = "AS protocol botch"; - int _asgetticket(int fd, Ticketreq *tr, char *tbuf, int tbuflen) { - if(_asrequest(fd, tr) < 0){ - werrstr(pbmsg); + char err[ERRMAX]; + int i, n, m, r; + + strcpy(err, "AS protocol botch"); + errstr(err, ERRMAX); + + if(_asrequest(fd, tr) < 0) + return -1; + if(_asrdresp(fd, tbuf, 0) < 0) return -1; + + r = 0; + for(i = 0; i<2; i++){ + for(n=0; (m = convM2T(tbuf, n, nil, nil)) <= 0; n += m){ + m = -m; + if(m <= n || m > tbuflen) + return -1; + m -= n; + if(readn(fd, tbuf+n, m) != m) + return -1; + } + r += n; + tbuf += n; + tbuflen -= n; } - if(tbuflen > 2*TICKETLEN) - tbuflen = 2*TICKETLEN; - return _asrdresp(fd, tbuf, tbuflen); + + errstr(err, ERRMAX); + + return r; } |