LIBETPAN_EXPORT ssize_t mailstream_read(mailstream * s, void * buf, size_t count) { ssize_t read_bytes; char * cur_buf; size_t left; if (s == NULL) return -1; left = count; cur_buf = buf; read_bytes = read_from_internal_buffer(s, cur_buf, left); cur_buf += read_bytes; left -= read_bytes; if (left == 0) { return read_bytes; } if (left > s->buffer_max_size) { read_bytes = mailstream_low_read(s->low, cur_buf, left); if (read_bytes == -1) { if (count == left) return -1; else { return count - left; } } cur_buf += read_bytes; left -= read_bytes; return count - left; } read_bytes = mailstream_low_read(s->low, s->read_buffer, s->buffer_max_size); if (read_bytes < 0) { if (left == count) return -1; else { return count - left; } } else s->read_buffer_len += read_bytes; read_bytes = read_from_internal_buffer(s, cur_buf, left); cur_buf += read_bytes; left -= read_bytes; return count - left; }
static ssize_t read_through_buffer(mailstream * s, void * buf, size_t count) { size_t left; char * cur_buf; ssize_t bytes_read; cur_buf = buf; left = count; while (left > 0) { bytes_read = mailstream_low_read(s->low, cur_buf, left); if (bytes_read < 0) { if (count == left) return -1; else return count - left; } else if (bytes_read == 0) return count - left; cur_buf += bytes_read; left -= bytes_read; } return count; }
ssize_t mailstream_feed_read_buffer(mailstream * s) { ssize_t read_bytes; if (s == NULL) return -1; if (s->read_buffer_len == 0) { read_bytes = mailstream_low_read(s->low, s->read_buffer, s->buffer_max_size); if (read_bytes < 0) return -1; s->read_buffer_len += read_bytes; } return s->read_buffer_len; }