コード例 #1
0
ファイル: fs.c プロジェクト: shantanusharma/node
static ssize_t uv__fs_read(uv_fs_t* req) {
#if defined(__linux__)
  static int no_preadv;
#endif
  unsigned int iovmax;
  ssize_t result;

  iovmax = uv__getiovmax();
  if (req->nbufs > iovmax)
    req->nbufs = iovmax;

  if (req->off < 0) {
    if (req->nbufs == 1)
      result = read(req->file, req->bufs[0].base, req->bufs[0].len);
    else
      result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
  } else {
    if (req->nbufs == 1) {
      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
      goto done;
    }

#if HAVE_PREADV
    result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
    if (no_preadv) retry:
# endif
    {
      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    }
# if defined(__linux__)
    else {
      result = uv__preadv(req->file,
                          (struct iovec*)req->bufs,
                          req->nbufs,
                          req->off);
      if (result == -1 && errno == ENOSYS) {
        no_preadv = 1;
        goto retry;
      }
    }
# endif
#endif
  }

done:
  /* Early cleanup of bufs allocation, since we're done with it. */
  if (req->bufs != req->bufsml)
    uv__free(req->bufs);

  req->bufs = NULL;
  req->nbufs = 0;

  return result;
}
コード例 #2
0
ファイル: fs.c プロジェクト: MajdiSobain/ring
static ssize_t uv__fs_read(uv_fs_t* req) {
#if defined(__linux__)
  static int no_preadv;
#endif
  ssize_t result;

#if defined(_AIX)
  struct stat buf;
  if(fstat(req->file, &buf))
    return -1;
  if(S_ISDIR(buf.st_mode)) {
    errno = EISDIR;
    return -1;
  }
#endif /* defined(_AIX) */
  if (req->off < 0) {
    if (req->nbufs == 1)
      result = read(req->file, req->bufs[0].base, req->bufs[0].len);
    else
      result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
  } else {
    if (req->nbufs == 1) {
      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
      goto done;
    }

#if HAVE_PREADV
    result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
    if (no_preadv) retry:
# endif
    {
      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    }
# if defined(__linux__)
    else {
      result = uv__preadv(req->file,
                          (struct iovec*)req->bufs,
                          req->nbufs,
                          req->off);
      if (result == -1 && errno == ENOSYS) {
        no_preadv = 1;
        goto retry;
      }
    }
# endif
#endif
  }

done:
  return result;
}
コード例 #3
0
ファイル: fs.c プロジェクト: 90lantran/node
static ssize_t uv__fs_read(uv_fs_t* req) {
    ssize_t result;

#if defined(_AIX)
    struct stat buf;
    if(fstat(req->file, &buf))
        return -1;
    if(S_ISDIR(buf.st_mode)) {
        errno = EISDIR;
        return -1;
    }
#endif /* defined(_AIX) */
    if (req->off < 0) {
        if (req->nbufs == 1)
            result = read(req->file, req->bufs[0].base, req->bufs[0].len);
        else
            result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
    } else {
        if (req->nbufs == 1) {
            result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
            goto done;
        }

#if HAVE_PREADV
        result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
        static int no_preadv;
        if (no_preadv)
# endif
        {
            off_t nread;
            size_t index;

# if defined(__linux__)
retry:
# endif
            nread = 0;
            index = 0;
            result = 1;
            do {
                if (req->bufs[index].len > 0) {
                    result = pread(req->file,
                                   req->bufs[index].base,
                                   req->bufs[index].len,
                                   req->off + nread);
                    if (result > 0)
                        nread += result;
                }
                index++;
            } while (index < req->nbufs && result > 0);
            if (nread > 0)
                result = nread;
        }
# if defined(__linux__)
        else {
            result = uv__preadv(req->file,
                                (struct iovec*)req->bufs,
                                req->nbufs,
                                req->off);
            if (result == -1 && errno == ENOSYS) {
                no_preadv = 1;
                goto retry;
            }
        }
# endif
#endif
    }

done:
    if (req->bufs != req->bufsml)
        free(req->bufs);
    return result;
}