]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Implement custom lseek for Borland
authorBrad King <brad.king@kitware.com>
Wed, 11 Jan 2012 13:15:03 +0000 (08:15 -0500)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Sat, 17 Mar 2012 20:02:37 +0000 (05:02 +0900)
Restore Windows 64-bit lseek removed by upstream svn revision 3826
(Cast away __la_lseek(), use _lseeki64() instead, 2011-11-21).  We
need it on Borland.

SVN-Revision: 4125

libarchive/archive_windows.c
libarchive/archive_windows.h

index 18c26c7a4a717338b09301b18aeff34cd721b96c..15bdeb90e7890ff24502422be90650394ed2f203 100644 (file)
 
 #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000)
 
+#if defined(__LA_LSEEK_NEEDED)
+static BOOL SetFilePointerEx_perso(HANDLE hFile,
+                                  LARGE_INTEGER liDistanceToMove,
+                                  PLARGE_INTEGER lpNewFilePointer,
+                                  DWORD dwMoveMethod)
+{
+       LARGE_INTEGER li;
+       li.QuadPart = liDistanceToMove.QuadPart;
+       li.LowPart = SetFilePointer(
+               hFile, li.LowPart, &li.HighPart, dwMoveMethod);
+       if(lpNewFilePointer) {
+               lpNewFilePointer->QuadPart = li.QuadPart;
+       }
+       return li.LowPart != -1 || GetLastError() == NO_ERROR;
+}
+#endif
+
 struct ustat {
        int64_t         st_atime;
        uint32_t        st_atime_nsec;
@@ -235,6 +252,40 @@ la_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode,
        return (handle);
 }
 
+#if defined(__LA_LSEEK_NEEDED)
+__int64
+__la_lseek(int fd, __int64 offset, int whence)
+{
+       LARGE_INTEGER distance;
+       LARGE_INTEGER newpointer;
+       HANDLE handle;
+
+       if (fd < 0) {
+               errno = EBADF;
+               return (-1);
+       }
+       handle = (HANDLE)_get_osfhandle(fd);
+       if (GetFileType(handle) != FILE_TYPE_DISK) {
+               errno = EBADF;
+               return (-1);
+       }
+       distance.QuadPart = offset;
+       if (!SetFilePointerEx_perso(handle, distance, &newpointer, whence)) {
+               DWORD lasterr;
+
+               lasterr = GetLastError();
+               if (lasterr == ERROR_BROKEN_PIPE)
+                       return (0);
+               if (lasterr == ERROR_ACCESS_DENIED)
+                       errno = EBADF;
+               else
+                       la_dosmaperr(lasterr);
+               return (-1);
+       }
+       return (newpointer.QuadPart);
+}
+#endif
+
 /* This can exceed MAX_PATH limitation. */
 int
 __la_open(const char *path, int flags, ...)
index f351f120d8620fc60efac2d9ef162330adba3693..df62dce7c99860294267431c2c41ae15bab427b5 100644 (file)
 #define        fileno          _fileno
 #endif
 #define        fstat           __la_fstat
+#if !defined(__BORLANDC__)
 #define        lseek           _lseeki64
+#else
+#define        lseek           __la_lseek
+#define __LA_LSEEK_NEEDED
+#endif
 #define        lstat           __la_stat
 #define        open            __la_open
 #define        read            __la_read
 /* Replacement POSIX function */
 extern int      __la_fstat(int fd, struct stat *st);
 extern int      __la_lstat(const char *path, struct stat *st);
+#if defined(__LA_LSEEK_NEEDED)
+extern __int64  __la_lseek(int fd, __int64 offset, int whence);
+#endif
 extern int      __la_open(const char *path, int flags, ...);
 extern ssize_t  __la_read(int fd, void *buf, size_t nbytes);
 extern int      __la_stat(const char *path, struct stat *st);