File:  [ELWIX - Embedded LightWeight unIX -] / tftpd / src / buf.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Mon Feb 24 15:23:39 2014 UTC (10 years, 3 months ago) by misho
Branches: MAIN
CVS tags: tftp1_2, TFTP1_1, HEAD
version 1.1

#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;
	const char *m;

	if (!bf || !cli.addr.sa.sa_len || cli.opc != TFTP_OPC_WRQ)
		return 0;

	m = cfg_getAttribute(&cfg, "tftpd", "buf_pad");
	if (m && RPACK_REMAIN(bf)) {
		memset(RPACK_NEXT(bf), (u_char) strtol(m, NULL, 0), RPACK_REMAIN(bf));
		EVERBOSE(4, "Padding buffer with '%c' len=%d", *m, RPACK_REMAIN(bf));
		rpack_rnext(bf, RPACK_REMAIN(bf));
	}

	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>