ssize_t sasl_read(Sfio_t *f, Void_t *buf, size_t size, Sfdisc_t *disc) { int len, result; const char *outbuf; int outlen; Sasldisc_t *sd = (Sasldisc_t *) disc; len = sfrd(f, buf, size, disc); if (len <= 0) return len; result = sasl_decode(sd->conn, buf, len, &outbuf, &outlen); if (result != SASL_OK) { /* eventually, we'll want an exception here */ return -1; } if (outbuf != NULL) { memcpy(buf, outbuf, outlen); } return outlen; }
static int fill(State_t* state) { ssize_t r; state->bp = state->buf + LINE; if ((r = sfrd(state->codex->sp, state->bp, BUFFER, &state->codex->sfdisc)) <= 0) { state->be = state->bp; return EOF; } state->be = state->bp + r; return *state->bp++; }
static ssize_t cc_read(Sfio_t* sp, void* buf, size_t n, Sfdisc_t* disc) { register State_t* state = (State_t*)((Codex_t*)disc)->data; char* fb; char* tb; size_t fn; size_t tn; ssize_t r; fn = sizeof(state->buf) - (state->bp - state->buf); if (n < fn) fn = n; if ((r = sfrd(sp, state->bp, fn, disc)) <= 0) return (state->bp > state->buf) ? -1 : r; fb = state->buf; fn = r + (state->bp - state->buf); tb = buf; tn = n; n = 0; while (fn > 0 && tn > 0) { if ((r = iconv(state->cvt, &fb, &fn, &tb, &tn)) == -1) { if (!n) n = -1; break; } n += r; } if (fn && fb > state->buf) { tb = state->buf; while (fn--) *tb++ = *fb++; state->bp = tb; } return n; }