lseek(2) problems
VOROSKOI Andras
voroskoi at gmail.com
Sun Jun 1 16:40:21 PDT 2008
Hi,
Today I've tried to send in Matt's gnulib patch to upstream with more of
less luck.
As for now http://www.haible.de/bruno/gnu/testdir-stdioext.tar.gz
compiles fine, but one of the test fails.
http://article.gmane.org/gmane.comp.lib.gnulib.bugs/13713
According to Bruno it's a bug in out lseek implementation and
http://www.opengroup.org/onlinepubs/000095399/functions/lseek.html
contains the following:
The POSIX.1-1990 standard did not specifically prohibit lseek() from
returning a negative offset. Therefore, an application was required to
clear errno prior to the call and check errno upon return to determine
whether a return value of ( off_t)-1 is a negative offset or an
indication of an error condition. The standard developers did not wish
to require this action on the part of a conforming application, and
chose to require that errno be set to [EINVAL] when the resulting file
offset would be negative for a regular file, block special file, or
directory.
You can download the testcase if you want, but I also attach a simple
testcase. Let me know what do you think about it.
--
voroskoi
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#define ASSERT(expr) \
do \
{ \
if (!(expr)) \
{ \
fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
fflush (stderr); \
abort (); \
} \
} \
while (0)
int main(void) {
ASSERT (lseek (0, (off_t)-4, SEEK_CUR) == -1);
ASSERT (errno == EINVAL);
errno = 0;
ASSERT (lseek (1, (off_t)-4, SEEK_CUR) == -1);
ASSERT (errno == EINVAL);
errno = 0;
}
More information about the Users
mailing list