version 1.1, 2014/02/24 14:38:47
|
version 1.2, 2014/02/24 15:23:39
|
Line 0
|
Line 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; |
|
} |