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