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