1 /* Test of fclose module.
2 Copyright (C) 2011 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Eric Blake. */
24 #include "signature.h"
25 SIGNATURE_CHECK (fclose, int, (FILE *));
35 #define BASE "test-fclose.t"
38 main (int argc, char **argv)
40 const char buf[] = "hello world";
45 /* Prepare a seekable file. */
46 fd = open (BASE, O_RDWR | O_CREAT | O_TRUNC, 0600);
48 ASSERT (write (fd, buf, sizeof buf) == sizeof buf);
49 ASSERT (lseek (fd, 1, SEEK_SET) == 1);
51 /* Create an output stream visiting the file; when it is closed, all
52 other file descriptors visiting the file must see the new file
56 f = fdopen (fd2, "w");
58 ASSERT (fputc (buf[1], f) == buf[1]);
59 ASSERT (fclose (f) == 0);
61 ASSERT (lseek (fd2, 0, SEEK_CUR) == -1);
62 ASSERT (errno == EBADF);
63 ASSERT (lseek (fd, 0, SEEK_CUR) == 2);
66 /* Likewise for an input stream, but only when we know fflush works
70 f = fdopen (fd2, "r");
72 ASSERT (fgetc (f) == buf[2]);
73 ASSERT (fclose (f) == 0);
75 ASSERT (lseek (fd2, 0, SEEK_CUR) == -1);
76 ASSERT (errno == EBADF);
77 ASSERT (lseek (fd, 0, SEEK_CUR) == 3);
80 /* Test that fclose() sets errno if someone else closes the stream
81 fd behind the back of stdio. */
82 f = fdopen (fd, "w+");
84 ASSERT (close (fd) == 0);
86 ASSERT (fclose (f) == EOF);
87 ASSERT (errno == EBADF);
90 ASSERT (remove (BASE) == 0);