summaryrefslogtreecommitdiff
path: root/lib/glob/glob.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/glob/glob.c')
-rw-r--r--lib/glob/glob.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index 6a9679fc..be4e9dc8 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -75,9 +75,9 @@
# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
#endif /* _POSIX_SOURCE */
-#if !defined (HAVE_BCOPY)
+#if !defined (HAVE_BCOPY) && !defined (bcopy)
# define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
-#endif /* !HAVE_BCOPY */
+#endif /* !HAVE_BCOPY && !bcopy */
#if defined (SHELL)
# include "posixstat.h"
@@ -251,7 +251,7 @@ glob_vector (pat, dir)
register struct dirent *dp;
struct globval *lastlink;
register struct globval *nextlink;
- register char *nextname;
+ register char *nextname, *npat;
unsigned int count;
int lose, skip;
register char **name_vector;
@@ -297,32 +297,32 @@ glob_vector (pat, dir)
dirlen = strlen (dir);
nextname = (char *)malloc (dirlen + strlen (pat) + 2);
- if (nextname == 0)
+ npat = (char *)malloc (strlen (pat) + 1);
+ if (nextname == 0 || npat == 0)
lose = 1;
else
{
+ strcpy (npat, pat);
+ dequote_pathname (npat);
+
strcpy (nextname, dir);
nextname[dirlen++] = '/';
- strcpy (nextname + dirlen, pat);
+ strcpy (nextname + dirlen, npat);
if (GLOB_TESTNAME (nextname) >= 0)
{
free (nextname);
nextlink = (struct globval *)alloca (sizeof (struct globval));
nextlink->next = (struct globval *)0;
- nextname = (char *) malloc (strlen (pat) + 1);
- if (nextname == 0)
- lose = 1;
- else
- {
- lastlink = nextlink;
- nextlink->name = nextname;
- strcpy (nextname, pat);
- count = 1;
- }
+ lastlink = nextlink;
+ nextlink->name = npat;
+ count = 1;
}
else
- free (nextname);
+ {
+ free (nextname);
+ free (npat);
+ }
}
skip = 1;
@@ -379,6 +379,16 @@ glob_vector (pat, dir)
if (REAL_DIR_ENTRY (dp) == 0)
continue;
+ /* If a leading dot need not be explicitly matched, and the pattern
+ doesn't start with a `.', don't match `.' or `..' */
+#define dname dp->d_name
+ if (noglob_dot_filenames == 0 && pat[0] != '.' &&
+ (pat[0] != '\\' || pat[1] != '.') &&
+ (dname[0] == '.' &&
+ (dname[1] == '\0' || (dname[1] == '.' && dname[2] == '\0'))))
+#undef dname
+ continue;
+
/* If a dot must be explicity matched, check to see if they do. */
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.' &&
(pat[0] != '\\' || pat[1] != '.'))