Add __ASSUME_DIRECT_SYSVIPC_SYSCALL for Linux
[glibc.git] / posix / tst-pathconf.c
blob4f51ae8c2d493f6aa14e4c03760562965e41524c
1 /* Test that values of pathconf and fpathconf are consistent for a file.
2 Copyright (C) 2013-2016 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 = xmalloc (dirbuflen);
46 snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
47 if (mkdtemp (dirbuf) == NULL)
49 printf ("Cannot create temporary directory: %s\n", strerror (errno));
50 exit (1);
53 add_temp_file (dirbuf);
55 dir_fd = open (dirbuf, O_RDONLY);
56 if (dir_fd == -1)
58 printf ("Cannot open directory: %s\n", strerror (errno));
59 exit (1);
64 static int
65 do_test (void)
67 int ret = 0;
68 static const char *fifo_name = "some-fifo";
70 size_t filenamelen = strlen (dirbuf) + strlen (fifo_name) + 2;
71 char *filename = xmalloc (filenamelen);
73 snprintf (filename, filenamelen, "%s/%s", dirbuf, fifo_name);
75 /* Create a fifo in the directory. */
76 int e = mkfifo (filename, 0777);
77 if (e == -1)
79 printf ("fifo creation failed (%s)\n", strerror (errno));
80 ret = 1;
81 goto out_nofifo;
84 long dir_pathconf = pathconf (dirbuf, _PC_PIPE_BUF);
86 if (dir_pathconf < 0)
88 printf ("pathconf on directory failed: %s\n", strerror (errno));
89 ret = 1;
90 goto out_nofifo;
93 long fifo_pathconf = pathconf (filename, _PC_PIPE_BUF);
95 if (fifo_pathconf < 0)
97 printf ("pathconf on file failed: %s\n", strerror (errno));
98 ret = 1;
99 goto out_nofifo;
102 int fifo = open (filename, O_RDONLY | O_NONBLOCK);
104 if (fifo < 0)
106 printf ("fifo open failed (%s)\n", strerror (errno));
107 ret = 1;
108 goto out_nofifo;
111 long dir_fpathconf = fpathconf (dir_fd, _PC_PIPE_BUF);
113 if (dir_fpathconf < 0)
115 printf ("fpathconf on directory failed: %s\n", strerror (errno));
116 ret = 1;
117 goto out;
120 long fifo_fpathconf = fpathconf (fifo, _PC_PIPE_BUF);
122 if (fifo_fpathconf < 0)
124 printf ("fpathconf on file failed: %s\n", strerror (errno));
125 ret = 1;
126 goto out;
129 if (fifo_pathconf != fifo_fpathconf)
131 printf ("fifo pathconf (%ld) != fifo fpathconf (%ld)\n", fifo_pathconf,
132 fifo_fpathconf);
133 ret = 1;
134 goto out;
137 if (dir_pathconf != fifo_pathconf)
139 printf ("directory pathconf (%ld) != fifo pathconf (%ld)\n",
140 dir_pathconf, fifo_pathconf);
141 ret = 1;
142 goto out;
145 if (dir_fpathconf != fifo_fpathconf)
147 printf ("directory fpathconf (%ld) != fifo fpathconf (%ld)\n",
148 dir_fpathconf, fifo_fpathconf);
149 ret = 1;
150 goto out;
153 out:
154 close (fifo);
155 out_nofifo:
156 close (dir_fd);
158 if (unlink (filename) != 0)
160 printf ("Could not remove fifo (%s)\n", strerror (errno));
161 ret = 1;
164 if (rmdir (dirbuf) != 0)
166 printf ("Could not remove directory (%s)\n", strerror (errno));
167 ret = 1;
170 return ret;