summaryrefslogtreecommitdiff
path: root/io/fts.c
diff options
context:
space:
mode:
Diffstat (limited to 'io/fts.c')
-rw-r--r--io/fts.c148
1 files changed, 90 insertions, 58 deletions
diff --git a/io/fts.c b/io/fts.c
index f83267611f..e8d32a2327 100644
--- a/io/fts.c
+++ b/io/fts.c
@@ -1,3 +1,21 @@
+/* File tree traversal functions.
+ Copyright (C) 1994-2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
/*-
* Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
@@ -53,16 +71,30 @@ static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94";
#endif
-static FTSENT *fts_alloc (FTS *, const char *, size_t) internal_function;
-static FTSENT *fts_build (FTS *, int) internal_function;
-static void fts_lfree (FTSENT *) internal_function;
-static void fts_load (FTS *, FTSENT *) internal_function;
+/* Support for the LFS API version. */
+#ifndef FTS_OPEN
+#define FTS_OPEN fts_open
+#define FTS_CLOSE fts_close
+#define FTS_READ fts_read
+#define FTS_SET fts_set
+#define FTS_CHILDREN fts_children
+# define FTSOBJ FTS
+# define FTSENTRY FTSENT
+# define INO_T ino_t
+# define STAT stat
+# define LSTAT lstat
+#endif
+
+static FTSENTRY *fts_alloc (FTSOBJ *, const char *, size_t) internal_function;
+static FTSENTRY *fts_build (FTSOBJ *, int) internal_function;
+static void fts_lfree (FTSENTRY *) internal_function;
+static void fts_load (FTSOBJ *, FTSENTRY *) internal_function;
static size_t fts_maxarglen (char * const *) internal_function;
-static void fts_padjust (FTS *, FTSENT *) internal_function;
-static int fts_palloc (FTS *, size_t) internal_function;
-static FTSENT *fts_sort (FTS *, FTSENT *, int) internal_function;
-static u_short fts_stat (FTS *, FTSENT *, int) internal_function;
-static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
+static void fts_padjust (FTSOBJ *, FTSENTRY *) internal_function;
+static int fts_palloc (FTSOBJ *, size_t) internal_function;
+static FTSENTRY *fts_sort (FTSOBJ *, FTSENTRY *, int) internal_function;
+static u_short fts_stat (FTSOBJ *, FTSENTRY *, int) internal_function;
+static int fts_safe_changedir (FTSOBJ *, FTSENTRY *, int, const char *)
internal_function;
#ifndef MAX
@@ -84,15 +116,15 @@ static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
#define BNAMES 2 /* fts_children, names only */
#define BREAD 3 /* fts_read */
-FTS *
-fts_open (char * const *argv, int options,
- int (*compar) (const FTSENT **, const FTSENT **))
+FTSOBJ *
+FTS_OPEN (char * const *argv, int options,
+ int (*compar) (const FTSENTRY **, const FTSENTRY **))
{
- FTS *sp;
- FTSENT *p, *root;
+ FTSOBJ *sp;
+ FTSENTRY *p, *root;
int nitems;
- FTSENT *parent = NULL;
- FTSENT *tmp;
+ FTSENTRY *parent = NULL;
+ FTSENTRY *tmp;
/* Options check. */
if (options & ~FTS_OPTIONMASK) {
@@ -101,9 +133,9 @@ fts_open (char * const *argv, int options,
}
/* Allocate/initialize the stream */
- if ((sp = malloc((u_int)sizeof(FTS))) == NULL)
+ if ((sp = malloc((u_int)sizeof(FTSOBJ))) == NULL)
return (NULL);
- memset(sp, 0, sizeof(FTS));
+ memset(sp, 0, sizeof(FTSOBJ));
sp->fts_compar = (int (*) (const void *, const void *)) compar;
sp->fts_options = options;
@@ -200,7 +232,7 @@ mem1: free(sp);
static void
internal_function
-fts_load (FTS *sp, FTSENT *p)
+fts_load (FTSOBJ *sp, FTSENTRY *p)
{
int len;
char *cp;
@@ -224,9 +256,9 @@ fts_load (FTS *sp, FTSENT *p)
}
int
-fts_close (FTS *sp)
+FTS_CLOSE (FTSOBJ *sp)
{
- FTSENT *freep, *p;
+ FTSENTRY *freep, *p;
int saved_errno;
/*
@@ -276,10 +308,10 @@ fts_close (FTS *sp)
(p->fts_path[p->fts_pathlen - 1] == '/' \
? p->fts_pathlen - 1 : p->fts_pathlen)
-FTSENT *
-fts_read (FTS *sp)
+FTSENTRY *
+FTS_READ (FTSOBJ *sp)
{
- FTSENT *p, *tmp;
+ FTSENTRY *p, *tmp;
int instr;
char *t;
int saved_errno;
@@ -473,7 +505,7 @@ name: t = sp->fts_path + NAPPEND(p->fts_parent);
*/
/* ARGSUSED */
int
-fts_set (FTS *sp, FTSENT *p, int instr)
+FTS_SET (FTSOBJ *sp, FTSENTRY *p, int instr)
{
if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
instr != FTS_NOINSTR && instr != FTS_SKIP) {
@@ -484,10 +516,10 @@ fts_set (FTS *sp, FTSENT *p, int instr)
return (0);
}
-FTSENT *
-fts_children (FTS *sp, int instr)
+FTSENTRY *
+FTS_CHILDREN(FTSOBJ *sp, int instr)
{
- FTSENT *p;
+ FTSENTRY *p;
int fd;
if (instr != 0 && instr != FTS_NAMEONLY) {
@@ -574,14 +606,14 @@ dirent_not_directory(const struct dirent *dp)
* directories and for any files after the subdirectories in the directory have
* been found, cutting the stat calls by about 2/3.
*/
-static FTSENT *
+static FTSENTRY *
internal_function
-fts_build (FTS *sp, int type)
+fts_build (FTSOBJ *sp, int type)
{
struct dirent *dp;
- FTSENT *p, *head;
+ FTSENTRY *p, *head;
int nitems;
- FTSENT *cur, *tail;
+ FTSENTRY *cur, *tail;
DIR *dirp;
void *oldaddr;
int cderrno, descend, len, level, nlinks, saved_errno,
@@ -839,12 +871,12 @@ mem1: saved_errno = errno;
static u_short
internal_function
-fts_stat (FTS *sp, FTSENT *p, int follow)
+fts_stat (FTSOBJ *sp, FTSENTRY *p, int follow)
{
- FTSENT *t;
+ FTSENTRY *t;
dev_t dev;
- ino_t ino;
- struct stat *sbp, sb;
+ INO_T ino;
+ struct STAT *sbp, sb;
int saved_errno;
/* If user needs stat info, stat buffer already allocated. */
@@ -867,18 +899,18 @@ fts_stat (FTS *sp, FTSENT *p, int follow)
* fail, set the errno from the stat call.
*/
if (ISSET(FTS_LOGICAL) || follow) {
- if (stat(p->fts_accpath, sbp)) {
+ if (STAT(p->fts_accpath, sbp)) {
saved_errno = errno;
- if (!lstat(p->fts_accpath, sbp)) {
+ if (!LSTAT(p->fts_accpath, sbp)) {
__set_errno (0);
return (FTS_SLNONE);
}
p->fts_errno = saved_errno;
goto err;
}
- } else if (lstat(p->fts_accpath, sbp)) {
+ } else if (LSTAT(p->fts_accpath, sbp)) {
p->fts_errno = errno;
-err: memset(sbp, 0, sizeof(struct stat));
+err: memset(sbp, 0, sizeof(struct STAT));
return (FTS_NS);
}
@@ -918,11 +950,11 @@ err: memset(sbp, 0, sizeof(struct stat));
return (FTS_DEFAULT);
}
-static FTSENT *
+static FTSENTRY *
internal_function
-fts_sort (FTS *sp, FTSENT *head, int nitems)
+fts_sort (FTSOBJ *sp, FTSENTRY *head, int nitems)
{
- FTSENT **ap, *p;
+ FTSENTRY **ap, *p;
/*
* Construct an array of pointers to the structures and call qsort(3).
@@ -932,11 +964,11 @@ fts_sort (FTS *sp, FTSENT *head, int nitems)
* 40 so don't realloc one entry at a time.
*/
if (nitems > sp->fts_nitems) {
- struct _ftsent **a;
+ FTSENTRY **a;
sp->fts_nitems = nitems + 40;
if ((a = realloc(sp->fts_array,
- (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) {
+ (size_t)(sp->fts_nitems * sizeof(FTSENTRY *)))) == NULL) {
free(sp->fts_array);
sp->fts_array = NULL;
sp->fts_nitems = 0;
@@ -946,18 +978,18 @@ fts_sort (FTS *sp, FTSENT *head, int nitems)
}
for (ap = sp->fts_array, p = head; p; p = p->fts_link)
*ap++ = p;
- qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar);
+ qsort((void *)sp->fts_array, nitems, sizeof(FTSENTRY *), sp->fts_compar);
for (head = *(ap = sp->fts_array); --nitems; ++ap)
ap[0]->fts_link = ap[1];
ap[0]->fts_link = NULL;
return (head);
}
-static FTSENT *
+static FTSENTRY *
internal_function
-fts_alloc (FTS *sp, const char *name, size_t namelen)
+fts_alloc (FTSOBJ *sp, const char *name, size_t namelen)
{
- FTSENT *p;
+ FTSENTRY *p;
size_t len;
/*
@@ -968,9 +1000,9 @@ fts_alloc (FTS *sp, const char *name, size_t namelen)
* fts_name field is declared to be of size 1, the fts_name pointer is
* namelen + 2 before the first possible address of the stat structure.
*/
- len = sizeof(FTSENT) + namelen;
+ len = sizeof(FTSENTRY) + namelen;
if (!ISSET(FTS_NOSTAT))
- len += sizeof(struct stat) + ALIGNBYTES;
+ len += sizeof(struct STAT) + ALIGNBYTES;
if ((p = malloc(len)) == NULL)
return (NULL);
@@ -979,7 +1011,7 @@ fts_alloc (FTS *sp, const char *name, size_t namelen)
p->fts_name[namelen] = '\0';
if (!ISSET(FTS_NOSTAT))
- p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2);
+ p->fts_statp = (struct STAT *)ALIGN(p->fts_name + namelen + 2);
p->fts_namelen = namelen;
p->fts_path = sp->fts_path;
p->fts_errno = 0;
@@ -992,9 +1024,9 @@ fts_alloc (FTS *sp, const char *name, size_t namelen)
static void
internal_function
-fts_lfree (FTSENT *head)
+fts_lfree (FTSENTRY *head)
{
- FTSENT *p;
+ FTSENTRY *p;
/* Free a linked list of structures. */
while ((p = head)) {
@@ -1011,7 +1043,7 @@ fts_lfree (FTSENT *head)
*/
static int
internal_function
-fts_palloc (FTS *sp, size_t more)
+fts_palloc (FTSOBJ *sp, size_t more)
{
char *p;
@@ -1043,9 +1075,9 @@ fts_palloc (FTS *sp, size_t more)
*/
static void
internal_function
-fts_padjust (FTS *sp, FTSENT *head)
+fts_padjust (FTSOBJ *sp, FTSENTRY *head)
{
- FTSENT *p;
+ FTSENTRY *p;
char *addr = sp->fts_path;
#define ADJUST(p) do { \
@@ -1085,7 +1117,7 @@ fts_maxarglen (char * const *argv)
*/
static int
internal_function
-fts_safe_changedir (FTS *sp, FTSENT *p, int fd, const char *path)
+fts_safe_changedir (FTSOBJ *sp, FTSENTRY *p, int fd, const char *path)
{
int ret, oerrno, newfd;
struct stat64 sb;