Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}