ssize_t mc_get(DAL_Context* ctx, char* buf, size_t size) { ENTRY(); ssize_t size_read; ObjectStream* os = MC_OS(ctx); if(! (os->flags & OSF_OPEN)) { errno = EBADF; LOG(LOG_ERR, "Attempted get on OS that is not open.\n"); } ne_handle handle = MC_HANDLE(ctx); // context->chunk_offset tracks the offset we are reading at within // the object. size_read = ne_read(handle, buf, size, MC_CONTEXT(ctx)->chunk_offset); if(size_read < 0) { LOG(LOG_ERR, "ne_read() failed.\n"); return -1; } else if(size_read == 0) { // EOF os->flags |= OSF_EOF; } // update the offset for the next call to read. MC_CONTEXT(ctx)->chunk_offset += size_read; os->written += size_read; EXIT(); return size_read; }
static ssize_t read_raw(ne_socket *sock, char *buffer, size_t len) { ssize_t ret; ret = readable_raw(sock, sock->rdtimeout); if (ret) return ret; do { ret = ne_read(sock->fd, buffer, len); } while (ret == -1 && NE_ISINTR(ne_errno)); if (ret == 0) { set_error(sock, _("Connection closed")); ret = NE_SOCK_CLOSED; } else if (ret < 0) { int errnum = ne_errno; ret = NE_ISRESET(errnum) ? NE_SOCK_RESET : NE_SOCK_ERROR; set_strerror(sock, errnum); } return ret; }