1f08c3bdfSopenharmony_ci/*
2f08c3bdfSopenharmony_ci *
3f08c3bdfSopenharmony_ci *   Copyright (c) International Business Machines  Corp., 2002
4f08c3bdfSopenharmony_ci *
5f08c3bdfSopenharmony_ci *   This program is free software;  you can redistribute it and/or modify
6f08c3bdfSopenharmony_ci *   it under the terms of the GNU General Public License as published by
7f08c3bdfSopenharmony_ci *   the Free Software Foundation; either version 2 of the License, or
8f08c3bdfSopenharmony_ci *   (at your option) any later version.
9f08c3bdfSopenharmony_ci *
10f08c3bdfSopenharmony_ci *   This program is distributed in the hope that it will be useful,
11f08c3bdfSopenharmony_ci *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12f08c3bdfSopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13f08c3bdfSopenharmony_ci *   the GNU General Public License for more details.
14f08c3bdfSopenharmony_ci *
15f08c3bdfSopenharmony_ci *   You should have received a copy of the GNU General Public License
16f08c3bdfSopenharmony_ci *   along with this program;  if not, write to the Free Software
17f08c3bdfSopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18f08c3bdfSopenharmony_ci */
19f08c3bdfSopenharmony_ci
20f08c3bdfSopenharmony_ci/* 10/31/2002   Port to LTP     robbiew@us.ibm.com */
21f08c3bdfSopenharmony_ci/* 06/30/2001   Port to Linux   nsharoff@us.ibm.com */
22f08c3bdfSopenharmony_ci
23f08c3bdfSopenharmony_ci/*
24f08c3bdfSopenharmony_ci * NAME
25f08c3bdfSopenharmony_ci *	test_func.c - nftw() calls these functions.
26f08c3bdfSopenharmony_ci */
27f08c3bdfSopenharmony_ci
28f08c3bdfSopenharmony_ci#include "nftw.h"
29f08c3bdfSopenharmony_ci
30f08c3bdfSopenharmony_ciextern pathdata pathdat[];
31f08c3bdfSopenharmony_ciextern struct list mnem[], badlist[];
32f08c3bdfSopenharmony_ciextern char *dirlist[NDIRLISTENTS];
33f08c3bdfSopenharmony_ciextern const char *rw_fs_name;
34f08c3bdfSopenharmony_ciextern int npathdats, ngoods, nbads, nmnem, visit, next_fd[4];
35f08c3bdfSopenharmony_ciextern FILE *temp;
36f08c3bdfSopenharmony_ci
37f08c3bdfSopenharmony_ci/*
38f08c3bdfSopenharmony_ci * Calling function should free the dirlist array.
39f08c3bdfSopenharmony_ci */
40f08c3bdfSopenharmony_ciint
41f08c3bdfSopenharmony_citest_func1(const char *path_name, const struct stat *stat_pointer,
42f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
43f08c3bdfSopenharmony_ci{
44f08c3bdfSopenharmony_ci	char *s;
45f08c3bdfSopenharmony_ci	const char *p;
46f08c3bdfSopenharmony_ci
47f08c3bdfSopenharmony_ci	temp = stderr;
48f08c3bdfSopenharmony_ci
49f08c3bdfSopenharmony_ci	if ((s = malloc((size_t)(strlen((char *)path_name) + 1)))
50f08c3bdfSopenharmony_ci	    == NULL) {
51f08c3bdfSopenharmony_ci		perror("malloc in test_func1");
52f08c3bdfSopenharmony_ci		return 999;
53f08c3bdfSopenharmony_ci	}
54f08c3bdfSopenharmony_ci
55f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
56f08c3bdfSopenharmony_ci		p += strlen(NFTW);
57f08c3bdfSopenharmony_ci	} else {
58f08c3bdfSopenharmony_ci		p = path_name;
59f08c3bdfSopenharmony_ci	}
60f08c3bdfSopenharmony_ci
61f08c3bdfSopenharmony_ci	(void)strcpy(s, p);
62f08c3bdfSopenharmony_ci	dirlist[visit++] = s;
63f08c3bdfSopenharmony_ci
64f08c3bdfSopenharmony_ci#ifdef DEBUG
65f08c3bdfSopenharmony_ci	fprintf(temp, "INFO: Call to fn() at %s\n", path_name);
66f08c3bdfSopenharmony_ci#endif
67f08c3bdfSopenharmony_ci
68f08c3bdfSopenharmony_ci	if (visit >= NDIRLISTENTS) {
69f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: Too many paths traversed\n");
70f08c3bdfSopenharmony_ci		return 999;
71f08c3bdfSopenharmony_ci	}
72f08c3bdfSopenharmony_ci	return 0;
73f08c3bdfSopenharmony_ci}
74f08c3bdfSopenharmony_ci
75f08c3bdfSopenharmony_ciint
76f08c3bdfSopenharmony_citest_func3(const char *path_name, const struct stat *stat_pointer,
77f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
78f08c3bdfSopenharmony_ci{
79f08c3bdfSopenharmony_ci	visit++;
80f08c3bdfSopenharmony_ci	temp = stderr;
81f08c3bdfSopenharmony_ci#ifdef DEBUG
82f08c3bdfSopenharmony_ci	fprintf(temp, "INFO: Call to fn() at %s\n", path_name);
83f08c3bdfSopenharmony_ci#endif
84f08c3bdfSopenharmony_ci
85f08c3bdfSopenharmony_ci	if (visit >= NDIRLISTENTS) {
86f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: Too many paths traversed\n");
87f08c3bdfSopenharmony_ci		return 999;
88f08c3bdfSopenharmony_ci	}
89f08c3bdfSopenharmony_ci
90f08c3bdfSopenharmony_ci	if (strcmp(path_name, "./tmp/data/dirl/dir_right.1/dir_right.2/right.3")
91f08c3bdfSopenharmony_ci	    == 0) {
92f08c3bdfSopenharmony_ci		fprintf(temp,
93f08c3bdfSopenharmony_ci			"ERROR: Target of right.3 was already reported so this file should not be\n");
94f08c3bdfSopenharmony_ci		return 999;
95f08c3bdfSopenharmony_ci	}
96f08c3bdfSopenharmony_ci
97f08c3bdfSopenharmony_ci	return 0;
98f08c3bdfSopenharmony_ci}
99f08c3bdfSopenharmony_ci
100f08c3bdfSopenharmony_ciint
101f08c3bdfSopenharmony_citest_func4(const char *path_name, const struct stat *stat_pointer,
102f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
103f08c3bdfSopenharmony_ci{
104f08c3bdfSopenharmony_ci	visit++;
105f08c3bdfSopenharmony_ci	do_info(path_name);
106f08c3bdfSopenharmony_ci
107f08c3bdfSopenharmony_ci	/* Stop traversal once directory is visited. */
108f08c3bdfSopenharmony_ci	if (strcmp(path_name, "./tmp/data/d777") == 0)
109f08c3bdfSopenharmony_ci		return 999;
110f08c3bdfSopenharmony_ci	return 0;
111f08c3bdfSopenharmony_ci}
112f08c3bdfSopenharmony_ci
113f08c3bdfSopenharmony_ciint
114f08c3bdfSopenharmony_citest_func5(const char *path_name, const struct stat *stat_pointer,
115f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
116f08c3bdfSopenharmony_ci{
117f08c3bdfSopenharmony_ci	char pathcwd[PATH_MAX];
118f08c3bdfSopenharmony_ci
119f08c3bdfSopenharmony_ci	if (ftw_integer == FTW_D)
120f08c3bdfSopenharmony_ci		return (0);
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_ci	if (getcwd(pathcwd, sizeof(pathcwd)) == NULL) {
123f08c3bdfSopenharmony_ci		perror("getcwd");
124f08c3bdfSopenharmony_ci		return 998;
125f08c3bdfSopenharmony_ci	}
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_ci	if (strstr(path_name, pathcwd) == 0) {
128f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: For file %s cwd is %s\n", path_name,
129f08c3bdfSopenharmony_ci			pathcwd);
130f08c3bdfSopenharmony_ci		return 999;
131f08c3bdfSopenharmony_ci	}
132f08c3bdfSopenharmony_ci
133f08c3bdfSopenharmony_ci	return (0);
134f08c3bdfSopenharmony_ci}
135f08c3bdfSopenharmony_ci
136f08c3bdfSopenharmony_ciint
137f08c3bdfSopenharmony_citest_func7(const char *path_name, const struct stat *stat_pointer,
138f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
139f08c3bdfSopenharmony_ci{
140f08c3bdfSopenharmony_ci	int i, found;
141f08c3bdfSopenharmony_ci	const char *p;
142f08c3bdfSopenharmony_ci
143f08c3bdfSopenharmony_ci	do_info(path_name);
144f08c3bdfSopenharmony_ci
145f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
146f08c3bdfSopenharmony_ci		p += strlen(NFTW);
147f08c3bdfSopenharmony_ci	} else {
148f08c3bdfSopenharmony_ci		p = path_name;
149f08c3bdfSopenharmony_ci	}
150f08c3bdfSopenharmony_ci
151f08c3bdfSopenharmony_ci	for (found = i = 0; i < nbads; i++) {
152f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
153f08c3bdfSopenharmony_ci			found++;
154f08c3bdfSopenharmony_ci			break;
155f08c3bdfSopenharmony_ci		}
156f08c3bdfSopenharmony_ci	}
157f08c3bdfSopenharmony_ci
158f08c3bdfSopenharmony_ci	if (!found) {
159f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: Should not have traversed %s\n",
160f08c3bdfSopenharmony_ci			path_name);
161f08c3bdfSopenharmony_ci		return 999;
162f08c3bdfSopenharmony_ci	}
163f08c3bdfSopenharmony_ci	return 0;
164f08c3bdfSopenharmony_ci}
165f08c3bdfSopenharmony_ci
166f08c3bdfSopenharmony_ciint
167f08c3bdfSopenharmony_citest_func8(const char *path_name, const struct stat *stat_pointer,
168f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
169f08c3bdfSopenharmony_ci{
170f08c3bdfSopenharmony_ci	int i;
171f08c3bdfSopenharmony_ci	const char *p;
172f08c3bdfSopenharmony_ci	struct stat st_buf;
173f08c3bdfSopenharmony_ci
174f08c3bdfSopenharmony_ci	do_info(path_name);
175f08c3bdfSopenharmony_ci
176f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
177f08c3bdfSopenharmony_ci		p += strlen(NFTW);
178f08c3bdfSopenharmony_ci	} else {
179f08c3bdfSopenharmony_ci		p = path_name;
180f08c3bdfSopenharmony_ci	}
181f08c3bdfSopenharmony_ci
182f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
183f08c3bdfSopenharmony_ci		if (ftw_integer == FTW_D || ftw_integer == FTW_F ||
184f08c3bdfSopenharmony_ci		    ftw_integer == FTW_SL) {
185f08c3bdfSopenharmony_ci			if ((((ftw_integer == FTW_D) || (ftw_integer ==
186f08c3bdfSopenharmony_ci							 FTW_F)) ?
187f08c3bdfSopenharmony_ci			     stat(path_name, &st_buf) : lstat(path_name,
188f08c3bdfSopenharmony_ci							      &st_buf)) == -1) {
189f08c3bdfSopenharmony_ci				perror("stat");
190f08c3bdfSopenharmony_ci				return 999;
191f08c3bdfSopenharmony_ci			}
192f08c3bdfSopenharmony_ci
193f08c3bdfSopenharmony_ci			if (st_buf.st_dev != stat_pointer->st_dev) {
194f08c3bdfSopenharmony_ci				fprintf(temp,
195f08c3bdfSopenharmony_ci					"ERROR: st_dev members do not match for %s\n",
196f08c3bdfSopenharmony_ci					path_name);
197f08c3bdfSopenharmony_ci				return 999;
198f08c3bdfSopenharmony_ci			}
199f08c3bdfSopenharmony_ci
200f08c3bdfSopenharmony_ci			if (st_buf.st_ino != stat_pointer->st_ino) {
201f08c3bdfSopenharmony_ci				fprintf(temp,
202f08c3bdfSopenharmony_ci					"ERROR: st_ino members do not match for %s\n",
203f08c3bdfSopenharmony_ci					path_name);
204f08c3bdfSopenharmony_ci				return 999;
205f08c3bdfSopenharmony_ci			}
206f08c3bdfSopenharmony_ci
207f08c3bdfSopenharmony_ci			if (st_buf.st_mode != stat_pointer->st_mode) {
208f08c3bdfSopenharmony_ci				fprintf(temp,
209f08c3bdfSopenharmony_ci					"ERROR: st_mode members do not match for %s\n",
210f08c3bdfSopenharmony_ci					path_name);
211f08c3bdfSopenharmony_ci				return 999;
212f08c3bdfSopenharmony_ci			}
213f08c3bdfSopenharmony_ci
214f08c3bdfSopenharmony_ci			if (st_buf.st_nlink != stat_pointer->st_nlink) {
215f08c3bdfSopenharmony_ci				fprintf(temp,
216f08c3bdfSopenharmony_ci					"ERROR: st_nlink members d o not match for %s\n",
217f08c3bdfSopenharmony_ci					path_name);
218f08c3bdfSopenharmony_ci				return 999;
219f08c3bdfSopenharmony_ci			}
220f08c3bdfSopenharmony_ci
221f08c3bdfSopenharmony_ci			if (st_buf.st_uid != stat_pointer->st_uid) {
222f08c3bdfSopenharmony_ci				fprintf(temp,
223f08c3bdfSopenharmony_ci					"ERROR: st_uid members do not match for %s\n",
224f08c3bdfSopenharmony_ci					path_name);
225f08c3bdfSopenharmony_ci				return 999;
226f08c3bdfSopenharmony_ci			}
227f08c3bdfSopenharmony_ci
228f08c3bdfSopenharmony_ci			if (st_buf.st_gid != stat_pointer->st_gid) {
229f08c3bdfSopenharmony_ci				fprintf(temp,
230f08c3bdfSopenharmony_ci					"ERROR: st_gid members do not match for %s\n",
231f08c3bdfSopenharmony_ci					path_name);
232f08c3bdfSopenharmony_ci				return 999;
233f08c3bdfSopenharmony_ci			}
234f08c3bdfSopenharmony_ci
235f08c3bdfSopenharmony_ci			if (st_buf.st_size != stat_pointer->st_size) {
236f08c3bdfSopenharmony_ci				fprintf(temp,
237f08c3bdfSopenharmony_ci					"ERROR: st_size members do not match for %s\n",
238f08c3bdfSopenharmony_ci					path_name);
239f08c3bdfSopenharmony_ci				return 999;
240f08c3bdfSopenharmony_ci			}
241f08c3bdfSopenharmony_ci		}
242f08c3bdfSopenharmony_ci
243f08c3bdfSopenharmony_ci	}
244f08c3bdfSopenharmony_ci	return 0;
245f08c3bdfSopenharmony_ci}
246f08c3bdfSopenharmony_ci
247f08c3bdfSopenharmony_ciint
248f08c3bdfSopenharmony_citest_func9(const char *path_name, const struct stat *stat_pointer,
249f08c3bdfSopenharmony_ci	   int ftw_integer, struct FTW *ftwp)
250f08c3bdfSopenharmony_ci{
251f08c3bdfSopenharmony_ci	int i;
252f08c3bdfSopenharmony_ci	const char *p;
253f08c3bdfSopenharmony_ci
254f08c3bdfSopenharmony_ci	do_info(path_name);
255f08c3bdfSopenharmony_ci
256f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
257f08c3bdfSopenharmony_ci		p += strlen(NFTW);
258f08c3bdfSopenharmony_ci	} else {
259f08c3bdfSopenharmony_ci		p = path_name;
260f08c3bdfSopenharmony_ci	}
261f08c3bdfSopenharmony_ci
262f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
263f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
264f08c3bdfSopenharmony_ci
265f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_F) {
266f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
267f08c3bdfSopenharmony_ci					fprintf(temp,
268f08c3bdfSopenharmony_ci						"ERROR: Bad thrid arg to fn () for %s\n",
269f08c3bdfSopenharmony_ci						path_name);
270f08c3bdfSopenharmony_ci					fprintf(temp, "       Expected %s\n",
271f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i));
272f08c3bdfSopenharmony_ci					fprintf(temp, "       Received %s\n",
273f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
274f08c3bdfSopenharmony_ci					return 999;
275f08c3bdfSopenharmony_ci				}
276f08c3bdfSopenharmony_ci			}
277f08c3bdfSopenharmony_ci		}
278f08c3bdfSopenharmony_ci	}
279f08c3bdfSopenharmony_ci	return 0;
280f08c3bdfSopenharmony_ci}
281f08c3bdfSopenharmony_ci
282f08c3bdfSopenharmony_ciint
283f08c3bdfSopenharmony_citest_func10(const char *path_name, const struct stat *stat_pointer,
284f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
285f08c3bdfSopenharmony_ci{
286f08c3bdfSopenharmony_ci	int i;
287f08c3bdfSopenharmony_ci	const char *p;
288f08c3bdfSopenharmony_ci
289f08c3bdfSopenharmony_ci	do_info(path_name);
290f08c3bdfSopenharmony_ci
291f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
292f08c3bdfSopenharmony_ci		p += strlen(NFTW);
293f08c3bdfSopenharmony_ci	} else {
294f08c3bdfSopenharmony_ci		p = path_name;
295f08c3bdfSopenharmony_ci	}
296f08c3bdfSopenharmony_ci
297f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
298f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
299f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_D) {
300f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
301f08c3bdfSopenharmony_ci					fprintf(temp,
302f08c3bdfSopenharmony_ci						"ERROR: Bad third arg to fn () for %s\n",
303f08c3bdfSopenharmony_ci						path_name);
304f08c3bdfSopenharmony_ci					fprintf(temp, "       Expected %s\n",
305f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i));
306f08c3bdfSopenharmony_ci					fprintf(temp, "       Received %s\n",
307f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
308f08c3bdfSopenharmony_ci					return 999;
309f08c3bdfSopenharmony_ci				}
310f08c3bdfSopenharmony_ci			}
311f08c3bdfSopenharmony_ci		}
312f08c3bdfSopenharmony_ci	}
313f08c3bdfSopenharmony_ci	return 0;
314f08c3bdfSopenharmony_ci}
315f08c3bdfSopenharmony_ci
316f08c3bdfSopenharmony_ciint
317f08c3bdfSopenharmony_citest_func11(const char *path_name, const struct stat *stat_pointer,
318f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
319f08c3bdfSopenharmony_ci{
320f08c3bdfSopenharmony_ci	int i;
321f08c3bdfSopenharmony_ci	const char *p;
322f08c3bdfSopenharmony_ci
323f08c3bdfSopenharmony_ci	do_info(path_name);
324f08c3bdfSopenharmony_ci
325f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
326f08c3bdfSopenharmony_ci		p += strlen(NFTW);
327f08c3bdfSopenharmony_ci	} else {
328f08c3bdfSopenharmony_ci		p = path_name;
329f08c3bdfSopenharmony_ci	}
330f08c3bdfSopenharmony_ci
331f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
332f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
333f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_DP) {
334f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
335f08c3bdfSopenharmony_ci					fprintf(temp,
336f08c3bdfSopenharmony_ci						"ERROR: Bad third arg to fn () for %s\n",
337f08c3bdfSopenharmony_ci						path_name);
338f08c3bdfSopenharmony_ci					fprintf(temp, "       Expected %s\n",
339f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i));
340f08c3bdfSopenharmony_ci					fprintf(temp, "       Received %s\n",
341f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
342f08c3bdfSopenharmony_ci					return 999;
343f08c3bdfSopenharmony_ci				}
344f08c3bdfSopenharmony_ci			}
345f08c3bdfSopenharmony_ci		}
346f08c3bdfSopenharmony_ci	}
347f08c3bdfSopenharmony_ci	return 0;
348f08c3bdfSopenharmony_ci}
349f08c3bdfSopenharmony_ci
350f08c3bdfSopenharmony_ciint
351f08c3bdfSopenharmony_citest_func12(const char *path_name, const struct stat *stat_pointer,
352f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
353f08c3bdfSopenharmony_ci{
354f08c3bdfSopenharmony_ci	int i;
355f08c3bdfSopenharmony_ci	const char *p;
356f08c3bdfSopenharmony_ci
357f08c3bdfSopenharmony_ci	do_info(path_name);
358f08c3bdfSopenharmony_ci
359f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
360f08c3bdfSopenharmony_ci		p += strlen(NFTW);
361f08c3bdfSopenharmony_ci	} else {
362f08c3bdfSopenharmony_ci		p = path_name;
363f08c3bdfSopenharmony_ci	}
364f08c3bdfSopenharmony_ci
365f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
366f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
367f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_SL) {
368f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
369f08c3bdfSopenharmony_ci					fprintf(temp,
370f08c3bdfSopenharmony_ci						"ERROR: Bad third arg to fn() for %s.  Expected %s, Received %s\n",
371f08c3bdfSopenharmony_ci						path_name,
372f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i),
373f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
374f08c3bdfSopenharmony_ci					return 999;
375f08c3bdfSopenharmony_ci				}
376f08c3bdfSopenharmony_ci			}
377f08c3bdfSopenharmony_ci		}
378f08c3bdfSopenharmony_ci	}
379f08c3bdfSopenharmony_ci	return 0;
380f08c3bdfSopenharmony_ci}
381f08c3bdfSopenharmony_ci
382f08c3bdfSopenharmony_ciint
383f08c3bdfSopenharmony_citest_func13(const char *path_name, const struct stat *stat_pointer,
384f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
385f08c3bdfSopenharmony_ci{
386f08c3bdfSopenharmony_ci	int i;
387f08c3bdfSopenharmony_ci	const char *p;
388f08c3bdfSopenharmony_ci
389f08c3bdfSopenharmony_ci	do_info(path_name);
390f08c3bdfSopenharmony_ci
391f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
392f08c3bdfSopenharmony_ci		p += strlen(NFTW);
393f08c3bdfSopenharmony_ci	} else {
394f08c3bdfSopenharmony_ci		p = path_name;
395f08c3bdfSopenharmony_ci	}
396f08c3bdfSopenharmony_ci
397f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
398f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
399f08c3bdfSopenharmony_ci
400f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_SLN) {
401f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
402f08c3bdfSopenharmony_ci					fprintf(temp,
403f08c3bdfSopenharmony_ci						"ERROR: Bad third arg to fn() for %s\n",
404f08c3bdfSopenharmony_ci						path_name);
405f08c3bdfSopenharmony_ci					fprintf(temp, "       Expected %s\n",
406f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i));
407f08c3bdfSopenharmony_ci					fprintf(temp, "       Received %s\n",
408f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
409f08c3bdfSopenharmony_ci					return 999;
410f08c3bdfSopenharmony_ci				}
411f08c3bdfSopenharmony_ci			}
412f08c3bdfSopenharmony_ci		}
413f08c3bdfSopenharmony_ci	}
414f08c3bdfSopenharmony_ci	return 0;
415f08c3bdfSopenharmony_ci}
416f08c3bdfSopenharmony_ci
417f08c3bdfSopenharmony_ciint
418f08c3bdfSopenharmony_citest_func14(const char *path_name, const struct stat *stat_pointer,
419f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
420f08c3bdfSopenharmony_ci{
421f08c3bdfSopenharmony_ci	int i;
422f08c3bdfSopenharmony_ci	const char *p;
423f08c3bdfSopenharmony_ci
424f08c3bdfSopenharmony_ci	do_info(path_name);
425f08c3bdfSopenharmony_ci
426f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW)) != NULL) {
427f08c3bdfSopenharmony_ci		p += strlen(NFTW);
428f08c3bdfSopenharmony_ci	} else {
429f08c3bdfSopenharmony_ci		p = path_name;
430f08c3bdfSopenharmony_ci	}
431f08c3bdfSopenharmony_ci
432f08c3bdfSopenharmony_ci	for (i = 0; i < nbads; i++) {
433f08c3bdfSopenharmony_ci		if (strcmp(p, badlist[i].s) == 0) {
434f08c3bdfSopenharmony_ci
435f08c3bdfSopenharmony_ci			if (ftw_integer == FTW_DNR) {
436f08c3bdfSopenharmony_ci				if (ftw_integer != badlist[i].i) {
437f08c3bdfSopenharmony_ci					fprintf(temp,
438f08c3bdfSopenharmony_ci						"ERROR: Bad third arg to fn() for %s\n",
439f08c3bdfSopenharmony_ci						path_name);
440f08c3bdfSopenharmony_ci					fprintf(temp, "       Expected %s\n",
441f08c3bdfSopenharmony_ci						ftw_mnemonic(badlist[i].i));
442f08c3bdfSopenharmony_ci					fprintf(temp, "       Received %s\n",
443f08c3bdfSopenharmony_ci						ftw_mnemonic(ftw_integer));
444f08c3bdfSopenharmony_ci					return 999;
445f08c3bdfSopenharmony_ci				}
446f08c3bdfSopenharmony_ci			}
447f08c3bdfSopenharmony_ci		}
448f08c3bdfSopenharmony_ci	}
449f08c3bdfSopenharmony_ci	return 0;
450f08c3bdfSopenharmony_ci}
451f08c3bdfSopenharmony_ci
452f08c3bdfSopenharmony_ciint
453f08c3bdfSopenharmony_citest_func15(const char *path_name, const struct stat *stat_pointer,
454f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
455f08c3bdfSopenharmony_ci{
456f08c3bdfSopenharmony_ci	do_info(path_name);
457f08c3bdfSopenharmony_ci	if (strcmp(path_name, "./tmp/data/d666/errs") == 0) {
458f08c3bdfSopenharmony_ci		if (ftw_integer != FTW_NS) {
459f08c3bdfSopenharmony_ci			fprintf(temp,
460f08c3bdfSopenharmony_ci				"ERROR: FTW_NS not passed for file in unsearchable dir\n");
461f08c3bdfSopenharmony_ci			return 999;
462f08c3bdfSopenharmony_ci		}
463f08c3bdfSopenharmony_ci	}
464f08c3bdfSopenharmony_ci	return 0;
465f08c3bdfSopenharmony_ci}
466f08c3bdfSopenharmony_ci
467f08c3bdfSopenharmony_ciint
468f08c3bdfSopenharmony_citest_func16(const char *path_name, const struct stat *stat_pointer,
469f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
470f08c3bdfSopenharmony_ci{
471f08c3bdfSopenharmony_ci	const char *p;
472f08c3bdfSopenharmony_ci
473f08c3bdfSopenharmony_ci	if ((p = strstr(path_name, NFTW2)) != NULL) {
474f08c3bdfSopenharmony_ci		p += strlen(NFTW2) + 1;
475f08c3bdfSopenharmony_ci	} else {
476f08c3bdfSopenharmony_ci		p = path_name;
477f08c3bdfSopenharmony_ci	}
478f08c3bdfSopenharmony_ci
479f08c3bdfSopenharmony_ci	if (ftwp->level != getlev(p)) {
480f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: Incorrect value of level for %s\n",
481f08c3bdfSopenharmony_ci			path_name);
482f08c3bdfSopenharmony_ci		fprintf(temp, "       Expected %d, received %d\n",
483f08c3bdfSopenharmony_ci			getlev(p), ftwp->level);
484f08c3bdfSopenharmony_ci		return 999;
485f08c3bdfSopenharmony_ci	}
486f08c3bdfSopenharmony_ci	if (ftwp->base != getbase(path_name)) {
487f08c3bdfSopenharmony_ci		fprintf(temp, "ERROR: Incorrect value of base for %s\n",
488f08c3bdfSopenharmony_ci			path_name);
489f08c3bdfSopenharmony_ci		fprintf(temp, "       Expected %d, received %d\n",
490f08c3bdfSopenharmony_ci			getbase(path_name), ftwp->base);
491f08c3bdfSopenharmony_ci		return 999;
492f08c3bdfSopenharmony_ci	}
493f08c3bdfSopenharmony_ci	return 0;
494f08c3bdfSopenharmony_ci}
495f08c3bdfSopenharmony_ci
496f08c3bdfSopenharmony_ciint
497f08c3bdfSopenharmony_citest_func17(const char *path_name, const struct stat *stat_pointer,
498f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
499f08c3bdfSopenharmony_ci{
500f08c3bdfSopenharmony_ci	do_info(path_name);
501f08c3bdfSopenharmony_ci
502f08c3bdfSopenharmony_ci	if (ftw_integer == FTW_SL) {
503f08c3bdfSopenharmony_ci		visit++;
504f08c3bdfSopenharmony_ci		return 999;
505f08c3bdfSopenharmony_ci	}
506f08c3bdfSopenharmony_ci	return 0;
507f08c3bdfSopenharmony_ci}
508f08c3bdfSopenharmony_ci
509f08c3bdfSopenharmony_ciint
510f08c3bdfSopenharmony_citest_func18(const char *path_name, const struct stat *stat_pointer,
511f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
512f08c3bdfSopenharmony_ci{
513f08c3bdfSopenharmony_ci	do_info(path_name);
514f08c3bdfSopenharmony_ci	if (ftw_integer == FTW_SLN) {
515f08c3bdfSopenharmony_ci		visit++;
516f08c3bdfSopenharmony_ci		return 999;
517f08c3bdfSopenharmony_ci	}
518f08c3bdfSopenharmony_ci	return 0;
519f08c3bdfSopenharmony_ci}
520f08c3bdfSopenharmony_ci
521f08c3bdfSopenharmony_ciint
522f08c3bdfSopenharmony_citest_func19(const char *path_name, const struct stat *stat_pointer,
523f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
524f08c3bdfSopenharmony_ci{
525f08c3bdfSopenharmony_ci	do_info(path_name);
526f08c3bdfSopenharmony_ci	visit++;
527f08c3bdfSopenharmony_ci	if (ftw_integer == FTW_DNR) {
528f08c3bdfSopenharmony_ci		if (strcmp(path_name, "./tmp/data/d333") == 0) {
529f08c3bdfSopenharmony_ci			return 0;
530f08c3bdfSopenharmony_ci		} else {
531f08c3bdfSopenharmony_ci			fprintf(temp,
532f08c3bdfSopenharmony_ci				"ERROR: When FTW_DNR is passed to the function fn the\n");
533f08c3bdfSopenharmony_ci			fprintf(temp,
534f08c3bdfSopenharmony_ci				"       descendants of the directory should not have\n");
535f08c3bdfSopenharmony_ci			fprintf(temp, "       Been processed\n");
536f08c3bdfSopenharmony_ci			return 999;
537f08c3bdfSopenharmony_ci		}
538f08c3bdfSopenharmony_ci	} else {
539f08c3bdfSopenharmony_ci		fprintf(temp,
540f08c3bdfSopenharmony_ci			"ERROR: Directory has read permission or FTW_DNR was not passed to fn\n");
541f08c3bdfSopenharmony_ci		return 999;
542f08c3bdfSopenharmony_ci	}
543f08c3bdfSopenharmony_ci}
544f08c3bdfSopenharmony_ci
545f08c3bdfSopenharmony_ciint
546f08c3bdfSopenharmony_citest_func20(const char *path_name, const struct stat *stat_pointer,
547f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
548f08c3bdfSopenharmony_ci{
549f08c3bdfSopenharmony_ci	return 0;
550f08c3bdfSopenharmony_ci}
551f08c3bdfSopenharmony_ci
552f08c3bdfSopenharmony_ciint
553f08c3bdfSopenharmony_citest_func21(const char *path_name, const struct stat *stat_pointer,
554f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
555f08c3bdfSopenharmony_ci{
556f08c3bdfSopenharmony_ci	int fd;
557f08c3bdfSopenharmony_ci
558f08c3bdfSopenharmony_ci	do_info(path_name);
559f08c3bdfSopenharmony_ci	/* get next file descriptor available */
560f08c3bdfSopenharmony_ci	if ((fd = open(path_name, O_RDONLY)) == -1) {
561f08c3bdfSopenharmony_ci		perror("open");
562f08c3bdfSopenharmony_ci		return 999;
563f08c3bdfSopenharmony_ci	}
564f08c3bdfSopenharmony_ci
565f08c3bdfSopenharmony_ci	if (close(fd) == -1) {
566f08c3bdfSopenharmony_ci		perror("close");
567f08c3bdfSopenharmony_ci		return 999;
568f08c3bdfSopenharmony_ci	}
569f08c3bdfSopenharmony_ci
570f08c3bdfSopenharmony_ci	if ((fd != next_fd[0]) && (fd != next_fd[1])) {
571f08c3bdfSopenharmony_ci		fprintf(temp,
572f08c3bdfSopenharmony_ci			"ERROR: Expected next fd available to be %d (none used) or %d (1 used)\n",
573f08c3bdfSopenharmony_ci			next_fd[0], next_fd[1]);
574f08c3bdfSopenharmony_ci		fprintf(temp, "       Next fd available is %d\n", fd);
575f08c3bdfSopenharmony_ci		return 999;
576f08c3bdfSopenharmony_ci	}
577f08c3bdfSopenharmony_ci	return 0;
578f08c3bdfSopenharmony_ci}
579f08c3bdfSopenharmony_ci
580f08c3bdfSopenharmony_ciint
581f08c3bdfSopenharmony_citest_func22(const char *path_name, const struct stat *stat_pointer,
582f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
583f08c3bdfSopenharmony_ci{
584f08c3bdfSopenharmony_ci	int fd;
585f08c3bdfSopenharmony_ci	int i;
586f08c3bdfSopenharmony_ci
587f08c3bdfSopenharmony_ci	do_info(path_name);
588f08c3bdfSopenharmony_ci	/* get next file descriptor available */
589f08c3bdfSopenharmony_ci	if ((fd = open(path_name, O_RDONLY)) == -1) {
590f08c3bdfSopenharmony_ci		perror("open");
591f08c3bdfSopenharmony_ci		return 999;
592f08c3bdfSopenharmony_ci	}
593f08c3bdfSopenharmony_ci
594f08c3bdfSopenharmony_ci	if (close(fd) == -1) {
595f08c3bdfSopenharmony_ci		perror("close");
596f08c3bdfSopenharmony_ci		return 999;
597f08c3bdfSopenharmony_ci	}
598f08c3bdfSopenharmony_ci
599f08c3bdfSopenharmony_ci	for (i = 0; i <= ftwp->level + 1; i++) {
600f08c3bdfSopenharmony_ci		if (fd == next_fd[i])
601f08c3bdfSopenharmony_ci			return 0;
602f08c3bdfSopenharmony_ci	}
603f08c3bdfSopenharmony_ci
604f08c3bdfSopenharmony_ci	fprintf(temp,
605f08c3bdfSopenharmony_ci		"ERROR: At the start of the traversal the next four fds were: %d, %d, %d, and %d\n",
606f08c3bdfSopenharmony_ci		next_fd[0], next_fd[1], next_fd[2], next_fd[3]);
607f08c3bdfSopenharmony_ci	fprintf(temp, "       Traversing level %d the next fd is %d\n",
608f08c3bdfSopenharmony_ci		ftwp->level, fd);
609f08c3bdfSopenharmony_ci	return 999;
610f08c3bdfSopenharmony_ci}
611f08c3bdfSopenharmony_ci
612f08c3bdfSopenharmony_ciint
613f08c3bdfSopenharmony_citest_func23(const char *path_name, const struct stat *stat_pointer,
614f08c3bdfSopenharmony_ci	    int ftw_integer, struct FTW *ftwp)
615f08c3bdfSopenharmony_ci{
616f08c3bdfSopenharmony_ci	visit++;
617f08c3bdfSopenharmony_ci	do_info(path_name);
618f08c3bdfSopenharmony_ci
619f08c3bdfSopenharmony_ci	if (ftw_integer == FTW_F) {
620f08c3bdfSopenharmony_ci
621f08c3bdfSopenharmony_ci#ifdef DEBUG
622f08c3bdfSopenharmony_ci		fprintf(temp,
623f08c3bdfSopenharmony_ci			"INFO: fn() returning non-zero after traversal of %d objects\n",
624f08c3bdfSopenharmony_ci			visit);
625f08c3bdfSopenharmony_ci#endif
626f08c3bdfSopenharmony_ci
627f08c3bdfSopenharmony_ci		return 999;
628f08c3bdfSopenharmony_ci	}
629f08c3bdfSopenharmony_ci
630f08c3bdfSopenharmony_ci	return 0;
631f08c3bdfSopenharmony_ci}
632