blob: 949fc65428cf7324406ab55a8f8ba479bf86c6c5 [file] [log] [blame]
xf.libdd93d52023-05-12 07:10:14 -07001/* 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.
4
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.
9
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.
14
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/>. */
18
19#include <fcntl.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <unistd.h>
24
25
26static void prepare (void);
27#define PREPARE(argc, argv) prepare ()
28
29static int do_test (void);
30#define TEST_FUNCTION do_test ()
31
32#include "../test-skeleton.c"
33
34static int dir_fd;
35static char *dirbuf;
36
37static void
38prepare (void)
39{
40 size_t test_dir_len = strlen (test_dir);
41 static const char dir_name[] = "/tst-pathconf.XXXXXX";
42
43 size_t dirbuflen = test_dir_len + sizeof (dir_name);
44 dirbuf = malloc (dirbuflen);
45 if (dirbuf == NULL)
46 {
47 puts ("Out of memory");
48 exit (1);
49 }
50
51 snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
52 if (mkdtemp (dirbuf) == NULL)
53 {
54 printf ("Cannot create temporary directory: %s\n", strerror (errno));
55 exit (1);
56 }
57
58 add_temp_file (dirbuf);
59
60 dir_fd = open (dirbuf, O_RDONLY);
61 if (dir_fd == -1)
62 {
63 printf ("Cannot open directory: %s\n", strerror (errno));
64 exit (1);
65 }
66}
67
68
69static int
70do_test (void)
71{
72 int ret = 0;
73 static const char *fifo_name = "some-fifo";
74
75 size_t filenamelen = strlen (dirbuf) + strlen (fifo_name) + 2;
76 char *filename = malloc (filenamelen);
77
78 snprintf (filename, filenamelen, "%s/%s", dirbuf, fifo_name);
79
80 /* Create a fifo in the directory. */
81 int e = mkfifo (filename, 0777);
82 if (e == -1)
83 {
84 printf ("fifo creation failed (%s)\n", strerror (errno));
85 ret = 1;
86 goto out_nofifo;
87 }
88
89 long dir_pathconf = pathconf (dirbuf, _PC_PIPE_BUF);
90
91 if (dir_pathconf < 0)
92 {
93 printf ("pathconf on directory failed: %s\n", strerror (errno));
94 ret = 1;
95 goto out_nofifo;
96 }
97
98 long fifo_pathconf = pathconf (filename, _PC_PIPE_BUF);
99
100 if (fifo_pathconf < 0)
101 {
102 printf ("pathconf on file failed: %s\n", strerror (errno));
103 ret = 1;
104 goto out_nofifo;
105 }
106
107 int fifo = open (filename, O_RDONLY | O_NONBLOCK);
108
109 if (fifo < 0)
110 {
111 printf ("fifo open failed (%s)\n", strerror (errno));
112 ret = 1;
113 goto out_nofifo;
114 }
115
116 long dir_fpathconf = fpathconf (dir_fd, _PC_PIPE_BUF);
117
118 if (dir_fpathconf < 0)
119 {
120 printf ("fpathconf on directory failed: %s\n", strerror (errno));
121 ret = 1;
122 goto out;
123 }
124
125 long fifo_fpathconf = fpathconf (fifo, _PC_PIPE_BUF);
126
127 if (fifo_fpathconf < 0)
128 {
129 printf ("fpathconf on file failed: %s\n", strerror (errno));
130 ret = 1;
131 goto out;
132 }
133
134 if (fifo_pathconf != fifo_fpathconf)
135 {
136 printf ("fifo pathconf (%ld) != fifo fpathconf (%ld)\n", fifo_pathconf,
137 fifo_fpathconf);
138 ret = 1;
139 goto out;
140 }
141
142 if (dir_pathconf != fifo_pathconf)
143 {
144 printf ("directory pathconf (%ld) != fifo pathconf (%ld)\n",
145 dir_pathconf, fifo_pathconf);
146 ret = 1;
147 goto out;
148 }
149
150 if (dir_fpathconf != fifo_fpathconf)
151 {
152 printf ("directory fpathconf (%ld) != fifo fpathconf (%ld)\n",
153 dir_fpathconf, fifo_fpathconf);
154 ret = 1;
155 goto out;
156 }
157
158out:
159 close (fifo);
160out_nofifo:
161 close (dir_fd);
162
163 if (unlink (filename) != 0)
164 {
165 printf ("Could not remove fifo (%s)\n", strerror (errno));
166 ret = 1;
167 }
168
169 if (rmdir (dirbuf) != 0)
170 {
171 printf ("Could not remove directory (%s)\n", strerror (errno));
172 ret = 1;
173 }
174
175 return ret;
176}