169921123SKonstantin Belousov /* $OpenBSD: ftw.c,v 1.5 2005/08/08 08:05:34 espie Exp $ */ 269921123SKonstantin Belousov 369921123SKonstantin Belousov /* 469921123SKonstantin Belousov * Copyright (c) 2003, 2004 Todd C. Miller <Todd.Miller@courtesan.com> 569921123SKonstantin Belousov * 669921123SKonstantin Belousov * Permission to use, copy, modify, and distribute this software for any 769921123SKonstantin Belousov * purpose with or without fee is hereby granted, provided that the above 869921123SKonstantin Belousov * copyright notice and this permission notice appear in all copies. 969921123SKonstantin Belousov * 1069921123SKonstantin Belousov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1169921123SKonstantin Belousov * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1269921123SKonstantin Belousov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1369921123SKonstantin Belousov * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1469921123SKonstantin Belousov * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1569921123SKonstantin Belousov * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1669921123SKonstantin Belousov * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1769921123SKonstantin Belousov * 1869921123SKonstantin Belousov * Sponsored in part by the Defense Advanced Research Projects 1969921123SKonstantin Belousov * Agency (DARPA) and Air Force Research Laboratory, Air Force 2069921123SKonstantin Belousov * Materiel Command, USAF, under agreement number F39502-99-1-0512. 2169921123SKonstantin Belousov * 22*c1920558SJohn Baldwin * From: FreeBSD: head/lib/libc/gen/ftw.c 239151 2012-08-09 15:11:38Z jilles 2369921123SKonstantin Belousov */ 2469921123SKonstantin Belousov 2569921123SKonstantin Belousov #include <sys/cdefs.h> 2669921123SKonstantin Belousov __FBSDID("$FreeBSD$"); 2769921123SKonstantin Belousov 2869921123SKonstantin Belousov #include <sys/types.h> 2969921123SKonstantin Belousov #include <sys/stat.h> 3069921123SKonstantin Belousov #include <errno.h> 3169921123SKonstantin Belousov #include <fts.h> 3269921123SKonstantin Belousov #include <ftw.h> 3369921123SKonstantin Belousov 3469921123SKonstantin Belousov #include "fts-compat11.h" 3569921123SKonstantin Belousov 3669921123SKonstantin Belousov int 3769921123SKonstantin Belousov freebsd11_ftw(const char *path, 3869921123SKonstantin Belousov int (*fn)(const char *, const struct freebsd11_stat *, int), int nfds) 3969921123SKonstantin Belousov { 4069921123SKonstantin Belousov char * const paths[2] = { (char *)path, NULL }; 4169921123SKonstantin Belousov FTSENT11 *cur; 4269921123SKonstantin Belousov FTS11 *ftsp; 4369921123SKonstantin Belousov int error = 0, fnflag, sverrno; 4469921123SKonstantin Belousov 4569921123SKonstantin Belousov /* XXX - nfds is currently unused */ 4669921123SKonstantin Belousov if (nfds < 1) { 4769921123SKonstantin Belousov errno = EINVAL; 4869921123SKonstantin Belousov return (-1); 4969921123SKonstantin Belousov } 5069921123SKonstantin Belousov 5169921123SKonstantin Belousov ftsp = freebsd11_fts_open(paths, 5269921123SKonstantin Belousov FTS_LOGICAL | FTS_COMFOLLOW | FTS_NOCHDIR, NULL); 5369921123SKonstantin Belousov if (ftsp == NULL) 5469921123SKonstantin Belousov return (-1); 5569921123SKonstantin Belousov while ((cur = freebsd11_fts_read(ftsp)) != NULL) { 5669921123SKonstantin Belousov switch (cur->fts_info) { 5769921123SKonstantin Belousov case FTS_D: 5869921123SKonstantin Belousov fnflag = FTW_D; 5969921123SKonstantin Belousov break; 6069921123SKonstantin Belousov case FTS_DNR: 6169921123SKonstantin Belousov fnflag = FTW_DNR; 6269921123SKonstantin Belousov break; 6369921123SKonstantin Belousov case FTS_DP: 6469921123SKonstantin Belousov /* we only visit in preorder */ 6569921123SKonstantin Belousov continue; 6669921123SKonstantin Belousov case FTS_F: 6769921123SKonstantin Belousov case FTS_DEFAULT: 6869921123SKonstantin Belousov fnflag = FTW_F; 6969921123SKonstantin Belousov break; 7069921123SKonstantin Belousov case FTS_NS: 7169921123SKonstantin Belousov case FTS_NSOK: 7269921123SKonstantin Belousov case FTS_SLNONE: 7369921123SKonstantin Belousov fnflag = FTW_NS; 7469921123SKonstantin Belousov break; 7569921123SKonstantin Belousov case FTS_SL: 7669921123SKonstantin Belousov fnflag = FTW_SL; 7769921123SKonstantin Belousov break; 7869921123SKonstantin Belousov case FTS_DC: 7969921123SKonstantin Belousov errno = ELOOP; 8069921123SKonstantin Belousov /* FALLTHROUGH */ 8169921123SKonstantin Belousov default: 8269921123SKonstantin Belousov error = -1; 8369921123SKonstantin Belousov goto done; 8469921123SKonstantin Belousov } 8569921123SKonstantin Belousov error = fn(cur->fts_path, cur->fts_statp, fnflag); 8669921123SKonstantin Belousov if (error != 0) 8769921123SKonstantin Belousov break; 8869921123SKonstantin Belousov } 8969921123SKonstantin Belousov done: 9069921123SKonstantin Belousov sverrno = errno; 9169921123SKonstantin Belousov if (freebsd11_fts_close(ftsp) != 0 && error == 0) 9269921123SKonstantin Belousov error = -1; 9369921123SKonstantin Belousov else 9469921123SKonstantin Belousov errno = sverrno; 9569921123SKonstantin Belousov return (error); 9669921123SKonstantin Belousov } 9769921123SKonstantin Belousov 9869921123SKonstantin Belousov __sym_compat(ftw, freebsd11_ftw, FBSD_1.0); 99