libarchive: Implement custom lseek for Borland
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.
This commit is contained in:
parent
c37c0c7897
commit
ec48f10656
|
@ -64,6 +64,23 @@
|
||||||
|
|
||||||
#define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000)
|
#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 {
|
struct ustat {
|
||||||
int64_t st_atime;
|
int64_t st_atime;
|
||||||
uint32_t st_atime_nsec;
|
uint32_t st_atime_nsec;
|
||||||
|
@ -250,6 +267,40 @@ __la_fcntl(int fd, int cmd, int val)
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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. */
|
/* This can exceed MAX_PATH limitation. */
|
||||||
int
|
int
|
||||||
__la_open(const char *path, int flags, ...)
|
__la_open(const char *path, int flags, ...)
|
||||||
|
|
|
@ -95,7 +95,12 @@
|
||||||
#define fileno _fileno
|
#define fileno _fileno
|
||||||
#endif
|
#endif
|
||||||
#define fstat __la_fstat
|
#define fstat __la_fstat
|
||||||
|
#if !defined(__BORLANDC__)
|
||||||
#define lseek _lseeki64
|
#define lseek _lseeki64
|
||||||
|
#else
|
||||||
|
#define lseek __la_lseek
|
||||||
|
#define __LA_LSEEK_NEEDED
|
||||||
|
#endif
|
||||||
#define lstat __la_stat
|
#define lstat __la_stat
|
||||||
#define open __la_open
|
#define open __la_open
|
||||||
#define read __la_read
|
#define read __la_read
|
||||||
|
@ -246,6 +251,9 @@
|
||||||
extern int __la_fcntl(int fd, int cmd, int val);
|
extern int __la_fcntl(int fd, int cmd, int val);
|
||||||
extern int __la_fstat(int fd, struct stat *st);
|
extern int __la_fstat(int fd, struct stat *st);
|
||||||
extern int __la_lstat(const char *path, 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 int __la_open(const char *path, int flags, ...);
|
||||||
extern ssize_t __la_read(int fd, void *buf, size_t nbytes);
|
extern ssize_t __la_read(int fd, void *buf, size_t nbytes);
|
||||||
extern int __la_stat(const char *path, struct stat *st);
|
extern int __la_stat(const char *path, struct stat *st);
|
||||||
|
|
Loading…
Reference in New Issue