From: Tim Kientzle Date: Sat, 3 Jan 2009 05:54:28 +0000 (-0500) Subject: Fix error handling. I was mistaken to use _dosmapper() function. X-Git-Tag: v2.7.0~486 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30eebaf048705ccc94c533565500f40030def66c;p=thirdparty%2Flibarchive.git Fix error handling. I was mistaken to use _dosmapper() function. - Michihiro NAKAJIMA SVN-Revision: 359 --- diff --git a/libarchive/archive_windows.c b/libarchive/archive_windows.c index 31a080c38..bb02942c2 100644 --- a/libarchive/archive_windows.c +++ b/libarchive/archive_windows.c @@ -235,15 +235,28 @@ 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((HANDLE)_get_osfhandle(fd), distance, - &newpointer, whence)) { - errno = _dosmaperr(GetLastError()); + if (!SetFilePointerEx(handle, distance, &newpointer, whence)) { + DWORD lasterr; + + lasterr = GetLastError(); + if (lasterr == ERROR_BROKEN_PIPE) + return (0); + if (lasterr == ERROR_ACCESS_DENIED) + errno = EBADF; + else + _dosmaperr(lasterr); return (-1); } return (newpointer.QuadPart); @@ -280,7 +293,13 @@ la_write(int fd, const void *buf, size_t nbytes) } if (!WriteFile((HANDLE)_get_osfhandle(fd), buf, (uint32_t)nbytes, &bytes_written, NULL)) { - errno = _dosmaperr(GetLastError()); + DWORD lasterr; + + lasterr = GetLastError(); + if (lasterr == ERROR_ACCESS_DENIED) + errno = EBADF; + else + _dosmaperr(lasterr); return (-1); } return (bytes_written);