コード例 #1
0
ファイル: shmem_delta.c プロジェクト: neonatura/share
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);
}
コード例 #2
0
ファイル: shnet_read.c プロジェクト: neonatura/share
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);
}
コード例 #3
0
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);
}