Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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++;
}
Exemplo n.º 3
0
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;
}