summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/fts.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/fts.c')
-rw-r--r--lib/libc/gen/fts.c209
1 files changed, 103 insertions, 106 deletions
diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c
index 26d67ff..6220dc6 100644
--- a/lib/libc/gen/fts.c
+++ b/lib/libc/gen/fts.c
@@ -1,5 +1,3 @@
-/* $OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $ */
-
/*-
* Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
@@ -31,16 +29,18 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $
*/
#if defined(LIBC_SCCS) && !defined(lint)
-#if 0
static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94";
-#else
-static char rcsid[] = "$OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $";
-#endif
#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include "namespace.h"
+#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
@@ -51,17 +51,18 @@ static char rcsid[] = "$OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $"
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-
-static FTSENT *fts_alloc __P((FTS *, char *, int));
-static FTSENT *fts_build __P((FTS *, int));
-static void fts_lfree __P((FTSENT *));
-static void fts_load __P((FTS *, FTSENT *));
-static size_t fts_maxarglen __P((char * const *));
-static void fts_padjust __P((FTS *, FTSENT *));
-static int fts_palloc __P((FTS *, size_t));
-static FTSENT *fts_sort __P((FTS *, FTSENT *, int));
-static u_short fts_stat __P((FTS *, FTSENT *, int));
-static int fts_safe_changedir __P((FTS *, FTSENT *, int));
+#include "un-namespace.h"
+
+static FTSENT *fts_alloc(FTS *, char *, int);
+static FTSENT *fts_build(FTS *, int);
+static void fts_lfree(FTSENT *);
+static void fts_load(FTS *, FTSENT *);
+static size_t fts_maxarglen(char * const *);
+static void fts_padjust(FTS *, FTSENT *);
+static int fts_palloc(FTS *, size_t);
+static FTSENT *fts_sort(FTS *, FTSENT *, int);
+static u_short fts_stat(FTS *, FTSENT *, int);
+static int fts_safe_changedir(FTS *, FTSENT *, int, char *);
#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
@@ -69,7 +70,6 @@ static int fts_safe_changedir __P((FTS *, FTSENT *, int));
#define ISSET(opt) (sp->fts_options & (opt))
#define SET(opt) (sp->fts_options |= (opt))
-#define CHDIR(sp, path) (!ISSET(FTS_NOCHDIR) && chdir(path))
#define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd))
/* fts_build flags */
@@ -80,12 +80,12 @@ static int fts_safe_changedir __P((FTS *, FTSENT *, int));
FTS *
fts_open(argv, options, compar)
char * const *argv;
- register int options;
- int (*compar) __P((const FTSENT **, const FTSENT **));
+ int options;
+ int (*compar)(const FTSENT **, const FTSENT **);
{
- register FTS *sp;
- register FTSENT *p, *root;
- register int nitems;
+ FTS *sp;
+ FTSENT *p, *root;
+ int nitems;
FTSENT *parent, *tmp;
int len;
@@ -102,6 +102,9 @@ fts_open(argv, options, compar)
sp->fts_compar = compar;
sp->fts_options = options;
+ /* Shush, GCC. */
+ tmp = NULL;
+
/* Logical walks turn on NOCHDIR; symbolic links are too hard. */
if (ISSET(FTS_LOGICAL))
SET(FTS_NOCHDIR);
@@ -119,7 +122,7 @@ fts_open(argv, options, compar)
parent->fts_level = FTS_ROOTPARENTLEVEL;
/* Allocate/initialize root(s). */
- for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) {
+ for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
/* Don't allow zero-length paths. */
if ((len = strlen(*argv)) == 0) {
errno = ENOENT;
@@ -173,7 +176,7 @@ fts_open(argv, options, compar)
* and ".." are all fairly nasty problems. Note, if we can't get the
* descriptor we run anyway, just more slowly.
*/
- if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0)
+ if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = _open(".", O_RDONLY, 0)) < 0)
SET(FTS_NOCHDIR);
return (sp);
@@ -188,10 +191,10 @@ mem1: free(sp);
static void
fts_load(sp, p)
FTS *sp;
- register FTSENT *p;
+ FTSENT *p;
{
- register int len;
- register char *cp;
+ int len;
+ char *cp;
/*
* Load the stream structure for the next traversal. Since we don't
@@ -215,7 +218,7 @@ int
fts_close(sp)
FTS *sp;
{
- register FTSENT *freep, *p;
+ FTSENT *freep, *p;
int saved_errno;
/*
@@ -226,7 +229,7 @@ fts_close(sp)
if (sp->fts_cur) {
for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
freep = p;
- p = p->fts_link ? p->fts_link : p->fts_parent;
+ p = p->fts_link != NULL ? p->fts_link : p->fts_parent;
free(freep);
}
free(p);
@@ -242,15 +245,15 @@ fts_close(sp)
/* Return to original directory, save errno if necessary. */
if (!ISSET(FTS_NOCHDIR)) {
saved_errno = fchdir(sp->fts_rfd) ? errno : 0;
- (void)close(sp->fts_rfd);
- }
+ (void)_close(sp->fts_rfd);
- /* Set errno and return. */
- if (!ISSET(FTS_NOCHDIR) && saved_errno) {
- /* Free up the stream pointer. */
- free(sp);
- errno = saved_errno;
- return (-1);
+ /* Set errno and return. */
+ if (saved_errno != 0) {
+ /* Free up the stream pointer. */
+ free(sp);
+ errno = saved_errno;
+ return (-1);
+ }
}
/* Free up the stream pointer. */
@@ -268,11 +271,12 @@ fts_close(sp)
FTSENT *
fts_read(sp)
- register FTS *sp;
+ FTS *sp;
{
- register FTSENT *p, *tmp;
- register int instr;
- register char *t;
+ struct stat sb;
+ FTSENT *p, *tmp;
+ int instr;
+ char *t;
int saved_errno;
/* If finished or unrecoverable error, return NULL. */
@@ -302,7 +306,7 @@ fts_read(sp)
(p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
p->fts_info = fts_stat(sp, p, 1);
if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
- if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) {
+ if ((p->fts_symfd = _open(".", O_RDONLY, 0)) < 0) {
p->fts_errno = errno;
p->fts_info = FTS_ERR;
} else
@@ -317,7 +321,7 @@ fts_read(sp)
if (instr == FTS_SKIP ||
(ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev)) {
if (p->fts_flags & FTS_SYMFOLLOW)
- (void)close(p->fts_symfd);
+ (void)_close(p->fts_symfd);
if (sp->fts_child) {
fts_lfree(sp->fts_child);
sp->fts_child = NULL;
@@ -327,7 +331,7 @@ fts_read(sp)
}
/* Rebuild if only read the names and now traversing. */
- if (sp->fts_child && ISSET(FTS_NAMEONLY)) {
+ if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) {
CLR(FTS_NAMEONLY);
fts_lfree(sp->fts_child);
sp->fts_child = NULL;
@@ -345,11 +349,12 @@ fts_read(sp)
* If haven't read do so. If the read fails, fts_build sets
* FTS_STOP or the fts_info field of the node.
*/
- if (sp->fts_child) {
- if (fts_safe_changedir(sp, p, -1)) {
+ if (sp->fts_child != NULL) {
+ if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
p->fts_errno = errno;
p->fts_flags |= FTS_DONTCHDIR;
- for (p = sp->fts_child; p; p = p->fts_link)
+ for (p = sp->fts_child; p != NULL;
+ p = p->fts_link)
p->fts_accpath =
p->fts_parent->fts_accpath;
}
@@ -365,7 +370,7 @@ fts_read(sp)
/* Move to the next node on this level. */
next: tmp = p;
- if ((p = p->fts_link)) {
+ if ((p = p->fts_link) != NULL) {
free(tmp);
/*
@@ -392,7 +397,7 @@ next: tmp = p;
p->fts_info = fts_stat(sp, p, 1);
if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
if ((p->fts_symfd =
- open(".", O_RDONLY, 0)) < 0) {
+ _open(".", O_RDONLY, 0)) < 0) {
p->fts_errno = errno;
p->fts_info = FTS_ERR;
} else
@@ -437,17 +442,16 @@ name: t = sp->fts_path + NAPPEND(p->fts_parent);
} else if (p->fts_flags & FTS_SYMFOLLOW) {
if (FCHDIR(sp, p->fts_symfd)) {
saved_errno = errno;
- (void)close(p->fts_symfd);
+ (void)_close(p->fts_symfd);
errno = saved_errno;
SET(FTS_STOP);
return (NULL);
}
- (void)close(p->fts_symfd);
- } else if (!(p->fts_flags & FTS_DONTCHDIR)) {
- if (CHDIR(sp, "..")) {
- SET(FTS_STOP);
- return (NULL);
- }
+ (void)_close(p->fts_symfd);
+ } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+ fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
+ SET(FTS_STOP);
+ return (NULL);
}
p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
return (sp->fts_cur = p);
@@ -466,7 +470,7 @@ fts_set(sp, p, instr)
FTSENT *p;
int instr;
{
- if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
+ if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
instr != FTS_NOINSTR && instr != FTS_SKIP) {
errno = EINVAL;
return (1);
@@ -477,13 +481,13 @@ fts_set(sp, p, instr)
FTSENT *
fts_children(sp, instr)
- register FTS *sp;
+ FTS *sp;
int instr;
{
- register FTSENT *p;
+ FTSENT *p;
int fd;
- if (instr && instr != FTS_NAMEONLY) {
+ if (instr != 0 && instr != FTS_NAMEONLY) {
errno = EINVAL;
return (NULL);
}
@@ -514,7 +518,7 @@ fts_children(sp, instr)
return (NULL);
/* Free up any previous child list. */
- if (sp->fts_child)
+ if (sp->fts_child != NULL)
fts_lfree(sp->fts_child);
if (instr == FTS_NAMEONLY) {
@@ -534,12 +538,12 @@ fts_children(sp, instr)
ISSET(FTS_NOCHDIR))
return (sp->fts_child = fts_build(sp, instr));
- if ((fd = open(".", O_RDONLY, 0)) < 0)
+ if ((fd = _open(".", O_RDONLY, 0)) < 0)
return (NULL);
sp->fts_child = fts_build(sp, instr);
if (fchdir(fd))
return (NULL);
- (void)close(fd);
+ (void)_close(fd);
return (sp->fts_child);
}
@@ -559,12 +563,12 @@ fts_children(sp, instr)
*/
static FTSENT *
fts_build(sp, type)
- register FTS *sp;
+ FTS *sp;
int type;
{
- register struct dirent *dp;
- register FTSENT *p, *head;
- register int nitems;
+ struct dirent *dp;
+ FTSENT *p, *head;
+ int nitems;
FTSENT *cur, *tail;
DIR *dirp;
void *oldaddr;
@@ -600,9 +604,11 @@ fts_build(sp, type)
* directory if we're cheating on stat calls, 0 if we're not doing
* any stat calls at all, -1 if we're doing stats on everything.
*/
- if (type == BNAMES)
+ if (type == BNAMES) {
nlinks = 0;
- else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
+ /* Be quiet about nostat, GCC. */
+ nostat = 0;
+ } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2);
nostat = 1;
} else {
@@ -632,7 +638,7 @@ fts_build(sp, type)
*/
cderrno = 0;
if (nlinks || type == BREAD) {
- if (fts_safe_changedir(sp, cur, dirfd(dirp))) {
+ if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) {
if (nlinks && type == BREAD)
cur->fts_errno = errno;
cur->fts_flags |= FTS_DONTCHDIR;
@@ -659,6 +665,9 @@ fts_build(sp, type)
if (ISSET(FTS_NOCHDIR)) {
cp = sp->fts_path + len;
*cp++ = '/';
+ } else {
+ /* GCC, you're too verbose. */
+ cp = NULL;
}
len++;
maxlen = sp->fts_pathlen - len;
@@ -675,7 +684,7 @@ fts_build(sp, type)
goto mem1;
if (dp->d_namlen >= maxlen) { /* include space for NUL */
oldaddr = sp->fts_path;
- if (fts_palloc(sp, dp->d_namlen +len + 1)) {
+ if (fts_palloc(sp, dp->d_namlen + len + 1)) {
/*
* No more memory for path or structures. Save
* errno, free up the current structure and the
@@ -795,7 +804,8 @@ mem1: saved_errno = errno;
*/
if (descend && (type == BCHILD || !nitems) &&
(cur->fts_level == FTS_ROOTLEVEL ?
- FCHDIR(sp, sp->fts_rfd) : CHDIR(sp, ".."))) {
+ FCHDIR(sp, sp->fts_rfd) :
+ fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
cur->fts_info = FTS_ERR;
SET(FTS_STOP);
return (NULL);
@@ -817,12 +827,12 @@ mem1: saved_errno = errno;
static u_short
fts_stat(sp, p, follow)
FTS *sp;
- register FTSENT *p;
+ FTSENT *p;
int follow;
{
- register FTSENT *t;
- register dev_t dev;
- register ino_t ino;
+ FTSENT *t;
+ dev_t dev;
+ ino_t ino;
struct stat *sbp, sb;
int saved_errno;
@@ -901,9 +911,9 @@ static FTSENT *
fts_sort(sp, head, nitems)
FTS *sp;
FTSENT *head;
- register int nitems;
+ int nitems;
{
- register FTSENT **ap, *p;
+ FTSENT **ap, *p;
/*
* Construct an array of pointers to the structures and call qsort(3).
@@ -913,18 +923,12 @@ fts_sort(sp, head, nitems)
* 40 so don't realloc one entry at a time.
*/
if (nitems > sp->fts_nitems) {
- struct _ftsent **a;
-
sp->fts_nitems = nitems + 40;
- if ((a = realloc(sp->fts_array,
+ if ((sp->fts_array = reallocf(sp->fts_array,
sp->fts_nitems * sizeof(FTSENT *))) == NULL) {
- if (sp->fts_array)
- free(sp->fts_array);
- sp->fts_array = NULL;
sp->fts_nitems = 0;
return (head);
}
- sp->fts_array = a;
}
for (ap = sp->fts_array, p = head; p; p = p->fts_link)
*ap++ = p;
@@ -939,9 +943,9 @@ static FTSENT *
fts_alloc(sp, name, namelen)
FTS *sp;
char *name;
- register int namelen;
+ int namelen;
{
- register FTSENT *p;
+ FTSENT *p;
size_t len;
/*
@@ -976,9 +980,9 @@ fts_alloc(sp, name, namelen)
static void
fts_lfree(head)
- register FTSENT *head;
+ FTSENT *head;
{
- register FTSENT *p;
+ FTSENT *p;
/* Free a linked list of structures. */
while ((p = head)) {
@@ -998,7 +1002,6 @@ fts_palloc(sp, more)
FTS *sp;
size_t more;
{
- char *p;
sp->fts_pathlen += more + 256;
/*
@@ -1013,15 +1016,8 @@ fts_palloc(sp, more)
errno = ENAMETOOLONG;
return (1);
}
- p = realloc(sp->fts_path, sp->fts_pathlen);
- if (p == NULL) {
- if (sp->fts_path)
- free(sp->fts_path);
- sp->fts_path = NULL;
- return (1);
- }
- sp->fts_path = p;
- return (0);
+ sp->fts_path = reallocf(sp->fts_path, sp->fts_pathlen);
+ return (sp->fts_path == NULL);
}
/*
@@ -1036,13 +1032,13 @@ fts_padjust(sp, head)
FTSENT *p;
char *addr = sp->fts_path;
-#define ADJUST(p) { \
+#define ADJUST(p) do { \
if ((p)->fts_accpath != (p)->fts_name) { \
(p)->fts_accpath = \
(char *)addr + ((p)->fts_accpath - (p)->fts_path); \
} \
(p)->fts_path = addr; \
-}
+} while (0)
/* Adjust the current set of children. */
for (p = sp->fts_child; p; p = p->fts_link)
ADJUST(p);
@@ -1072,10 +1068,11 @@ fts_maxarglen(argv)
* Assumes p->fts_dev and p->fts_ino are filled in.
*/
static int
-fts_safe_changedir(sp, p, fd)
+fts_safe_changedir(sp, p, fd, path)
FTS *sp;
FTSENT *p;
int fd;
+ char *path;
{
int ret, oerrno, newfd;
struct stat sb;
@@ -1083,9 +1080,9 @@ fts_safe_changedir(sp, p, fd)
newfd = fd;
if (ISSET(FTS_NOCHDIR))
return (0);
- if (fd < 0 && (newfd = open(p->fts_accpath, O_RDONLY, 0)) < 0)
+ if (fd < 0 && (newfd = _open(path, O_RDONLY, 0)) < 0)
return (-1);
- if (fstat(newfd, &sb)) {
+ if (_fstat(newfd, &sb)) {
ret = -1;
goto bail;
}
@@ -1098,7 +1095,7 @@ fts_safe_changedir(sp, p, fd)
bail:
oerrno = errno;
if (fd < 0)
- (void)close(newfd);
+ (void)_close(newfd);
errno = oerrno;
return (ret);
}
OpenPOWER on IntegriCloud