#include "global.h"
#include "buf.h"
int
initBuffer(int siz)
{
ETRACE();
bf = rpack_create(NULL, 0);
if (!bf)
return -1;
if (rpack_attach(bf, siz) == -1) {
rpack_destroy(&bf);
return -1;
}
return 0;
}
void
endBuffer()
{
flushBuffer(cli.fd);
rpack_detach(bf);
rpack_destroy(&bf);
}
int
flushBuffer(int fd)
{
int ret = 0;
if (!bf || !cli.addr.sa.sa_len || cli.opc != TFTP_OPC_WRQ)
return 0;
ret = write(fd, RPACK_BUF(bf), RPACK_OFF(bf));
if (ret == -1)
ESYSERR(0);
else
RPACK_REWIND(bf);
EVERBOSE(3, "Flush buffer ret=%d", ret);
return ret;
}
int
bfwrite(int fd, void *buf, int buflen)
{
void *m;
if (!buf)
return -1;
/* flush */
if (RPACK_REMAIN(bf) < buflen)
flushBuffer(fd);
m = rpack_rdata(bf, buf, buflen);
if (!m)
return -1;
e_free(m);
return buflen;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>