Il 01/01/2013 14:36, Riccardo Magliocchetti ha scritto:
Hello,

does anyone know why linux and solaris are using pread / pwrite syscalls
while other unixes are using read + lseek? The code is at least
FileHandle_Impl::writeAt which AFAIU is the base for the osl_* file
functions.

[snip]
If the idea is sound i can cook a patch, but i'd like to have some
feedback from *BSD / MacOS X people that will compile the new code path.

Patch attached if anyone on these plaforms want to give it a try.

thanks,
riccardo
>From b574788b119f62e0446eb66d78cf99c21f1ca58f Mon Sep 17 00:00:00 2001
From: Riccardo Magliocchetti <riccardo.magliocche...@gmail.com>
Date: Wed, 2 Jan 2013 11:54:08 +0100
Subject: [PATCH] sal: use pread / pwrite on every *nix

pread / pwrite don't look as a Linux and Solaris privilege.

Change-Id: Ifb2e88445d4064c13a406007bfd523ae0caa38e5
---
 sal/osl/unx/file.cxx |   36 ------------------------------------
 1 file changed, 36 deletions(-)

diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx
index 2f1a99a..d1840a3 100644
--- a/sal/osl/unx/file.cxx
+++ b/sal/osl/unx/file.cxx
@@ -379,8 +379,6 @@ oslFileError FileHandle_Impl::readAt (
         return osl_File_E_None;
     }
 
-#if defined(LINUX) || defined(SOLARIS)
-
     ssize_t nBytes = ::pread (m_fd, pBuffer, nBytesRequested, nOffset);
     if ((-1 == nBytes) && (EOVERFLOW == errno))
     {
@@ -393,22 +391,6 @@ oslFileError FileHandle_Impl::readAt (
     if (-1 == nBytes)
         return oslTranslateFileError (OSL_FET_ERROR, errno);
 
-#else /* !(LINUX || SOLARIS) */
-
-    if (nOffset != m_offset)
-    {
-        if (-1 == ::lseek (m_fd, nOffset, SEEK_SET))
-            return oslTranslateFileError (OSL_FET_ERROR, errno);
-        m_offset = nOffset;
-    }
-
-    ssize_t nBytes = ::read (m_fd, pBuffer, nBytesRequested);
-    if (-1 == nBytes)
-        return oslTranslateFileError (OSL_FET_ERROR, errno);
-    m_offset += nBytes;
-
-#endif /* !(LINUX || SOLARIS) */
-
     OSL_FILE_TRACE("FileHandle_Impl::readAt(%d, %lld, %ld)", m_fd, nOffset, nBytes);
     *pBytesRead = nBytes;
     return osl_File_E_None;
@@ -428,28 +410,10 @@ oslFileError FileHandle_Impl::writeAt (
     if (!(m_state & STATE_WRITEABLE))
         return osl_File_E_BADF;
 
-#if defined(LINUX) || defined(SOLARIS)
-
     ssize_t nBytes = ::pwrite (m_fd, pBuffer, nBytesToWrite, nOffset);
     if (-1 == nBytes)
         return oslTranslateFileError (OSL_FET_ERROR, errno);
 
-#else /* !(LINUX || SOLARIS) */
-
-    if (nOffset != m_offset)
-    {
-        if (-1 == ::lseek (m_fd, nOffset, SEEK_SET))
-            return oslTranslateFileError (OSL_FET_ERROR, errno);
-        m_offset = nOffset;
-    }
-
-    ssize_t nBytes = ::write (m_fd, pBuffer, nBytesToWrite);
-    if (-1 == nBytes)
-        return oslTranslateFileError (OSL_FET_ERROR, errno);
-    m_offset += nBytes;
-
-#endif /* !(LINUX || SOLARIS) */
-
     OSL_FILE_TRACE("FileHandle_Impl::writeAt(%d, %lld, %ld)", m_fd, nOffset, nBytes);
     m_size = std::max (m_size, sal::static_int_cast< sal_uInt64 >(nOffset + nBytes));
 
-- 
1.7.10.4

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to