xref: /freebsd/lib/libc/gen/ftw-compat11.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
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