1 #include <errno.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include "iobuf.h"
5
obuf_write_large(obuf * out,const char * data,unsigned datalen)6 int obuf_write_large(obuf* out, const char* data, unsigned datalen)
7 {
8 iobuf* io;
9 unsigned wr;
10
11 io = &out->io;
12 if (iobuf_bad(io)) return 0;
13 out->count = 0;
14 if (!obuf_flush(out)) return 0;
15
16 while (datalen > 0) {
17 if (io->timeout && !iobuf_timeout(io, 1)) return 0;
18 if ((wr = out->writefn(io->fd, data, datalen)) == (unsigned)-1)
19 IOBUF_SET_ERROR(io);
20 datalen -= wr;
21 data += wr;
22 io->offset += wr;
23 out->count += wr;
24 }
25 return 1;
26 }
27
obuf_write(obuf * out,const char * data,unsigned datalen)28 int obuf_write(obuf* out, const char* data, unsigned datalen)
29 {
30 iobuf* io;
31 unsigned avail;
32
33 io = &out->io;
34 if (iobuf_bad(io)) return 0;
35 if (datalen >= io->bufsize) return obuf_write_large(out, data, datalen);
36
37 out->count = 0;
38 avail = io->bufsize - out->bufpos;
39 while (datalen >= avail) {
40 memcpy(io->buffer+out->bufpos, data, avail);
41 out->bufpos = io->bufsize;
42 io->buflen = io->bufsize;
43 datalen -= avail;
44 data += avail;
45 if (!obuf_flush(out)) return 0;
46 out->count += avail;
47 avail = io->bufsize - out->bufpos;
48 }
49
50 memcpy(io->buffer+out->bufpos, data, datalen);
51 out->count += datalen;
52 out->bufpos += datalen;
53 if (out->bufpos > io->buflen) io->buflen = out->bufpos;
54 return 1;
55 }
56