[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mingw lseek bug
From: |
Bruno Haible |
Subject: |
Re: mingw lseek bug |
Date: |
Thu, 24 May 2007 12:56:20 +0200 |
User-agent: |
KMail/1.5.4 |
Eric Blake wrote:
> I just noticed that lseek on mingw returns 0 instead of -1 on pipes.
> Which means that gnulib's fflush module thinks the pipe is seekable, and
> loses data in the pipe instead of behaving as a no-op as it should in
> trying to reposition the pipe's location.
Indeed, lseek on pipes in mingw appears to work if you go past the end
(see attached test) but not for backing up data that has already been
sucked into the process.
Maybe you can swap the lseek and fpurge calls in fflush.c?
Or, if that doesn't work, try lseek, then do fpurge, then do fseek again just
to be sure?
Bruno
================================ lseek-test.c ==============================
#include <windows.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
static const char *typestring (int type)
{
if (type == FILE_TYPE_DISK) return "FILE_TYPE_DISK";
if (type == FILE_TYPE_CHAR) return "FILE_TYPE_CHAR";
if (type == FILE_TYPE_PIPE) return "FILE_TYPE_PIPE";
if (type == FILE_TYPE_UNKNOWN) return "FILE_TYPE_UNKNOWN";
return "UNKNOWN";
}
int main ()
{
{
int fd = 0;
int type = GetFileType ((HANDLE) _get_osfhandle (fd));
off_t lseek0 = lseek (fd, 0, SEEK_CUR);
off_t lseek1 = lseek (fd, 1, SEEK_CUR);
off_t lseek2 = lseek (fd, -2, SEEK_CUR);
printf("stdin: %s %ld %ld %ld\n", typestring (type), lseek0, lseek1,
lseek2);
}
{
int fd = 1;
int type = GetFileType ((HANDLE) _get_osfhandle (fd));
off_t lseek0 = lseek (fd, 0, SEEK_CUR);
off_t lseek1 = lseek (fd, 1, SEEK_CUR);
off_t lseek2 = lseek (fd, -2, SEEK_CUR);
printf("stdout: %s %ld %ld %ld\n", typestring (type), lseek0, lseek1,
lseek2);
}
return 0;
}
/* Console window:
stdin: FILE_TYPE_CHAR -1 -1 -1
stdout: FILE_TYPE_CHAR -1 -1 -1
Console window, pipes:
stdin: FILE_TYPE_PIPE 0 1 -1
stdout: FILE_TYPE_PIPE 0 1 -1
rxvt window:
stdin: FILE_TYPE_PIPE 0 1 -1
stdout: FILE_TYPE_PIPE 0 1 -1
rxvt window, pipes:
stdin: FILE_TYPE_PIPE 0 1 -1
stdout: FILE_TYPE_PIPE 0 1 -1
stdin, stdout redirected to files:
stdin: FILE_TYPE_DISK 0 1 -1
stdout: FILE_TYPE_PIPE 0 1 -1
*/
- Re: mingw lseek bug, (continued)
- Re: mingw lseek bug, Eric Blake, 2007/05/28
- Re: mingw lseek bug, Bruno Haible, 2007/05/28
- Re: mingw lseek bug, Bruno Haible, 2007/05/28
- Re: mingw lseek bug, Eric Blake, 2007/05/28
- Re: mingw lseek bug, Bruno Haible, 2007/05/28
- Re: mingw lseek bug, Eric Blake, 2007/05/28
- Re: mingw lseek bug, Bruno Haible, 2007/05/28
- Re: mingw lseek bug, Bruno Haible, 2007/05/28
- new module 'fseek' (Re: mingw lseek bug), Bruno Haible, 2007/05/28
- new module 'ftell' (was: Re: mingw lseek bug), Bruno Haible, 2007/05/28
- Re: mingw lseek bug,
Bruno Haible <=