+ if (elapsed)
+ *elapsed = ptimer_read (timer);
+ if (timer)
+ ptimer_destroy (timer);
+
+ if (qtyread)
+ *qtyread += sum_read;
+ if (qtywritten)
+ *qtywritten += sum_written;
+
+ return ret;
+}
+\f
+/* Read a hunk of data from FD, up until a terminator. The terminator
+ is whatever the TERMINATOR function determines it to be; for
+ example, it can be a line of data, or the head of an HTTP response.
+ The function returns the data read allocated with malloc.
+
+ In case of error, NULL is returned. In case of EOF and no data
+ read, NULL is returned and errno set to 0. In case of EOF with
+ data having been read, the data is returned, but it will
+ (obviously) not contain the terminator.
+
+ The idea is to be able to read a line of input, or otherwise a hunk
+ of text, such as the head of an HTTP request, without crossing the
+ boundary, so that the next call to fd_read etc. reads the data
+ after the hunk. To achieve that, this function does the following:
+
+ 1. Peek at available data.
+
+ 2. Determine whether the peeked data, along with the previously
+ read data, includes the terminator.
+
+ 2a. If yes, read the data until the end of the terminator, and
+ exit.
+
+ 2b. If no, read the peeked data and goto 1.