xref: /freebsd/lib/libc/gen/nftw-compat11.c (revision 69921123490b99c2588b0c743bc4af32bbe6601c)
1*69921123SKonstantin Belousov /*
2*69921123SKonstantin Belousov  * Copyright (c) 2003, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
3*69921123SKonstantin Belousov  *
4*69921123SKonstantin Belousov  * Permission to use, copy, modify, and distribute this software for any
5*69921123SKonstantin Belousov  * purpose with or without fee is hereby granted, provided that the above
6*69921123SKonstantin Belousov  * copyright notice and this permission notice appear in all copies.
7*69921123SKonstantin Belousov  *
8*69921123SKonstantin Belousov  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*69921123SKonstantin Belousov  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*69921123SKonstantin Belousov  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*69921123SKonstantin Belousov  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*69921123SKonstantin Belousov  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*69921123SKonstantin Belousov  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*69921123SKonstantin Belousov  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*69921123SKonstantin Belousov  *
16*69921123SKonstantin Belousov  * Sponsored in part by the Defense Advanced Research Projects
17*69921123SKonstantin Belousov  * Agency (DARPA) and Air Force Research Laboratory, Air Force
18*69921123SKonstantin Belousov  * Materiel Command, USAF, under agreement number F39502-99-1-0512.
19*69921123SKonstantin Belousov  *
20*69921123SKonstantin Belousov  * from: $OpenBSD: nftw.c,v 1.7 2006/03/31 19:41:44 millert Exp $
21*69921123SKonstantin Belousov  * from: $FreeBSD$
22*69921123SKonstantin Belousov  */
23*69921123SKonstantin Belousov 
24*69921123SKonstantin Belousov #include <sys/cdefs.h>
25*69921123SKonstantin Belousov __FBSDID("$FreeBSD$");
26*69921123SKonstantin Belousov 
27*69921123SKonstantin Belousov #include <sys/types.h>
28*69921123SKonstantin Belousov #include <sys/stat.h>
29*69921123SKonstantin Belousov #include <errno.h>
30*69921123SKonstantin Belousov #include <fts.h>
31*69921123SKonstantin Belousov #include <ftw.h>
32*69921123SKonstantin Belousov 
33*69921123SKonstantin Belousov #include "fts-compat11.h"
34*69921123SKonstantin Belousov 
35*69921123SKonstantin Belousov int
36*69921123SKonstantin Belousov freebsd11_nftw(const char *path,
37*69921123SKonstantin Belousov     int (*fn)(const char *, const struct freebsd11_stat *, int, struct FTW *),
38*69921123SKonstantin Belousov     int nfds, int ftwflags)
39*69921123SKonstantin Belousov {
40*69921123SKonstantin Belousov 	char * const paths[2] = { (char *)path, NULL };
41*69921123SKonstantin Belousov 	struct FTW ftw;
42*69921123SKonstantin Belousov 	FTSENT11 *cur;
43*69921123SKonstantin Belousov 	FTS11 *ftsp;
44*69921123SKonstantin Belousov 	int error = 0, ftsflags, fnflag, postorder, sverrno;
45*69921123SKonstantin Belousov 
46*69921123SKonstantin Belousov 	/* XXX - nfds is currently unused */
47*69921123SKonstantin Belousov 	if (nfds < 1) {
48*69921123SKonstantin Belousov 		errno = EINVAL;
49*69921123SKonstantin Belousov 		return (-1);
50*69921123SKonstantin Belousov 	}
51*69921123SKonstantin Belousov 
52*69921123SKonstantin Belousov 	ftsflags = FTS_COMFOLLOW;
53*69921123SKonstantin Belousov 	if (!(ftwflags & FTW_CHDIR))
54*69921123SKonstantin Belousov 		ftsflags |= FTS_NOCHDIR;
55*69921123SKonstantin Belousov 	if (ftwflags & FTW_MOUNT)
56*69921123SKonstantin Belousov 		ftsflags |= FTS_XDEV;
57*69921123SKonstantin Belousov 	if (ftwflags & FTW_PHYS)
58*69921123SKonstantin Belousov 		ftsflags |= FTS_PHYSICAL;
59*69921123SKonstantin Belousov 	else
60*69921123SKonstantin Belousov 		ftsflags |= FTS_LOGICAL;
61*69921123SKonstantin Belousov 	postorder = (ftwflags & FTW_DEPTH) != 0;
62*69921123SKonstantin Belousov 	ftsp = freebsd11_fts_open(paths, ftsflags, NULL);
63*69921123SKonstantin Belousov 	if (ftsp == NULL)
64*69921123SKonstantin Belousov 		return (-1);
65*69921123SKonstantin Belousov 	while ((cur = freebsd11_fts_read(ftsp)) != NULL) {
66*69921123SKonstantin Belousov 		switch (cur->fts_info) {
67*69921123SKonstantin Belousov 		case FTS_D:
68*69921123SKonstantin Belousov 			if (postorder)
69*69921123SKonstantin Belousov 				continue;
70*69921123SKonstantin Belousov 			fnflag = FTW_D;
71*69921123SKonstantin Belousov 			break;
72*69921123SKonstantin Belousov 		case FTS_DC:
73*69921123SKonstantin Belousov 			continue;
74*69921123SKonstantin Belousov 		case FTS_DNR:
75*69921123SKonstantin Belousov 			fnflag = FTW_DNR;
76*69921123SKonstantin Belousov 			break;
77*69921123SKonstantin Belousov 		case FTS_DP:
78*69921123SKonstantin Belousov 			if (!postorder)
79*69921123SKonstantin Belousov 				continue;
80*69921123SKonstantin Belousov 			fnflag = FTW_DP;
81*69921123SKonstantin Belousov 			break;
82*69921123SKonstantin Belousov 		case FTS_F:
83*69921123SKonstantin Belousov 		case FTS_DEFAULT:
84*69921123SKonstantin Belousov 			fnflag = FTW_F;
85*69921123SKonstantin Belousov 			break;
86*69921123SKonstantin Belousov 		case FTS_NS:
87*69921123SKonstantin Belousov 		case FTS_NSOK:
88*69921123SKonstantin Belousov 			fnflag = FTW_NS;
89*69921123SKonstantin Belousov 			break;
90*69921123SKonstantin Belousov 		case FTS_SL:
91*69921123SKonstantin Belousov 			fnflag = FTW_SL;
92*69921123SKonstantin Belousov 			break;
93*69921123SKonstantin Belousov 		case FTS_SLNONE:
94*69921123SKonstantin Belousov 			fnflag = FTW_SLN;
95*69921123SKonstantin Belousov 			break;
96*69921123SKonstantin Belousov 		default:
97*69921123SKonstantin Belousov 			error = -1;
98*69921123SKonstantin Belousov 			goto done;
99*69921123SKonstantin Belousov 		}
100*69921123SKonstantin Belousov 		ftw.base = cur->fts_pathlen - cur->fts_namelen;
101*69921123SKonstantin Belousov 		ftw.level = cur->fts_level;
102*69921123SKonstantin Belousov 		error = fn(cur->fts_path, cur->fts_statp, fnflag, &ftw);
103*69921123SKonstantin Belousov 		if (error != 0)
104*69921123SKonstantin Belousov 			break;
105*69921123SKonstantin Belousov 	}
106*69921123SKonstantin Belousov done:
107*69921123SKonstantin Belousov 	sverrno = errno;
108*69921123SKonstantin Belousov 	if (freebsd11_fts_close(ftsp) != 0 && error == 0)
109*69921123SKonstantin Belousov 		error = -1;
110*69921123SKonstantin Belousov 	else
111*69921123SKonstantin Belousov 		errno = sverrno;
112*69921123SKonstantin Belousov 	return (error);
113*69921123SKonstantin Belousov }
114*69921123SKonstantin Belousov 
115*69921123SKonstantin Belousov __sym_compat(nftw, freebsd11_nftw, FBSD_1.0);
116