--- tftpd/src/buf.c 2014/02/24 14:38:47 1.1 +++ tftpd/src/buf.c 2014/02/24 15:23:39 1.2 @@ -0,0 +1,73 @@ +#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; +}