Avoid SIGFPE in wordexp [BZ #18100]
[glibc.git] / posix / tst-pathconf.c
blob67f0069b65d3e29f35d33792186df7d495164d09
1 /* Test that values of pathconf and fpathconf are consistent for a file.
2 Copyright (C) 2013-2015 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
19 #include <fcntl.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <unistd.h>
26 static void prepare (void);
27 #define PREPARE(argc, argv) prepare ()
29 static int do_test (void);
30 #define TEST_FUNCTION do_test ()
32 #include "../test-skeleton.c"
34 static int dir_fd;
35 static char *dirbuf;
37 static void
38 prepare (void)
40 size_t test_dir_len = strlen (test_dir);
41 static const char dir_name[] = "/tst-pathconf.XXXXXX";
43 size_t dirbuflen = test_dir_len + sizeof (dir_name);
44 dirbuf = malloc (dirbuflen);
45 if (dirbuf == NULL)
47 puts ("Out of memory");
48 exit (1);
51 snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
52 if (mkdtemp (dirbuf) == NULL)
54 printf ("Cannot create temporary directory: %s\n", strerror (errno));
55 exit (1);
58 add_temp_file (dirbuf);
60 dir_fd = open (dirbuf, O_RDONLY);
61 if (dir_fd == -1)
63 printf ("Cannot open directory: %s\n", strerror (errno));
64 exit (1);
69 static int
70 do_test (void)
72 int ret = 0;
73 static const char *fifo_name = "some-fifo";
75 size_t filenamelen = strlen (dirbuf) + strlen (fifo_name) + 2;
76 char *filename = malloc (filenamelen);
78 snprintf (filename, filenamelen, "%s/%s", dirbuf, fifo_name);
80 /* Create a fifo in the directory. */
81 int e = mkfifo (filename, 0777);
82 if (e == -1)
84 printf ("fifo creation failed (%s)\n", strerror (errno));
85 ret = 1;
86 goto out_nofifo;
89 long dir_pathconf = pathconf (dirbuf, _PC_PIPE_BUF);
91 if (dir_pathconf < 0)
93 printf ("pathconf on directory failed: %s\n", strerror (errno));
94 ret = 1;
95 goto out_nofifo;
98 long fifo_pathconf = pathconf (filename, _PC_PIPE_BUF);
100 if (fifo_pathconf < 0)
102 printf ("pathconf on file failed: %s\n", strerror (errno));
103 ret = 1;
104 goto out_nofifo;
107 int fifo = open (filename, O_RDONLY | O_NONBLOCK);
109 if (fifo < 0)
111 printf ("fifo open failed (%s)\n", strerror (errno));
112 ret = 1;
113 goto out_nofifo;
116 long dir_fpathconf = fpathconf (dir_fd, _PC_PIPE_BUF);
118 if (dir_fpathconf < 0)
120 printf ("fpathconf on directory failed: %s\n", strerror (errno));
121 ret = 1;
122 goto out;
125 long fifo_fpathconf = fpathconf (fifo, _PC_PIPE_BUF);
127 if (fifo_fpathconf < 0)
129 printf ("fpathconf on file failed: %s\n", strerror (errno));
130 ret = 1;
131 goto out;
134 if (fifo_pathconf != fifo_fpathconf)
136 printf ("fifo pathconf (%ld) != fifo fpathconf (%ld)\n", fifo_pathconf,
137 fifo_fpathconf);
138 ret = 1;
139 goto out;
142 if (dir_pathconf != fifo_pathconf)
144 printf ("directory pathconf (%ld) != fifo pathconf (%ld)\n",
145 dir_pathconf, fifo_pathconf);
146 ret = 1;
147 goto out;
150 if (dir_fpathconf != fifo_fpathconf)
152 printf ("directory fpathconf (%ld) != fifo fpathconf (%ld)\n",
153 dir_fpathconf, fifo_fpathconf);
154 ret = 1;
155 goto out;
158 out:
159 close (fifo);
160 out_nofifo:
161 close (dir_fd);
163 if (unlink (filename) != 0)
165 printf ("Could not remove fifo (%s)\n", strerror (errno));
166 ret = 1;
169 if (rmdir (dirbuf) != 0)
171 printf ("Could not remove directory (%s)\n", strerror (errno));
172 ret = 1;
175 return ret;