fclose (fp);  #ifdef USE_IN_LIBIO fp = fopen (fname, "r"); if (fp == NULL) { puts ("fopen() failed\n"); result = 1; } else if (fstat64 (fileno (fp), &st1) < 0) { puts ("fstat64() before fseeko() failed\n"); result = 1; } else if (fseeko (fp, 0, SEEK_END) != 0) { puts ("fseeko(fp, 0, SEEK_END) failed"); result = 1; } else if (ftello (fp) != st1.st_size) { printf ("fstat64 st_size %zd ftello %zd\n", st1.st_size, ftello (fp)); result = 1; } else puts ("SEEK_END works"); if (fp != NULL) fclose (fp);  fp = fopen (fname, "r"); if (fp == NULL) { puts ("fopen() failed\n"); result = 1; } else if (fstat64 (fileno (fp), &st1) < 0) { puts ("fstat64() before fgetc() failed\n"); result = 1; } else if (fgetc (fp) == EOF) { puts ("fgetc() before fseeko() failed\n"); result = 1; } else if (fseeko (fp, 0, SEEK_END) != 0) { puts ("fseeko(fp, 0, SEEK_END) failed"); result = 1; } else if (ftello (fp) != st1.st_size) { printf ("fstat64 st_size %zd ftello %zd\n", st1.st_size, ftello (fp)); result = 1; } else puts ("SEEK_END works"); if (fp != NULL) fclose (fp); #endif
main (void){  const char *tmpdir;  char *fname;  int fd;  FILE *fp;  const char outstr[] = "hello world!\n";  char strbuf[sizeof outstr];  char buf[200];  struct stat64 st1;  struct stat64 st2;  int result = 0;  tmpdir = getenv ("TMPDIR");  if (tmpdir == NULL || tmpdir[0] == '\0')    tmpdir = "/tmp";  asprintf (&fname, "%s/tst-fseek.XXXXXX", tmpdir);  if (fname == NULL)    error (EXIT_FAILURE, errno, "cannot generate name for temporary file");  /* Create a temporary file.   */  fd = mkstemp (fname);  if (fd == -1)    error (EXIT_FAILURE, errno, "cannot open temporary file");  fp = fdopen (fd, "w+");  if (fp == NULL)    error (EXIT_FAILURE, errno, "cannot get FILE for temporary file");  setbuffer (fp, strbuf, sizeof (outstr) -1);  if (fwrite (outstr, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("write error");      result = 1;      goto out;    }  /* The EOF flag must be reset.  */  if (fgetc (fp) != EOF)    {      puts ("managed to read at end of file");      result = 1;    }  else if (! feof (fp))    {      puts ("EOF flag not set");      result = 1;    }  if (fseek (fp, 0, SEEK_CUR) != 0)    {      puts ("fseek(fp, 0, SEEK_CUR) failed");      result = 1;    }  else if (feof (fp))    {      puts ("fseek() didn't reset EOF flag");      result = 1;    }  /* Do the same for fseeko().  */#ifdef USE_IN_LIBIO    if (fgetc (fp) != EOF)    {      puts ("managed to read at end of file");      result = 1;    }  else if (! feof (fp))    {      puts ("EOF flag not set");      result = 1;    }  if (fseeko (fp, 0, SEEK_CUR) != 0)    {      puts ("fseek(fp, 0, SEEK_CUR) failed");      result = 1;    }  else if (feof (fp))    {      puts ("fseek() didn't reset EOF flag");      result = 1;    }#endif  /* Go back to the beginning of the file: absolute.  */  if (fseek (fp, 0, SEEK_SET) != 0)    {      puts ("fseek(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseek(,,SEEK_SET) wrong");      result = 1;    }#ifdef USE_IN_LIBIO  /* Now with fseeko.  */  if (fseeko (fp, 0, SEEK_SET) != 0)    {      puts ("fseeko(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseeko(,,SEEK_SET) wrong");      result = 1;    }#endif  /* Go back to the beginning of the file: relative.  */  if (fseek (fp, -(sizeof (outstr) - 1), SEEK_CUR) != 0)    {      puts ("fseek(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseek(,,SEEK_SET) wrong");      result = 1;    }#ifdef USE_IN_LIBIO  /* Now with fseeko.  */  if (fseeko (fp, -(sizeof (outstr) - 1), SEEK_CUR) != 0)    {      puts ("fseeko(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseeko(,,SEEK_SET) wrong");      result = 1;    }#endif  /* Go back to the beginning of the file: from the end.  */  if (fseek (fp, -(sizeof (outstr) - 1), SEEK_END) != 0)    {      puts ("fseek(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseek(,,SEEK_SET) wrong");      result = 1;    }#ifdef USE_IN_LIBIO  /* Now with fseeko.  */  if (fseeko (fp, -(sizeof (outstr) - 1), SEEK_END) != 0)    {      puts ("fseeko(fp, 0, SEEK_SET) failed");      result = 1;    }  else if (fflush (fp) != 0)    {      puts ("fflush() failed");      result = 1;    }  else if (lseek (fd, 0, SEEK_CUR) != 0)    {      puts ("lseek() returned different position");      result = 1;    }  else if (fread (buf, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("fread() failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0)    {      puts ("content after fseeko(,,SEEK_SET) wrong");      result = 1;    }#endif  if (fwrite (outstr, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("write error 2");      result = 1;      goto out;    }  if (fwrite (outstr, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("write error 3");      result = 1;      goto out;    }  if (fwrite (outstr, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("write error 4");      result = 1;      goto out;    }  if (fwrite (outstr, sizeof (outstr) - 1, 1, fp) != 1)    {      puts ("write error 5");      result = 1;      goto out;    }  if (fputc ('1', fp) == EOF || fputc ('2', fp) == EOF)    {      puts ("cannot add characters at the end");      result = 1;      goto out;    }  /* Check the access time.  */  if (fstat64 (fd, &st1) < 0)    {      puts ("fstat64() before fseeko() failed\n");      result = 1;    }  else    {      sleep (1);      if (fseek (fp, -(2 + 2 * (sizeof (outstr) - 1)), SEEK_CUR) != 0)	{	  puts ("fseek() after write characters failed");	  result = 1;	  goto out;	}      else	{	  time_t t;	  /* Make sure the timestamp actually can be different.  */	  sleep (1);	  t = time (NULL);	  if (fstat64 (fd, &st2) < 0)	    {	      puts ("fstat64() after fseeko() failed\n");	      result = 1;	    }	  if (st1.st_ctime >= t)	    {	      puts ("st_ctime not updated");	      result = 1;	    }	  if (st1.st_mtime >= t)	    {	      puts ("st_mtime not updated");	      result = 1;	    }	  if (st1.st_ctime >= st2.st_ctime)	    {	      puts ("st_ctime not changed");	      result = 1;	    }	  if (st1.st_mtime >= st2.st_mtime)	    {	      puts ("st_mtime not changed");	      result = 1;	    }	}    }  if (fread (buf, 1, 2 + 2 * (sizeof (outstr) - 1), fp)      != 2 + 2 * (sizeof (outstr) - 1))    {      puts ("reading 2 records plus bits failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0	   || memcmp (&buf[sizeof (outstr) - 1], outstr,		      sizeof (outstr) - 1) != 0	   || buf[2 * (sizeof (outstr) - 1)] != '1'	   || buf[2 * (sizeof (outstr) - 1) + 1] != '2')    {      puts ("reading records failed");      result = 1;    }  else if (ungetc ('9', fp) == EOF)    {      puts ("ungetc() failed");      result = 1;    }  else if (fseek (fp, -(2 + 2 * (sizeof (outstr) - 1)), SEEK_END) != 0)    {      puts ("fseek after ungetc failed");      result = 1;    }  else if (fread (buf, 1, 2 + 2 * (sizeof (outstr) - 1), fp)      != 2 + 2 * (sizeof (outstr) - 1))    {      puts ("reading 2 records plus bits failed");      result = 1;    }  else if (memcmp (buf, outstr, sizeof (outstr) - 1) != 0	   || memcmp (&buf[sizeof (outstr) - 1], outstr,		      sizeof (outstr) - 1) != 0	   || buf[2 * (sizeof (outstr) - 1)] != '1')    {      puts ("reading records for the second time failed");      result = 1;    }  else if (buf[2 * (sizeof (outstr) - 1) + 1] == '9')    {      puts ("unget character not ignored");      result = 1;    }  else if (buf[2 * (sizeof (outstr) - 1) + 1] != '2')    {      puts ("unget somehow changed character");      result = 1;    } out:  unlink (fname);  return result;}