Пример #1
0
ssize_t eRawFile::read(off_t offset, void *buf, size_t count)
{
	eSingleLocker l(m_lock);

	if (offset != m_current_offset)
	{
		m_current_offset = lseek_internal(offset);
		if (m_current_offset < 0)
			return m_current_offset;
	}

	switchOffset(m_current_offset);

	if (m_nrfiles >= 2)
	{
		if (m_current_offset + count > m_totallength)
			count = m_totallength - m_current_offset;
		if (count < 0)
			return 0;
	}
	
	int ret;
	
	ret = ::read(m_fd, buf, count);

	if (ret > 0)
	{
		m_current_offset = m_last_offset += ret;
	}
	return ret;
}
Пример #2
0
ssize_t eRawFile::read(void *buf, size_t count)
{
//	eDebug("read: %p, %d", buf, count);
	switchOffset(m_current_offset);
	
	if (m_nrfiles >= 2)
	{
		if (m_current_offset + count > m_totallength)
			count = m_totallength - m_current_offset;
		if (count < 0)
			return 0;
	}
	
	int ret;
	
	if (!m_cached)
		ret = ::read(m_fd, buf, count);
	else
		ret = ::fread(buf, 1, count, m_file);

	if (ret > 0)
		m_current_offset = m_last_offset += ret;
	return ret;
}