src/ioset.c (ioset_line_read): We can safely overwrite dest[max-1] to
terminate the buffer. Also return the available line length, rather
than the number of bytes written to the buffer.
int
ioset_line_read(struct io_fd *fd, char *dest, int max) {
int
ioset_line_read(struct io_fd *fd, char *dest, int max) {
- int avail, done;
- if ((fd->state == IO_CLOSED) && (!ioq_get_avail(&fd->recv) || (fd->line_len < 0)))
+ int line_len;
+ int avail;
+ int done;
+
+ line_len = fd->line_len;
+ if ((fd->state == IO_CLOSED) && (!ioq_get_avail(&fd->recv) || (line_len < 0)))
- if (fd->line_len < max)
- max = fd->line_len;
+ if (line_len < max)
+ max = line_len;
avail = ioq_get_avail(&fd->recv);
if (max > avail) {
memcpy(dest, fd->recv.buf + fd->recv.get, avail);
avail = ioq_get_avail(&fd->recv);
if (max > avail) {
memcpy(dest, fd->recv.buf + fd->recv.get, avail);
- fd->recv.get += avail;
- assert(fd->recv.get == fd->recv.size);
+ assert(fd->recv.get + avail == fd->recv.size);
fd->recv.get = 0;
done = avail;
} else {
fd->recv.get = 0;
done = avail;
} else {
fd->recv.get += max - done;
if (fd->recv.get == fd->recv.size)
fd->recv.get = 0;
fd->recv.get += max - done;
if (fd->recv.get == fd->recv.size)
fd->recv.get = 0;
ioset_find_line_length(fd);
ioset_find_line_length(fd);