]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix error handling. I was mistaken to use _dosmapper() function.
authorTim Kientzle <kientzle@gmail.com>
Sat, 3 Jan 2009 05:54:28 +0000 (00:54 -0500)
committerTim Kientzle <kientzle@gmail.com>
Sat, 3 Jan 2009 05:54:28 +0000 (00:54 -0500)
                              - Michihiro NAKAJIMA

SVN-Revision: 359

libarchive/archive_windows.c

index 31a080c381ee1fb3a7c718edbcf5554303254873..bb02942c27c3ef1dd12e9f04f72d1e45ba425d3d 100644 (file)
@@ -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);