|
|
|
@ -83,6 +83,10 @@
|
|
|
|
|
#include "perprocess.h"
|
|
|
|
|
#include "cygwin/version.h"
|
|
|
|
|
|
|
|
|
|
#ifndef ARG_MAX
|
|
|
|
|
#define ARG_MAX 32000 /* See CreateProcess */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef __weak_alias
|
|
|
|
|
#ifdef __LIBC12_SOURCE__
|
|
|
|
|
__weak_alias(glob,_glob);
|
|
|
|
@ -160,10 +164,10 @@ static Char *g_strcat __P((Char *, const Char *));
|
|
|
|
|
#endif
|
|
|
|
|
static int g_stat __P((Char *, struct STAT *, glob_t *));
|
|
|
|
|
static int glob0 __P((const Char *, glob_t *));
|
|
|
|
|
static int glob1 __P((Char *, glob_t *));
|
|
|
|
|
static int glob2 __P((Char *, Char *, Char *, glob_t *));
|
|
|
|
|
static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *));
|
|
|
|
|
static int globextend __P((const Char *, glob_t *));
|
|
|
|
|
static int glob1 __P((Char *, glob_t *, size_t *));
|
|
|
|
|
static int glob2 __P((Char *, Char *, Char *, glob_t *, size_t *));
|
|
|
|
|
static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *, size_t *));
|
|
|
|
|
static int globextend __P((const Char *, glob_t *, size_t *));
|
|
|
|
|
static const Char * globtilde __P((const Char *, Char *, glob_t *));
|
|
|
|
|
static int globexp1 __P((const Char *, glob_t *));
|
|
|
|
|
static int globexp2 __P((const Char *, const Char *, glob_t *, int *));
|
|
|
|
@ -428,6 +432,7 @@ glob0(pattern, pglob)
|
|
|
|
|
const Char *qpatnext;
|
|
|
|
|
int c, err, oldpathc;
|
|
|
|
|
Char *bufnext, patbuf[MAXPATHLEN+1];
|
|
|
|
|
size_t limit = 0;
|
|
|
|
|
|
|
|
|
|
qpatnext = globtilde(pattern, patbuf, pglob);
|
|
|
|
|
oldpathc = pglob->gl_pathc;
|
|
|
|
@ -485,7 +490,7 @@ glob0(pattern, pglob)
|
|
|
|
|
qprintf("glob0:", patbuf);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if ((err = glob1(patbuf, pglob)) != 0)
|
|
|
|
|
if ((err = glob1(patbuf, pglob, &limit)) != 0)
|
|
|
|
|
return(err);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -498,7 +503,7 @@ glob0(pattern, pglob)
|
|
|
|
|
((pglob->gl_flags & GLOB_NOCHECK) ||
|
|
|
|
|
((pglob->gl_flags & GLOB_NOMAGIC) &&
|
|
|
|
|
!(pglob->gl_flags & GLOB_MAGCHAR))))
|
|
|
|
|
return(globextend(pattern, pglob));
|
|
|
|
|
return(globextend(pattern, pglob, &limit));
|
|
|
|
|
else if (!(pglob->gl_flags & GLOB_NOSORT))
|
|
|
|
|
qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
|
|
|
|
|
pglob->gl_pathc - oldpathc, sizeof(char *), compare);
|
|
|
|
@ -513,16 +518,17 @@ compare(p, q)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
glob1(pattern, pglob)
|
|
|
|
|
glob1(pattern, pglob, limit)
|
|
|
|
|
Char *pattern;
|
|
|
|
|
glob_t *pglob;
|
|
|
|
|
size_t *limit;
|
|
|
|
|
{
|
|
|
|
|
Char pathbuf[MAXPATHLEN+1];
|
|
|
|
|
|
|
|
|
|
/* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */
|
|
|
|
|
if (*pattern == EOS)
|
|
|
|
|
return(0);
|
|
|
|
|
return(glob2(pathbuf, pathbuf, pattern, pglob));
|
|
|
|
|
return(glob2(pathbuf, pathbuf, pattern, pglob, limit));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -531,9 +537,10 @@ glob1(pattern, pglob)
|
|
|
|
|
* meta characters.
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
glob2(pathbuf, pathend, pattern, pglob)
|
|
|
|
|
glob2(pathbuf, pathend, pattern, pglob, limit)
|
|
|
|
|
Char *pathbuf, *pathend, *pattern;
|
|
|
|
|
glob_t *pglob;
|
|
|
|
|
size_t *limit;
|
|
|
|
|
{
|
|
|
|
|
struct STAT sb;
|
|
|
|
|
Char *p, *q;
|
|
|
|
@ -558,7 +565,7 @@ glob2(pathbuf, pathend, pattern, pglob)
|
|
|
|
|
*pathend = EOS;
|
|
|
|
|
}
|
|
|
|
|
++pglob->gl_matchc;
|
|
|
|
|
return(globextend(pathbuf, pglob));
|
|
|
|
|
return(globextend(pathbuf, pglob, limit));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find end of next segment, copy tentatively to pathend. */
|
|
|
|
@ -576,15 +583,17 @@ glob2(pathbuf, pathend, pattern, pglob)
|
|
|
|
|
while (*pattern == SEP)
|
|
|
|
|
*pathend++ = *pattern++;
|
|
|
|
|
} else /* Need expansion, recurse. */
|
|
|
|
|
return(glob3(pathbuf, pathend, pattern, p, pglob));
|
|
|
|
|
return(glob3(pathbuf, pathend, pattern, p, pglob,
|
|
|
|
|
limit));
|
|
|
|
|
}
|
|
|
|
|
/* NOTREACHED */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
glob3(pathbuf, pathend, pattern, restpattern, pglob)
|
|
|
|
|
glob3(pathbuf, pathend, pattern, restpattern, pglob, limit)
|
|
|
|
|
Char *pathbuf, *pathend, *pattern, *restpattern;
|
|
|
|
|
glob_t *pglob;
|
|
|
|
|
size_t *limit;
|
|
|
|
|
{
|
|
|
|
|
register struct dirent *dp;
|
|
|
|
|
DIR *dirp;
|
|
|
|
@ -634,7 +643,7 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob)
|
|
|
|
|
*pathend = EOS;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
err = glob2(pathbuf, --dc, restpattern, pglob);
|
|
|
|
|
err = glob2(pathbuf, --dc, restpattern, pglob, limit);
|
|
|
|
|
if (err)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -662,13 +671,14 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob)
|
|
|
|
|
* gl_pathv points to (gl_offs + gl_pathc + 1) items.
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
globextend(path, pglob)
|
|
|
|
|
globextend(path, pglob, limit)
|
|
|
|
|
const Char *path;
|
|
|
|
|
glob_t *pglob;
|
|
|
|
|
size_t *limit;
|
|
|
|
|
{
|
|
|
|
|
register char **pathv;
|
|
|
|
|
register int i;
|
|
|
|
|
u_int newsize;
|
|
|
|
|
size_t newsize, len;
|
|
|
|
|
char *copy;
|
|
|
|
|
const Char *p;
|
|
|
|
|
|
|
|
|
@ -689,11 +699,19 @@ globextend(path, pglob)
|
|
|
|
|
|
|
|
|
|
for (p = path; *p++;)
|
|
|
|
|
continue;
|
|
|
|
|
if ((copy = malloc(p - path)) != NULL) {
|
|
|
|
|
len = (size_t)(p - path);
|
|
|
|
|
*limit += len;
|
|
|
|
|
if ((copy = malloc(len)) != NULL) {
|
|
|
|
|
g_Ctoc(path, copy);
|
|
|
|
|
pathv[pglob->gl_offs + pglob->gl_pathc++] = copy;
|
|
|
|
|
}
|
|
|
|
|
pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
|
|
|
|
|
|
|
|
|
|
if ((pglob->gl_flags & GLOB_LIMIT) && (newsize + *limit) >= ARG_MAX) {
|
|
|
|
|
errno = 0;
|
|
|
|
|
return(GLOB_NOSPACE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(copy == NULL ? GLOB_NOSPACE : 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|