summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src/find_names.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cvs/src/find_names.c')
-rw-r--r--contrib/cvs/src/find_names.c427
1 files changed, 0 insertions, 427 deletions
diff --git a/contrib/cvs/src/find_names.c b/contrib/cvs/src/find_names.c
deleted file mode 100644
index 5bfd895..0000000
--- a/contrib/cvs/src/find_names.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
- *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
- * and others.
- *
- * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
- * Portions Copyright (C) 1989-1992, Brian Berliner
- *
- * You may distribute under the terms of the GNU General Public License as
- * specified in the README file that comes with the CVS source distribution.
- *
- * Find Names
- *
- * Finds all the pertinent file names, both from the administration and from the
- * repository
- *
- * Find Dirs
- *
- * Finds all pertinent sub-directories of the checked out instantiation and the
- * repository (and optionally the attic)
- */
-
-#include "cvs.h"
-
-static int find_dirs PROTO((char *dir, List * list, int checkadm,
- List *entries));
-static int find_rcs PROTO((char *dir, List * list));
-static int add_subdir_proc PROTO((Node *, void *));
-static int register_subdir_proc PROTO((Node *, void *));
-
-/*
- * add the key from entry on entries list to the files list
- */
-static int add_entries_proc PROTO((Node *, void *));
-static int
-add_entries_proc (node, closure)
- Node *node;
- void *closure;
-{
- Node *fnode;
- List *filelist = closure;
- Entnode *entnode = node->data;
-
- if (entnode->type != ENT_FILE)
- return (0);
-
- fnode = getnode ();
- fnode->type = FILES;
- fnode->key = xstrdup (node->key);
- if (addnode (filelist, fnode) != 0)
- freenode (fnode);
- return (0);
-}
-
-/* Find files in the repository and/or working directory. On error,
- may either print a nonfatal error and return NULL, or just give
- a fatal error. On success, return non-NULL (even if it is an empty
- list). */
-
-List *
-Find_Names (repository, which, aflag, optentries)
- char *repository;
- int which;
- int aflag;
- List **optentries;
-{
- List *entries;
- List *files;
-
- /* make a list for the files */
- files = getlist ();
-
- /* look at entries (if necessary) */
- if (which & W_LOCAL)
- {
- /* parse the entries file (if it exists) */
- entries = Entries_Open (aflag, NULL);
- if (entries != NULL)
- {
- /* walk the entries file adding elements to the files list */
- (void) walklist (entries, add_entries_proc, files);
-
- /* if our caller wanted the entries list, return it; else free it */
- if (optentries != NULL)
- *optentries = entries;
- else
- Entries_Close (entries);
- }
- }
-
- if ((which & W_REPOS) && repository && !isreadable (CVSADM_ENTSTAT))
- {
- /* search the repository */
- if (find_rcs (repository, files) != 0)
- {
- error (0, errno, "cannot open directory %s", repository);
- goto error_exit;
- }
-
- /* search the attic too */
- if (which & W_ATTIC)
- {
- char *dir;
- dir = xmalloc (strlen (repository) + sizeof (CVSATTIC) + 10);
- (void) sprintf (dir, "%s/%s", repository, CVSATTIC);
- if (find_rcs (dir, files) != 0
- && !existence_error (errno))
- /* For now keep this a fatal error, seems less useful
- for access control than the case above. */
- error (1, errno, "cannot open directory %s", dir);
- free (dir);
- }
- }
-
- /* sort the list into alphabetical order and return it */
- sortlist (files, fsortcmp);
- return (files);
- error_exit:
- dellist (&files);
- return NULL;
-}
-
-/*
- * Add an entry from the subdirs list to the directories list. This
- * is called via walklist.
- */
-
-static int
-add_subdir_proc (p, closure)
- Node *p;
- void *closure;
-{
- List *dirlist = closure;
- Entnode *entnode = p->data;
- Node *dnode;
-
- if (entnode->type != ENT_SUBDIR)
- return 0;
-
- dnode = getnode ();
- dnode->type = DIRS;
- dnode->key = xstrdup (entnode->user);
- if (addnode (dirlist, dnode) != 0)
- freenode (dnode);
- return 0;
-}
-
-/*
- * Register a subdirectory. This is called via walklist.
- */
-
-/*ARGSUSED*/
-static int
-register_subdir_proc (p, closure)
- Node *p;
- void *closure;
-{
- List *entries = (List *) closure;
-
- Subdir_Register (entries, (char *) NULL, p->key);
- return 0;
-}
-
-/*
- * create a list of directories to traverse from the current directory
- */
-List *
-Find_Directories (repository, which, entries)
- char *repository;
- int which;
- List *entries;
-{
- List *dirlist;
-
- /* make a list for the directories */
- dirlist = getlist ();
-
- /* find the local ones */
- if (which & W_LOCAL)
- {
- List *tmpentries;
- struct stickydirtag *sdtp;
-
- /* Look through the Entries file. */
-
- if (entries != NULL)
- tmpentries = entries;
- else if (isfile (CVSADM_ENT))
- tmpentries = Entries_Open (0, NULL);
- else
- tmpentries = NULL;
-
- if (tmpentries != NULL)
- sdtp = tmpentries->list->data;
-
- /* If we do have an entries list, then if sdtp is NULL, or if
- sdtp->subdirs is nonzero, all subdirectory information is
- recorded in the entries list. */
- if (tmpentries != NULL && (sdtp == NULL || sdtp->subdirs))
- walklist (tmpentries, add_subdir_proc, (void *) dirlist);
- else
- {
- /* This is an old working directory, in which subdirectory
- information is not recorded in the Entries file. Find
- the subdirectories the hard way, and, if possible, add
- it to the Entries file for next time. */
-
- /* FIXME-maybe: find_dirs is bogus for this usage because
- it skips CVSATTIC and CVSLCK directories--those names
- should be special only in the repository. However, in
- the interests of not perturbing this code, we probably
- should leave well enough alone unless we want to write
- a sanity.sh test case (which would operate by manually
- hacking on the CVS/Entries file). */
-
- if (find_dirs (".", dirlist, 1, tmpentries) != 0)
- error (1, errno, "cannot open current directory");
- if (tmpentries != NULL)
- {
- if (! list_isempty (dirlist))
- walklist (dirlist, register_subdir_proc,
- (void *) tmpentries);
- else
- Subdirs_Known (tmpentries);
- }
- }
-
- if (entries == NULL && tmpentries != NULL)
- Entries_Close (tmpentries);
- }
-
- /* look for sub-dirs in the repository */
- if ((which & W_REPOS) && repository)
- {
- /* search the repository */
- if (find_dirs (repository, dirlist, 0, entries) != 0)
- error (1, errno, "cannot open directory %s", repository);
-
- /* We don't need to look in the attic because directories
- never go in the attic. In the future, there hopefully will
- be a better mechanism for detecting whether a directory in
- the repository is alive or dead; it may or may not involve
- moving directories to the attic. */
- }
-
- /* sort the list into alphabetical order and return it */
- sortlist (dirlist, fsortcmp);
- return (dirlist);
-}
-
-/*
- * Finds all the ,v files in the argument directory, and adds them to the
- * files list. Returns 0 for success and non-zero if the argument directory
- * cannot be opened, in which case errno is set to indicate the error.
- * In the error case LIST is left in some reasonable state (unchanged, or
- * containing the files which were found before the error occurred).
- */
-static int
-find_rcs (dir, list)
- char *dir;
- List *list;
-{
- Node *p;
- struct dirent *dp;
- DIR *dirp;
-
- /* set up to read the dir */
- if ((dirp = CVS_OPENDIR (dir)) == NULL)
- return (1);
-
- /* read the dir, grabbing the ,v files */
- errno = 0;
- while ((dp = CVS_READDIR (dirp)) != NULL)
- {
- if (CVS_FNMATCH (RCSPAT, dp->d_name, 0) == 0)
- {
- char *comma;
-
- comma = strrchr (dp->d_name, ','); /* strip the ,v */
- *comma = '\0';
- p = getnode ();
- p->type = FILES;
- p->key = xstrdup (dp->d_name);
- if (addnode (list, p) != 0)
- freenode (p);
- }
- errno = 0;
- }
- if (errno != 0)
- {
- int save_errno = errno;
- (void) CVS_CLOSEDIR (dirp);
- errno = save_errno;
- return 1;
- }
- (void) CVS_CLOSEDIR (dirp);
- return (0);
-}
-
-/*
- * Finds all the subdirectories of the argument dir and adds them to
- * the specified list. Sub-directories without a CVS administration
- * directory are optionally ignored. If ENTRIES is not NULL, all
- * files on the list are ignored. Returns 0 for success or 1 on
- * error, in which case errno is set to indicate the error.
- */
-static int
-find_dirs (dir, list, checkadm, entries)
- char *dir;
- List *list;
- int checkadm;
- List *entries;
-{
- Node *p;
- char *tmp = NULL;
- size_t tmp_size = 0;
- struct dirent *dp;
- DIR *dirp;
- int skip_emptydir = 0;
-
- /* First figure out whether we need to skip directories named
- Emptydir. Except in the CVSNULLREPOS case, Emptydir is just
- a normal directory name. */
- if (isabsolute (dir)
- && strncmp (dir, current_parsed_root->directory, strlen (current_parsed_root->directory)) == 0
- && ISDIRSEP (dir[strlen (current_parsed_root->directory)])
- && strcmp (dir + strlen (current_parsed_root->directory) + 1, CVSROOTADM) == 0)
- skip_emptydir = 1;
-
- /* set up to read the dir */
- if ((dirp = CVS_OPENDIR (dir)) == NULL)
- return (1);
-
- /* read the dir, grabbing sub-dirs */
- errno = 0;
- while ((dp = CVS_READDIR (dirp)) != NULL)
- {
- if (strcmp (dp->d_name, ".") == 0 ||
- strcmp (dp->d_name, "..") == 0 ||
- strcmp (dp->d_name, CVSATTIC) == 0 ||
- strcmp (dp->d_name, CVSLCK) == 0 ||
- strcmp (dp->d_name, CVSREP) == 0)
- goto do_it_again;
-
- /* findnode() is going to be significantly faster than stat()
- because it involves no system calls. That is why we bother
- with the entries argument, and why we check this first. */
- if (entries != NULL && findnode (entries, dp->d_name) != NULL)
- goto do_it_again;
-
- if (skip_emptydir
- && strcmp (dp->d_name, CVSNULLREPOS) == 0)
- goto do_it_again;
-
-#ifdef DT_DIR
- if (dp->d_type != DT_DIR)
- {
- if (dp->d_type != DT_UNKNOWN && dp->d_type != DT_LNK)
- goto do_it_again;
-#endif
- /* don't bother stating ,v files */
- if (CVS_FNMATCH (RCSPAT, dp->d_name, 0) == 0)
- goto do_it_again;
-
- expand_string (&tmp,
- &tmp_size,
- strlen (dir) + strlen (dp->d_name) + 10);
- sprintf (tmp, "%s/%s", dir, dp->d_name);
- if (!isdir (tmp))
- goto do_it_again;
-
-#ifdef DT_DIR
- }
-#endif
-
- /* check for administration directories (if needed) */
- if (checkadm)
- {
- /* blow off symbolic links to dirs in local dir */
-#ifdef DT_DIR
- if (dp->d_type != DT_DIR)
- {
- /* we're either unknown or a symlink at this point */
- if (dp->d_type == DT_LNK)
- goto do_it_again;
-#endif
- /* Note that we only get here if we already set tmp
- above. */
- if (islink (tmp))
- goto do_it_again;
-#ifdef DT_DIR
- }
-#endif
-
- /* check for new style */
- expand_string (&tmp,
- &tmp_size,
- (strlen (dir) + strlen (dp->d_name)
- + sizeof (CVSADM) + 10));
- (void) sprintf (tmp, "%s/%s/%s", dir, dp->d_name, CVSADM);
- if (!isdir (tmp))
- goto do_it_again;
- }
-
- /* put it in the list */
- p = getnode ();
- p->type = DIRS;
- p->key = xstrdup (dp->d_name);
- if (addnode (list, p) != 0)
- freenode (p);
-
- do_it_again:
- errno = 0;
- }
- if (errno != 0)
- {
- int save_errno = errno;
- (void) CVS_CLOSEDIR (dirp);
- errno = save_errno;
- return 1;
- }
- (void) CVS_CLOSEDIR (dirp);
- if (tmp != NULL)
- free (tmp);
- return (0);
-}
OpenPOWER on IntegriCloud