X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/df9dfccffd73a98ebebdecb35b23a854a5209b78..7cd79da096ced70c89af673bc0c87990eaa68528:/servutil.c diff --git a/servutil.c b/servutil.c index dac92b7b..f4ab92e3 100644 --- a/servutil.c +++ b/servutil.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: servutil.c,v 1.3 2001/06/19 22:08:11 mdw Exp $ + * $Id$ * * Various handy server-only utilities * @@ -26,21 +26,6 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: servutil.c,v $ - * Revision 1.3 2001/06/19 22:08:11 mdw - * Use magic number for packet size. - * - * Revision 1.2 2001/02/16 21:41:06 mdw - * Use new spare buffer for building MP textual representations. Add a - * function for making human-readable time strings. - * - * Revision 1.1 2001/02/03 20:26:37 mdw - * Initial checkin. - * - */ - /*----- Header files ------------------------------------------------------*/ #include "tripe.h" @@ -68,6 +53,24 @@ const char *mpstr(mp *m) return ((const char *)buf_t); } +/* --- @gestr@ --- * + * + * Arguments: @group *g@ = a group + * @ge *x@ = a group element + * + * Returns: A pointer to the element's textual representation. + * + * Use: Converts a group element to a string. Corrupts + * @buf_t@. + */ + +const char *gestr(group *g, ge *x) +{ + if (group_writestring(g, x, (char *)buf_t, sizeof(buf_t))) + return (""); + return ((const char *)buf_t); +} + /* --- @timestr@ --- * * * Arguments: @time_t t@ = a time to convert @@ -88,4 +91,74 @@ const char *timestr(time_t t) return ((const char *)buf_t); } +/* --- @b64_encode@ --- * + * + * Arguments: @const void *p@ = pointer to some gorp + * @size_t sz@ = size of the gorp + * + * Returns: Pointer to base64-encoded version in @buf_t@. + */ + +const char *b64_encode(const void *p, size_t sz) +{ + base64_ctx b64; + dstr d = DSTR_INIT; + + base64_init(&b64); + b64.indent = ""; + b64.maxline = 0; + base64_encode(&b64, p, sz, &d); + base64_encode(&b64, 0, 0, &d); + while (d.len && d.buf[d.len - 1] == '=') d.len--; + assert(d.len < sizeof(buf_t)); + memcpy(buf_t, d.buf, d.len); + buf_t[d.len] = 0; + dstr_destroy(&d); + return ((const char *)buf_t); +} + +/* --- @seq_reset@ --- * + * + * Arguments: @seqwin *s@ = sequence-checking window + * + * Returns: --- + * + * Use: Resets a sequence number window. + */ + +void seq_reset(seqwin *s) { s->seq = 0; s->win = 0; } + +/* --- @seq_check@ --- * + * + * Arguments: @seqwin *s@ = sequence-checking window + * @uint32 q@ = sequence number to check + * + * Returns: A @SEQ_@ code. + * + * Use: Checks a sequence number against the window, updating things + * as necessary. + */ + +int seq_check(seqwin *s, uint32 q) +{ + uint32 qbit; + uint32 n; + + if (q < s->seq) + return (SEQ_OLD); + if (q >= s->seq + SEQ_WINSZ) { + n = q - (s->seq + SEQ_WINSZ - 1); + if (n < SEQ_WINSZ) + s->win >>= n; + else + s->win = 0; + s->seq += n; + } + qbit = 1 << (q - s->seq); + if (s->win & qbit) + return (SEQ_REPLAY); + s->win |= qbit; + return (0); +} + /*----- That's all, folks -------------------------------------------------*/