#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; }