summaryrefslogtreecommitdiff
path: root/lib/fts.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2022-12-09 15:31:33 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2022-12-09 15:32:04 -0800
commitfc38a5235724d713804e885b17a6110b7eae7a9e (patch)
tree8e43d6cf6025ea3911e5bc55f26839804ffa6634 /lib/fts.c
parent985730d5ecdc3b464105e13e30d6df6627b0233d (diff)
downloadgnulib-fc38a5235724d713804e885b17a6110b7eae7a9e.tar.gz
fts: make debug version compilable again
This fixes things in what I hope is a better way than the fd-only approach proposed by Kamil Dudka here: https://lists.gnu.org/archive/html/bug-gnulib/2018-03/msg00079.html https://lists.gnu.org/archive/html/bug-gnulib/2018-03/msg00080.html * lib/fts.c (GNULIB_FTS_DEBUG): Rename from FTS_DEBUG, to avoid collision with coreutils symbol. Do not include <stdint.h> (not needed, since we include <stdint.h>) or "getcwdat.h" (no longer exists). (fd_ring_check, fd_ring_print): Add forward decls. (struct devino): New type. (PRINT_DEVINO): New macro. (getdevino): New static function. (fd_ring_print): Do nothing if not debugging. (fd_ring_print, fd_ring_check): Use getdevino instead of getcwdat. The output isn’t as good, but at least it compiles and runs.
Diffstat (limited to 'lib/fts.c')
-rw-r--r--lib/fts.c58
1 files changed, 36 insertions, 22 deletions
diff --git a/lib/fts.c b/lib/fts.c
index 74a08f7ec8..2627a75e43 100644
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -252,13 +252,13 @@ static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
#define BNAMES 2 /* fts_children, names only */
#define BREAD 3 /* fts_read */
-#if FTS_DEBUG
+#if GNULIB_FTS_DEBUG
# include <inttypes.h>
-# include <stdint.h>
# include <stdio.h>
-# include "getcwdat.h"
bool fts_debug = false;
# define Dprintf(x) do { if (fts_debug) printf x; } while (false)
+static void fd_ring_check (FTS const *);
+static void fd_ring_print (FTS const *, FILE *, char const *);
#else
# define Dprintf(x)
# define fd_ring_check(x)
@@ -1629,7 +1629,23 @@ mem1: saved_errno = errno;
return (head);
}
-#if FTS_DEBUG
+#if GNULIB_FTS_DEBUG
+
+struct devino {
+ intmax_t dev, ino;
+};
+#define PRINT_DEVINO "(%jd,%jd)"
+
+static struct devino
+getdevino (int fd)
+{
+ struct stat st;
+ return (fd == AT_FDCWD
+ ? (struct devino) { -1, 0 }
+ : fstat (fd, &st) == 0
+ ? (struct devino) { st.st_dev, st.st_ino }
+ : (struct devino) { -1, errno });
+}
/* Walk ->fts_parent links starting at E_CURR, until the root of the
current hierarchy. There should be a directory with dev/inode
@@ -1703,26 +1719,26 @@ same_fd (int fd1, int fd2)
static void
fd_ring_print (FTS const *sp, FILE *stream, char const *msg)
{
+ if (!fts_debug)
+ return;
I_ring const *fd_ring = &sp->fts_fd_ring;
- unsigned int i = fd_ring->fts_front;
- char *cwd = getcwdat (sp->fts_cwd_fd, NULL, 0);
- fprintf (stream, "=== %s ========== %s\n", msg, cwd);
- free (cwd);
+ unsigned int i = fd_ring->ir_front;
+ struct devino cwd = getdevino (sp->fts_cwd_fd);
+ fprintf (stream, "=== %s ========== "PRINT_DEVINO"\n", msg, cwd.dev, cwd.ino);
if (i_ring_empty (fd_ring))
return;
while (true)
{
- int fd = fd_ring->fts_fd_ring[i];
+ int fd = fd_ring->ir_data[i];
if (fd < 0)
fprintf (stream, "%d: %d:\n", i, fd);
else
{
- char *wd = getcwdat (fd, NULL, 0);
- fprintf (stream, "%d: %d: %s\n", i, fd, wd);
- free (wd);
+ struct devino wd = getdevino (fd);
+ fprintf (stream, "%d: %d: "PRINT_DEVINO"\n", i, fd, wd.dev, wd.ino);
}
- if (i == fd_ring->fts_back)
+ if (i == fd_ring->ir_back)
break;
i = (i + I_RING_SIZE - 1) % I_RING_SIZE;
}
@@ -1741,9 +1757,9 @@ fd_ring_check (FTS const *sp)
int cwd_fd = sp->fts_cwd_fd;
cwd_fd = fcntl (cwd_fd, F_DUPFD_CLOEXEC, STDERR_FILENO + 1);
- char *dot = getcwdat (cwd_fd, NULL, 0);
- error (0, 0, "===== check ===== cwd: %s", dot);
- free (dot);
+ struct devino dot = getdevino (cwd_fd);
+ fprintf (stderr, "===== check ===== cwd: "PRINT_DEVINO"\n",
+ dot.dev, dot.ino);
while ( ! i_ring_empty (&fd_w))
{
int fd = i_ring_pop (&fd_w);
@@ -1758,12 +1774,10 @@ fd_ring_check (FTS const *sp)
}
if (!same_fd (fd, parent_fd))
{
- char *cwd = getcwdat (fd, NULL, 0);
- error (0, errno, "ring : %s", cwd);
- char *c2 = getcwdat (parent_fd, NULL, 0);
- error (0, errno, "parent: %s", c2);
- free (cwd);
- free (c2);
+ struct devino cwd = getdevino (fd);
+ fprintf (stderr, "ring : "PRINT_DEVINO"\n", cwd.dev, cwd.ino);
+ struct devino c2 = getdevino (parent_fd);
+ fprintf (stderr, "parent: "PRINT_DEVINO"\n", c2.dev, c2.ino);
fts_assert (0);
}
close (cwd_fd);