+
+ssize_t buffer_read(buffer_t *buf, int fd, ssize_t count)
+{
+ ssize_t res;
+
+ if (count < 0)
+ count = BUFSIZ;
+
+ buffer_ensure(buf, count);
+
+ res = read(fd, buf->data + buf->len, count);
+ if (res < 0) {
+ buf->data[buf->len] = '\0';
+ return res;
+ }
+
+ buffer_extend(buf, res);
+ return res;
+}
+
+ssize_t buffer_write(buffer_t *buf, int fd)
+{
+ ssize_t res = write(fd, buf->data, buf->len);
+ if (res < 0) {
+ return errno == EINTR || errno == EAGAIN ? 0 : -1;
+ }
+ buffer_consume(buf, res);
+ return res;
+}