bool ZipFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(m_gzFile); if (whence == SEEK_CUR) { off_t result = gzseek(m_gzFile, 0, SEEK_CUR); if (result != (off_t)-1) { offset += result - (bufferedLen() + getPosition()); } if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); setEof(false); flush(); off_t result = gzseek(m_gzFile, offset, whence); setPosition(result); return result != (off_t)-1; }
bool PlainFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assert(valid()); if (whence == SEEK_CUR) { off_t result = lseek(getFd(), 0, SEEK_CUR); if (result != (off_t)-1) { offset += result - (bufferedLen() + getPosition()); } if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); // clear the eof flag setEof(false); flush(); // lseek instead of seek to be consistent with read off_t result = lseek(getFd(), offset, whence); setPosition(result); return result != (off_t)-1; }
bool PlainFile::eof() { assert(valid()); int64_t avail = bufferedLen(); if (avail > 0) { return false; } return getEof(); }
bool MemFile::eof() { assertx(m_len != -1); int64_t avail = bufferedLen(); if (avail > 0) { return false; } return m_cursor == m_len; }
bool UserFile::eof() { // If there's data in the read buffer, then we're clearly not EOF if (bufferedLen() > 0) { return false; } // bool stream_eof() bool invoked = false; Variant ret = invoke(m_StreamEof, s_stream_eof, Array::Create(), invoked); if (!invoked) { return false; } return ret.isBoolean() ? ret.toBoolean() : true; }
bool MemFile::seek(int64_t offset, int whence /* = SEEK_SET */) { assertx(m_len != -1); if (whence == SEEK_CUR) { if (offset > 0 && offset < bufferedLen()) { setReadPosition(getReadPosition() + offset); setPosition(getPosition() + offset); return true; } offset += getPosition(); whence = SEEK_SET; } // invalidate the current buffer setWritePosition(0); setReadPosition(0); if (whence == SEEK_SET) { m_cursor = offset; } else { assertx(whence == SEEK_END); m_cursor = m_len + offset; } setPosition(m_cursor); return true; }
Variant HHVM_FUNCTION(socket_select, VRefParam read, VRefParam write, VRefParam except, const Variant& vtv_sec, int tv_usec /* = 0 */) { int count = 0; if (!read.isNull()) { count += read.toArray().size(); } if (!write.isNull()) { count += write.toArray().size(); } if (!except.isNull()) { count += except.toArray().size(); } if (!count) { return false; } struct pollfd *fds = (struct pollfd *)calloc(count, sizeof(struct pollfd)); count = 0; if (!read.isNull()) { sock_array_to_fd_set(read.toArray(), fds, count, POLLIN); } if (!write.isNull()) { sock_array_to_fd_set(write.toArray(), fds, count, POLLOUT); } if (!except.isNull()) { sock_array_to_fd_set(except.toArray(), fds, count, POLLPRI); } if (!count) { raise_warning("no resource arrays were passed to select"); free(fds); return false; } IOStatusHelper io("socket_select"); int timeout_ms = -1; if (!vtv_sec.isNull()) { timeout_ms = vtv_sec.toInt32() * 1000 + tv_usec / 1000; } /* slight hack to support buffered data; if there is data sitting in the * read buffer of any of the streams in the read array, let's pretend * that we selected, but return only the readable sockets */ if (!read.isNull()) { auto hasData = Array::Create(); for (ArrayIter iter(read.toArray()); iter; ++iter) { auto file = cast<File>(iter.second()); if (file->bufferedLen() > 0) { hasData.append(iter.second()); } } if (hasData.size() > 0) { if (!write.isNull()) { write = empty_array(); } if (!except.isNull()) { except = empty_array(); } read = hasData; free(fds); return hasData.size(); } } int retval = poll(fds, count, timeout_ms); if (retval == -1) { raise_warning("unable to select [%d]: %s", errno, folly::errnoStr(errno).c_str()); free(fds); return false; } count = 0; int nfds = 0; if (!read.isNull()) { sock_array_from_fd_set(read, fds, nfds, count, POLLIN|POLLERR|POLLHUP); } if (!write.isNull()) { sock_array_from_fd_set(write, fds, nfds, count, POLLOUT|POLLERR); } if (!except.isNull()) { sock_array_from_fd_set(except, fds, nfds, count, POLLPRI|POLLERR); } free(fds); return count; }
bool ZipFile::eof() { assert(m_gzFile); int64_t avail = bufferedLen(); return avail > 0 ? false : getEof(); }