Blame src/lib/libast/comp/nftw.c

Packit Service a8c26c
/***********************************************************************
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*               This software is part of the ast package               *
Packit Service a8c26c
*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
Packit Service a8c26c
*                      and is licensed under the                       *
Packit Service a8c26c
*                 Eclipse Public License, Version 1.0                  *
Packit Service a8c26c
*                    by AT&T Intellectual Property                     *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                A copy of the License is available at                 *
Packit Service a8c26c
*          http://www.eclipse.org/org/documents/epl-v10.html           *
Packit Service a8c26c
*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*              Information and Software Systems Research               *
Packit Service a8c26c
*                            AT&T Research                             *
Packit Service a8c26c
*                           Florham Park NJ                            *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                 Glenn Fowler <gsf@research.att.com>                  *
Packit Service a8c26c
*                  David Korn <dgk@research.att.com>                   *
Packit Service a8c26c
*                   Phong Vo <kpv@research.att.com>                    *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
***********************************************************************/
Packit Service a8c26c
#pragma prototyped
Packit Service a8c26c
/*
Packit Service a8c26c
 * nftw implementation
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
#include <ast.h>
Packit Service a8c26c
#include <ftw.h>
Packit Service a8c26c
Packit Service a8c26c
static int	nftw_flags;
Packit Service a8c26c
static int	(*nftw_userf)(const char*, const struct stat*, int, struct FTW*);
Packit Service a8c26c
Packit Service a8c26c
static int
Packit Service a8c26c
nftw_user(Ftw_t* ftw)
Packit Service a8c26c
{
Packit Service a8c26c
	register int	n = ftw->info;
Packit Service a8c26c
	struct FTW	nftw;
Packit Service a8c26c
	struct stat	st;
Packit Service a8c26c
Packit Service a8c26c
	if (n & (FTW_C|FTW_NX))
Packit Service a8c26c
		n = FTW_DNR;
Packit Service a8c26c
	else if ((n & FTW_SL) && (!(nftw_flags & FTW_PHYSICAL) || stat(ftw->path, &st)))
Packit Service a8c26c
		n = FTW_SLN;
Packit Service a8c26c
	nftw.base = ftw->pathlen - ftw->namelen;
Packit Service a8c26c
	nftw.level = ftw->level;
Packit Service a8c26c
	nftw.quit = 0;
Packit Service a8c26c
	n = (*nftw_userf)(ftw->path, &ftw->statb, n, &nftw);
Packit Service a8c26c
	ftw->status = nftw.quit;
Packit Service a8c26c
	return n;
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
int
Packit Service a8c26c
nftw(const char* path, int(*userf)(const char*, const struct stat*, int, struct FTW*), int depth, int flags)
Packit Service a8c26c
{
Packit Service a8c26c
	NoP(depth);
Packit Service a8c26c
	nftw_userf = userf;
Packit Service a8c26c
	if (flags & FTW_CHDIR) flags &= ~FTW_DOT;
Packit Service a8c26c
	else flags |= FTW_DOT;
Packit Service a8c26c
	nftw_flags = flags;
Packit Service a8c26c
	return ftwalk(path, nftw_user, flags, NiL);
Packit Service a8c26c
}