summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Youngman <jay@gnu.org>2011-08-20 23:52:08 +0100
committerJames Youngman <jay@gnu.org>2011-08-21 11:25:37 +0100
commit81e33db099359b56db48dbf7aada092bbdfab8dc (patch)
tree68f18eadbf80148adedce1833eff4c2b03345edc
parenta29e61b873a3b949de9f742c1481639c4094cbbd (diff)
downloadfindutils-81e33db099359b56db48dbf7aada092bbdfab8dc.tar.gz
Remove no-longer-used files savedir.[ch].
* lib/savedirinfo.c: delete unused file. * lib/savedirinfo.h: delete unused file. * lib/Makefile.am (libfind_a_SOURCES): Remove savedirinfo.c. (EXTRA_DIST): Remove savedirinfo.h.
-rw-r--r--ChangeLog8
-rw-r--r--lib/Makefile.am4
-rw-r--r--lib/savedirinfo.c262
-rw-r--r--lib/savedirinfo.h73
4 files changed, 9 insertions, 338 deletions
diff --git a/ChangeLog b/ChangeLog
index 561a1b46..daa5730b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,14 @@
2011-08-20 James Youngman <jay@gnu.org>
+ Remove no-longer-used files savedir.[ch].
+ * lib/savedirinfo.c: delete unused file.
+ * lib/savedirinfo.h: delete unused file.
+ * lib/Makefile.am (libfind_a_SOURCES): Remove savedirinfo.c.
+ (EXTRA_DIST): Remove savedirinfo.h.
+
Reduce memory consumption of oldfind on large directories.
* find/find.c (process_dir): Reduce memory consumption for large
- directories. Don't save the whoel directory content with
+ directories. Don't save the whole directory content with
xsavedir, instead just loop over the results of readdir. This
means that oldfind will consume one file descriptor per directory
level.
diff --git a/lib/Makefile.am b/lib/Makefile.am
index dbfb1a19..bbb4dc24 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -19,7 +19,7 @@ TESTS += check-regexprops test_splitstring
endif
libfind_a_SOURCES = findutils-version.c
-EXTRA_DIST = extendbuf.h savedirinfo.h buildcmd.h \
+EXTRA_DIST = extendbuf.h buildcmd.h \
findutils-version.h \
fdleak.h unused-result.h check-regexprops.sh
SUFFIXES =
@@ -33,7 +33,7 @@ LDADD = ../gl/lib/libgnulib.a $(LIBINTL)
libfind_a_SOURCES += printquoted.h listfile.h \
regextype.h dircallback.h safe-atoi.h splitstring.h
-libfind_a_SOURCES += listfile.c extendbuf.c buildcmd.c savedirinfo.c \
+libfind_a_SOURCES += listfile.c extendbuf.c buildcmd.c \
forcefindlib.c qmark.c printquoted.c regextype.c dircallback.c fdleak.c \
safe-atoi.c splitstring.c
diff --git a/lib/savedirinfo.c b/lib/savedirinfo.c
deleted file mode 100644
index 0d4b3464..00000000
--- a/lib/savedirinfo.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/* savedirinfo.c -- Save the list of files in a directory, with additional information.
-
- Copyright 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2010,
- 2011 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-/* Written by James Youngman, <jay@gnu.org>. */
-/* Derived from savedir.c, written by David MacKenzie <djm@gnu.org>. */
-
-/* config.h must be included first. */
-#include <config.h>
-
-/* system headers. */
-#include <dirent.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* gnulib headers. */
-#include "dirent-safer.h"
-#include "xalloc.h"
-
-/* find headers. */
-#include "extendbuf.h"
-#include "savedirinfo.h"
-
-#ifdef CLOSEDIR_VOID
-/* Fake a return value. */
-# define CLOSEDIR(d) (closedir (d), 0)
-#else
-# define CLOSEDIR(d) closedir (d)
-#endif
-
-#if defined HAVE_STRUCT_DIRENT_D_TYPE
-/* Convert the value of struct dirent.d_type into a value for
- * struct stat.st_mode (at least the file type bits), or zero
- * if the type is DT_UNKNOWN or is a value we don't know about.
- */
-static mode_t
-type_to_mode (unsigned type)
-{
- switch (type)
- {
-#ifdef DT_FIFO
- case DT_FIFO: return S_IFIFO;
-#endif
-#ifdef DT_CHR
- case DT_CHR: return S_IFCHR;
-#endif
-#ifdef DT_DIR
- case DT_DIR: return S_IFDIR;
-#endif
-#ifdef DT_BLK
- case DT_BLK: return S_IFBLK;
-#endif
-#ifdef DT_REG
- case DT_REG: return S_IFREG;
-#endif
-#ifdef DT_LNK
- case DT_LNK: return S_IFLNK;
-#endif
-#ifdef DT_SOCK
- case DT_SOCK: return S_IFSOCK;
-#endif
- default:
- return 0; /* Unknown. */
- }
-}
-#endif
-
-struct new_savedir_direntry_internal
-{
- int flags; /* from SaveDirDataFlags */
- mode_t type_info;
- size_t buffer_offset;
-};
-
-
-
-static int
-savedir_cmp (const void *p1, const void *p2)
-{
- const struct savedir_direntry *de1, *de2;
- de1 = p1;
- de2 = p2;
- return strcmp (de1->name, de2->name); /* POSIX order, not locale order. */
-}
-
-
-static struct savedir_direntry*
-convertentries (const struct savedir_dirinfo *info,
- struct new_savedir_direntry_internal *internal)
-{
- char *p = info->buffer;
- struct savedir_direntry *result;
- int n =info->size;
- int i;
-
-
- result = xmalloc (sizeof (*result) * info->size);
-
- for (i=0; i<n; ++i)
- {
- result[i].flags = internal[i].flags;
- result[i].type_info = internal[i].type_info;
- result[i].name = &p[internal[i].buffer_offset];
- }
- return result;
-}
-
-
-struct savedir_dirinfo *
-xsavedir (const char *dir, int flags)
-{
- DIR *dirp;
- struct dirent *dp;
- struct savedir_dirinfo *result = NULL;
- struct new_savedir_direntry_internal *internal;
-
- size_t namebuf_allocated = 0u, namebuf_used = 0u;
- size_t entrybuf_allocated = 0u;
- int save_errno;
-
- dirp = opendir_safer (dir);
- if (dirp == NULL)
- return NULL;
-
- errno = 0;
- result = xmalloc (sizeof (*result));
- result->buffer = NULL;
- result->size = 0u;
- result->entries = NULL;
- internal = NULL;
-
- while ((dp = readdir (dirp)) != NULL)
- {
- /* Skip "", ".", and "..". "" is returned by at least one buggy
- implementation: Solaris 2.4 readdir on NFS file systems. */
- char const *entry = dp->d_name;
- if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0')
- {
- /* Remember the name. */
- size_t entry_size = strlen (entry) + 1;
- result->buffer = xextendbuf (result->buffer, namebuf_used+entry_size, &namebuf_allocated);
- memcpy ((result->buffer) + namebuf_used, entry, entry_size);
-
- /* Remember the other stuff. */
- internal = xextendbuf (internal, (1+result->size)*sizeof (*internal), &entrybuf_allocated);
- internal[result->size].flags = 0;
-
- internal[result->size].type_info = 0;
-#if defined HAVE_STRUCT_DIRENT_D_TYPE
- internal[result->size].type_info = type_to_mode (dp->d_type);
- if (dp->d_type != DT_UNKNOWN)
- internal[result->size].flags |= SavedirHaveFileType;
-#endif
- internal[result->size].buffer_offset = namebuf_used;
-
- /* Prepare for the next iteration */
- ++(result->size);
- namebuf_used += entry_size;
- }
- }
-
- result->buffer = xextendbuf (result->buffer, namebuf_used+1, &namebuf_allocated);
- result->buffer[namebuf_used] = '\0';
-
- /* convert the result to its externally-usable form. */
- result->entries = convertentries (result, internal);
- free (internal);
- internal = NULL;
-
-
- if (flags & SavedirSort)
- {
- qsort (result->entries,
- result->size, sizeof (*result->entries),
- savedir_cmp);
- }
-
-
- save_errno = errno;
- if (CLOSEDIR (dirp) != 0)
- save_errno = errno;
- if (save_errno != 0)
- {
- free (result->buffer);
- free (result);
- errno = save_errno;
- return NULL;
- }
-
- return result;
-}
-
-void free_dirinfo (struct savedir_dirinfo *p)
-{
- free (p->entries);
- p->entries = NULL;
- free (p->buffer);
- p->buffer = NULL;
- free (p);
-}
-
-
-
-char *
-savedirinfo (const char *dir, struct savedir_extrainfo **extra)
-{
- struct savedir_dirinfo *p = xsavedir (dir, SavedirSort);
- char *buf, *s;
- size_t bufbytes = 0;
- unsigned int i;
-
- if (p)
- {
- struct savedir_extrainfo *pex = xmalloc (p->size * sizeof (*extra));
- for (i=0; i<p->size; ++i)
- {
- bufbytes += strlen (p->entries[i].name);
- ++bufbytes; /* the \0 */
-
- pex[i].type_info = p->entries[i].type_info;
- }
-
- s = buf = xmalloc (bufbytes+1);
- for (i=0; i<p->size; ++i)
- {
- size_t len = strlen (p->entries[i].name);
- memcpy (s, p->entries[i].name, len);
- s += len;
- *s = 0; /* Place a NUL */
- ++s; /* Skip the NUL. */
- }
- *s = 0; /* final (doubled) terminating NUL */
-
- if (extra)
- *extra = pex;
- else
- free (pex);
- return buf;
- }
- else
- {
- return NULL;
- }
-}
diff --git a/lib/savedirinfo.h b/lib/savedirinfo.h
deleted file mode 100644
index 247299b9..00000000
--- a/lib/savedirinfo.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Save the list of files in a directory, with additional information.
-
- Copyright 1997, 1999, 2001, 2003, 2005, 2010, 2011 Free Software
- Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-/* Written by James Youngman <jay@gnu.org>.
- * Based on savedir.h by David MacKenzie <djm@gnu.org>.
- */
-
-#if !defined SAVEDIRINFO_H_
-# define SAVEDIRINFO_H_
-
-
-typedef enum tagSaveDirControlFlags
- {
- SavedirSort = 1
- }
-SaveDirControlFlags;
-
-
-typedef enum tagSaveDirDataFlags
- {
- SavedirHaveFileType = 1
- }
-SaveDirDataFlags;
-
-
-/* We keep the name and the type in a structure together
- * to allow us to sort them together.
- */
-struct savedir_direntry
-{
- int flags; /* from SaveDirDataFlags */
- char *name; /* the name of the directory entry */
- mode_t type_info; /* the type (or zero if unknown) */
-};
-
-struct savedir_dirinfo
-{
- char *buffer; /* The names are stored here. */
- size_t size; /* The total number of results. */
- struct savedir_direntry *entries; /* The results themselves */
-};
-
-
-struct savedir_extrainfo
-{
- mode_t type_info;
-};
-
-/* savedirinfo() is the old interface. */
-char *savedirinfo (const char *dir, struct savedir_extrainfo **extra);
-
-/* savedir() is the 'new' interface, but the function has the same name
- * as the function from findutils 4.1.7 and 4.1.20.
- */
-struct savedir_dirinfo * xsavedir(const char *dir, int flags);
-void free_dirinfo(struct savedir_dirinfo *p);
-
-#endif