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 *
22c1920558SJohn 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/types.h>
2669921123SKonstantin Belousov #include <sys/stat.h>
2769921123SKonstantin Belousov #include <errno.h>
2869921123SKonstantin Belousov #include <fts.h>
2969921123SKonstantin Belousov #include <ftw.h>
3069921123SKonstantin Belousov
3169921123SKonstantin Belousov #include "fts-compat11.h"
3269921123SKonstantin Belousov
33*d14f60e9SAlan Somers int freebsd11_ftw(const char *path, int (*fn)(const char *,
34*d14f60e9SAlan Somers const struct freebsd11_stat *, int), int nfds);
35*d14f60e9SAlan Somers
3669921123SKonstantin Belousov int
freebsd11_ftw(const char * path,int (* fn)(const char *,const struct freebsd11_stat *,int),int nfds)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