relocatable-prog: fix link error
[gnulib.git] / tests / test-fclose.c
1 /* Test of fclose module.
2    Copyright (C) 2011 Free Software Foundation, Inc.
3
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)
7    any later version.
8
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.
13
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.  */
17
18 /* Written by Eric Blake.  */
19
20 #include <config.h>
21
22 #include <stdio.h>
23
24 #include "signature.h"
25 SIGNATURE_CHECK (fclose, int, (FILE *));
26
27 #include <errno.h>
28 #include <fcntl.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <unistd.h>
32
33 #include "macros.h"
34
35 #define BASE "test-fclose.t"
36
37 int
38 main (int argc, char **argv)
39 {
40   const char buf[] = "hello world";
41   int fd;
42   int fd2;
43   FILE *f;
44
45   /* Prepare a seekable file.  */
46   fd = open (BASE, O_RDWR | O_CREAT | O_TRUNC, 0600);
47   ASSERT (0 <= fd);
48   ASSERT (write (fd, buf, sizeof buf) == sizeof buf);
49   ASSERT (lseek (fd, 1, SEEK_SET) == 1);
50
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
53      position.  */
54   fd2 = dup (fd);
55   ASSERT (0 <= fd2);
56   f = fdopen (fd2, "w");
57   ASSERT (f);
58   ASSERT (fputc (buf[1], f) == buf[1]);
59   ASSERT (fclose (f) == 0);
60   errno = 0;
61   ASSERT (lseek (fd2, 0, SEEK_CUR) == -1);
62   ASSERT (errno == EBADF);
63   ASSERT (lseek (fd, 0, SEEK_CUR) == 2);
64
65   /* Likewise for an input stream.  */
66   fd2 = dup (fd);
67   ASSERT (0 <= fd2);
68   f = fdopen (fd2, "r");
69   ASSERT (f);
70   ASSERT (fgetc (f) == buf[2]);
71   ASSERT (fclose (f) == 0);
72   errno = 0;
73   ASSERT (lseek (fd2, 0, SEEK_CUR) == -1);
74   ASSERT (errno == EBADF);
75   ASSERT (lseek (fd, 0, SEEK_CUR) == 3);
76
77   /* Test that fclose() sets errno if someone else closes the stream
78      fd behind the back of stdio.  */
79   f = fdopen (fd, "w+");
80   ASSERT (f);
81   ASSERT (close (fd) == 0);
82   errno = 0;
83   ASSERT (fclose (f) == EOF);
84   ASSERT (errno == EBADF);
85
86   /* Clean up.  */
87   ASSERT (remove (BASE) == 0);
88
89   return 0;
90 }