/* Check for a sim bug, whereby the position was always unsigned (truncation instead of sign-extension for 64-bit hosts). */ #include #include #include #include #include #include #include int main (void) { FILE *f; const char fname[] = "sk1test.dat"; const char tsttxt[] = "A random line of text, used to test correct read, write and seek.\n"; char buf[sizeof tsttxt] = ""; const char correct[] = "correct"; char buf2[sizeof correct] = {0}; int fd; f = fopen (fname, "wb"); if (f == NULL || fwrite (tsttxt, 1, strlen (tsttxt), f) != strlen (tsttxt) || fclose (f) != 0) { printf ("fail\n"); exit (1); } /* We have to use file-descriptor calls instead of stream calls to provoke the bug (for stream calls, the lseek call is canonicalized to use SEEK_SET). */ fd = open (fname, O_RDONLY); if (fd < 0 || read (fd, buf, strlen (tsttxt)) != strlen (tsttxt) || strcmp (buf, tsttxt) != 0 || lseek (fd, -30L, SEEK_CUR) != 36 || read (fd, buf2, strlen (correct)) != strlen (correct) || strcmp (buf2, correct) != 0) { printf ("fail\n"); exit (1); } printf ("pass\n"); exit (0); }