Annotation of tftpd/src/buf.c, revision 1.1.2.4
1.1.2.1 misho 1: #include "global.h"
2: #include "buf.h"
3:
4:
5: int
6: initBuffer(int siz)
7: {
8: ETRACE();
9:
10: bf = rpack_create(NULL, 0);
11: if (!bf)
12: return -1;
13: if (rpack_attach(bf, siz) == -1) {
14: rpack_destroy(&bf);
15: return -1;
16: }
17:
18: return 0;
19: }
20:
21: void
22: endBuffer()
23: {
24: flushBuffer(cli.fd);
25: rpack_detach(bf);
26: rpack_destroy(&bf);
27: }
28:
29: int
30: flushBuffer(int fd)
31: {
32: int ret = 0;
1.1.2.3 misho 33: const char *m;
1.1.2.1 misho 34:
1.1.2.2 misho 35: if (!bf || !cli.addr.sa.sa_len || cli.opc != TFTP_OPC_WRQ)
1.1.2.1 misho 36: return 0;
37:
1.1.2.3 misho 38: m = cfg_getAttribute(&cfg, "tftpd", "buf_pad");
1.1.2.4 ! misho 39: if (m && RPACK_REMAIN(bf)) {
! 40: memset(RPACK_NEXT(bf), (u_char) strtol(m, NULL, 0), RPACK_REMAIN(bf));
1.1.2.3 misho 41: EVERBOSE(4, "Padding buffer with '%c' len=%d", *m, RPACK_REMAIN(bf));
42: rpack_rnext(bf, RPACK_REMAIN(bf));
43: }
44:
1.1.2.1 misho 45: ret = write(fd, RPACK_BUF(bf), RPACK_OFF(bf));
46: if (ret == -1)
47: ESYSERR(0);
48: else
49: RPACK_REWIND(bf);
50:
51: EVERBOSE(3, "Flush buffer ret=%d", ret);
52: return ret;
53: }
54:
55: int
56: bfwrite(int fd, void *buf, int buflen)
57: {
58: void *m;
59:
60: if (!buf)
61: return -1;
62:
63: /* flush */
64: if (RPACK_REMAIN(bf) < buflen)
65: flushBuffer(fd);
66:
67: m = rpack_rdata(bf, buf, buflen);
68: if (!m)
69: return -1;
70:
71: e_free(m);
72: return buflen;
73: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>