-static void
-addir (char *name)
-{
- int nlink;
- char *base, *cp;
- struct stat st;
- struct dirent *dp;
- DIR * dd;
-
- cp = name + strlen (name);
- *cp++ = '/';
- *cp = '\0';
-
- /*
- * A hack to skip over a leading
- * "./" in folder names.
- */
- base = strcmp (name, "./") ? name : name + 2;
-
- /* short-cut to see if directory has any sub-directories */
- if (stat (name, &st) != -1 && st.st_nlink == 2)
- return;
-
- if (!(dd = opendir (name))) {
- admonish (name, "unable to read directory ");
- return;
- }
-
- /*
- * Keep track of the number of directories we've seen
- * so we can quit stat'ing early, if we've seen them all.
- */
- nlink = st.st_nlink;
-
- while (nlink && (dp = readdir (dd))) {
- if (!strcmp (dp->d_name, ".") || !strcmp (dp->d_name, "..")) {
- nlink--;
- continue;
- }
- if (cp + NLENGTH(dp) + 2 >= name + BUFSIZ)
- continue;
- strcpy (cp, dp->d_name);
- if (stat (name, &st) != -1 && S_ISDIR(st.st_mode)) {
- /*
- * Check if this was really a symbolic link pointing at
- * a directory. If not, then decrement link count.
- */
- if (lstat (name, &st) == -1)
- nlink--;
- addfold (base);
- }
- }
-
- closedir (dd);
- *--cp = '\0';
-}
-
-/*
- * Add the folder name into the
- * list in a sorted fashion.
- */
-
-static void
-addfold (char *fold)
-{
- register int i, j;
- register char *cp;
-
- /* if necessary, reallocate the space for folder names */
- if (foldp >= maxfolders) {
- maxfolders += NUMFOLDERS;
- if ((folds = realloc (folds, maxfolders * sizeof(char *))) == NULL)
- adios (NULL, "unable to re-allocate storage for folder names");
- }
-
- cp = getcpy (fold);
- for (i = start; i < foldp; i++)
- if (compare (cp, folds[i]) < 0) {
- for (j = foldp - 1; j >= i; j--)
- folds[j + 1] = folds[j];
- foldp++;
- folds[i] = cp;
- return;
- }
-
- folds[foldp++] = cp;
-}
-
-
-static int
-compare (char *s1, char *s2)
-{
- register int i;
-
- while (*s1 || *s2)
- if ((i = *s1++ - *s2++))
- return i;
-
- return 0;
-}
-