static int _xd3_read_primary_input(_xd3_file *file, uint8_t *buf, size_t size, size_t *nread) { size_t max_len; if (!file->buff) return (SHERR_IO); max_len = MIN(size, shbuf_size(file->buff)); if (max_len) { memcpy(buf, shbuf_data(file->buff), max_len); shbuf_trim(file->buff, max_len); } if (nread) *nread = max_len; file->nread += max_len; return (0); }
ssize_t shnet_read(int fd, const void *buf, size_t count) { unsigned int usk = (unsigned int)fd; struct timeval to; size_t max_r_len; ssize_t r_len; size_t len; fd_set read_set; fd_set exc_set; char tbuf[8]; int err; if (_sk_table[usk].fd == 0) return (SHERR_BADF); if (count == 0) { buf = NULL; count = 65536; } count = MIN(MAX_READ_BUFFER_SIZE, count); if (!_sk_table[usk].recv_buff) _sk_table[usk].recv_buff = shbuf_init(); if (!(_sk_table[usk].flags & SHNET_ASYNC)) { FD_ZERO(&read_set); FD_SET(fd, &read_set); FD_ZERO(&exc_set); FD_SET(fd, &exc_set); /* block for data */ err = select(fd+1, &read_set, NULL, &exc_set, NULL); if (err == -1) return (errno2sherr()); } /* data available for read. */ memset(_read_buff, 0, sizeof(_read_buff)); r_len = read(fd, _read_buff, count); if (r_len == 0) { #if 0 if (shbuf_size(_sk_table[usk].recv_buff) == 0) #endif return (SHERR_CONNRESET); } else if (r_len < 1) { return (errno2sherr()); } else { /* append to internal buffer */ shbuf_cat(_sk_table[usk].recv_buff, _read_buff, r_len); } if (buf) { /* extract head */ r_len = MIN(count, shbuf_size(_sk_table[usk].recv_buff)); if (r_len != 0) { memcpy((char *)buf, (char *)shbuf_data(_sk_table[usk].recv_buff), r_len); shbuf_trim(_sk_table[usk].recv_buff, r_len); } } return (r_len); }
int shfs_read_of(shfs_ino_t *file, shbuf_t *buff, off_t of, size_t size) { shfs_ino_t *aux; int format; int err; if (file == NULL) return (SHERR_INVAL); if (shfs_format(file) == SHINODE_NULL) return (SHERR_NOENT); /* no data content */ if (!buff) return (0); err = 0; format = shfs_format(file); switch (format) { case SHINODE_REFERENCE: err = shfs_ref_read(file, buff); if (!err) { /* cheat */ if (of) shbuf_trim(buff, of); if (size) shbuf_truncate(buff, size); } break; case SHINODE_EXTERNAL: err = shfs_ext_read(file, buff); if (!err) { /* cheat */ if (of) shbuf_trim(buff, of); if (size) shbuf_truncate(buff, size); } break; case SHINODE_COMPRESS: err = shfs_zlib_read(file, buff); if (!err) { /* cheat */ if (of) shbuf_trim(buff, of); if (size) shbuf_truncate(buff, size); } break; case SHINODE_DATABASE: err = shfs_db_read_of(file, buff, of, size); break; case SHINODE_BINARY: err = shfs_bin_read_of(file, buff, of, size); break; case SHINODE_DIRECTORY: if (!(shfs_attr(file) & SHATTR_ARCH)) return (SHERR_ISDIR); err = shfs_arch_read(file, buff); if (!err) { /* cheat */ if (of) shbuf_trim(buff, of); if (size) shbuf_truncate(buff, size); } break; } return (err); }