#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fts.h>
#include <ftw.h>
#include "fts-compat11.h"
int freebsd11_ftw(const char *path, int (*fn)(const char *,
const struct freebsd11_stat *, int), int nfds);
int
freebsd11_ftw(const char *path,
int (*fn)(const char *, const struct freebsd11_stat *, int), int nfds)
{
char * const paths[2] = { (char *)path, NULL };
FTSENT11 *cur;
FTS11 *ftsp;
int error = 0, fnflag, sverrno;
if (nfds < 1) {
errno = EINVAL;
return (-1);
}
ftsp = freebsd11_fts_open(paths,
FTS_LOGICAL | FTS_COMFOLLOW | FTS_NOCHDIR, NULL);
if (ftsp == NULL)
return (-1);
while ((cur = freebsd11_fts_read(ftsp)) != NULL) {
switch (cur->fts_info) {
case FTS_D:
fnflag = FTW_D;
break;
case FTS_DNR:
fnflag = FTW_DNR;
break;
case FTS_DP:
continue;
case FTS_F:
case FTS_DEFAULT:
fnflag = FTW_F;
break;
case FTS_NS:
case FTS_NSOK:
case FTS_SLNONE:
fnflag = FTW_NS;
break;
case FTS_SL:
fnflag = FTW_SL;
break;
case FTS_DC:
errno = ELOOP;
default:
error = -1;
goto done;
}
error = fn(cur->fts_path, cur->fts_statp, fnflag);
if (error != 0)
break;
}
done:
sverrno = errno;
if (freebsd11_fts_close(ftsp) != 0 && error == 0)
error = -1;
else
errno = sverrno;
return (error);
}
__sym_compat(ftw, freebsd11_ftw, FBSD_1.0);