diff options
Diffstat (limited to 'openbsd-compat')
-rw-r--r-- | openbsd-compat/glob.c | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/openbsd-compat/glob.c b/openbsd-compat/glob.c index 5ed286211..cca819de0 100644 --- a/openbsd-compat/glob.c +++ b/openbsd-compat/glob.c | |||
@@ -56,7 +56,7 @@ get_arg_max() | |||
56 | #if 0 | 56 | #if 0 |
57 | static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93"; | 57 | static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93"; |
58 | #else | 58 | #else |
59 | static char rcsid[] = "$OpenBSD: glob.c,v 1.10 2001/03/19 13:45:30 millert Exp $"; | 59 | static char rcsid[] = "$OpenBSD: glob.c,v 1.13 2001/03/28 08:00:00 deraadt Exp $"; |
60 | #endif | 60 | #endif |
61 | #endif /* LIBC_SCCS and not lint */ | 61 | #endif /* LIBC_SCCS and not lint */ |
62 | 62 | ||
@@ -137,13 +137,10 @@ typedef char Char; | |||
137 | 137 | ||
138 | 138 | ||
139 | static int compare __P((const void *, const void *)); | 139 | static int compare __P((const void *, const void *)); |
140 | static void g_Ctoc __P((const Char *, char *)); | 140 | static int g_Ctoc __P((const Char *, char *, char *)); |
141 | static int g_lstat __P((Char *, struct stat *, glob_t *)); | 141 | static int g_lstat __P((Char *, struct stat *, glob_t *)); |
142 | static DIR *g_opendir __P((Char *, glob_t *)); | 142 | static DIR *g_opendir __P((Char *, glob_t *)); |
143 | static Char *g_strchr __P((Char *, int)); | 143 | static Char *g_strchr __P((Char *, int)); |
144 | #ifdef notdef | ||
145 | static Char *g_strcat __P((Char *, const Char *)); | ||
146 | #endif | ||
147 | static int g_stat __P((Char *, struct stat *, glob_t *)); | 144 | static int g_stat __P((Char *, struct stat *, glob_t *)); |
148 | static int glob0 __P((const Char *, glob_t *)); | 145 | static int glob0 __P((const Char *, glob_t *)); |
149 | static int glob1 __P((Char *, glob_t *, size_t *)); | 146 | static int glob1 __P((Char *, glob_t *, size_t *)); |
@@ -184,8 +181,8 @@ glob(pattern, flags, errfunc, pglob) | |||
184 | bufnext = patbuf; | 181 | bufnext = patbuf; |
185 | bufend = bufnext + MAXPATHLEN; | 182 | bufend = bufnext + MAXPATHLEN; |
186 | if (flags & GLOB_NOESCAPE) | 183 | if (flags & GLOB_NOESCAPE) |
187 | while (bufnext < bufend && (c = *patnext++) != EOS) | 184 | while (bufnext < bufend && (c = *patnext++) != EOS) |
188 | *bufnext++ = c; | 185 | *bufnext++ = c; |
189 | else { | 186 | else { |
190 | /* Protect the quoted characters. */ | 187 | /* Protect the quoted characters. */ |
191 | while (bufnext < bufend && (c = *patnext++) != EOS) | 188 | while (bufnext < bufend && (c = *patnext++) != EOS) |
@@ -279,7 +276,7 @@ static int globexp2(ptr, pattern, pglob, rv) | |||
279 | return 0; | 276 | return 0; |
280 | } | 277 | } |
281 | 278 | ||
282 | for (i = 0, pl = pm = ptr; pm <= pe; pm++) | 279 | for (i = 0, pl = pm = ptr; pm <= pe; pm++) { |
283 | switch (*pm) { | 280 | switch (*pm) { |
284 | case LBRACKET: | 281 | case LBRACKET: |
285 | /* Ignore everything between [] */ | 282 | /* Ignore everything between [] */ |
@@ -300,8 +297,8 @@ static int globexp2(ptr, pattern, pglob, rv) | |||
300 | 297 | ||
301 | case RBRACE: | 298 | case RBRACE: |
302 | if (i) { | 299 | if (i) { |
303 | i--; | 300 | i--; |
304 | break; | 301 | break; |
305 | } | 302 | } |
306 | /* FALLTHROUGH */ | 303 | /* FALLTHROUGH */ |
307 | case COMMA: | 304 | case COMMA: |
@@ -332,6 +329,7 @@ static int globexp2(ptr, pattern, pglob, rv) | |||
332 | default: | 329 | default: |
333 | break; | 330 | break; |
334 | } | 331 | } |
332 | } | ||
335 | *rv = 0; | 333 | *rv = 0; |
336 | return 0; | 334 | return 0; |
337 | } | 335 | } |
@@ -464,7 +462,7 @@ glob0(pattern, pglob) | |||
464 | * to avoid exponential behavior | 462 | * to avoid exponential behavior |
465 | */ | 463 | */ |
466 | if (bufnext == patbuf || bufnext[-1] != M_ALL) | 464 | if (bufnext == patbuf || bufnext[-1] != M_ALL) |
467 | *bufnext++ = M_ALL; | 465 | *bufnext++ = M_ALL; |
468 | break; | 466 | break; |
469 | default: | 467 | default: |
470 | *bufnext++ = CHAR(c); | 468 | *bufnext++ = CHAR(c); |
@@ -546,8 +544,8 @@ glob2(pathbuf, pathend, pattern, pglob, limitp) | |||
546 | return(0); | 544 | return(0); |
547 | 545 | ||
548 | if (((pglob->gl_flags & GLOB_MARK) && | 546 | if (((pglob->gl_flags & GLOB_MARK) && |
549 | pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) | 547 | pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || |
550 | || (S_ISLNK(sb.st_mode) && | 548 | (S_ISLNK(sb.st_mode) && |
551 | (g_stat(pathbuf, &sb, pglob) == 0) && | 549 | (g_stat(pathbuf, &sb, pglob) == 0) && |
552 | S_ISDIR(sb.st_mode)))) { | 550 | S_ISDIR(sb.st_mode)))) { |
553 | *pathend++ = SEP; | 551 | *pathend++ = SEP; |
@@ -571,7 +569,8 @@ glob2(pathbuf, pathend, pattern, pglob, limitp) | |||
571 | pattern = p; | 569 | pattern = p; |
572 | while (*pattern == SEP) | 570 | while (*pattern == SEP) |
573 | *pathend++ = *pattern++; | 571 | *pathend++ = *pattern++; |
574 | } else /* Need expansion, recurse. */ | 572 | } else |
573 | /* Need expansion, recurse. */ | ||
575 | return(glob3(pathbuf, pathend, pattern, p, pglob, | 574 | return(glob3(pathbuf, pathend, pattern, p, pglob, |
576 | limitp)); | 575 | limitp)); |
577 | } | 576 | } |
@@ -603,10 +602,11 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob, limitp) | |||
603 | if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { | 602 | if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { |
604 | /* TODO: don't call for ENOENT or ENOTDIR? */ | 603 | /* TODO: don't call for ENOENT or ENOTDIR? */ |
605 | if (pglob->gl_errfunc) { | 604 | if (pglob->gl_errfunc) { |
606 | g_Ctoc(pathbuf, buf); | 605 | if (g_Ctoc(pathbuf, buf, buf+sizeof(buf))) |
606 | return(GLOB_ABORTED); | ||
607 | if (pglob->gl_errfunc(buf, errno) || | 607 | if (pglob->gl_errfunc(buf, errno) || |
608 | pglob->gl_flags & GLOB_ERR) | 608 | pglob->gl_flags & GLOB_ERR) |
609 | return (GLOB_ABORTED); | 609 | return(GLOB_ABORTED); |
610 | } | 610 | } |
611 | return(0); | 611 | return(0); |
612 | } | 612 | } |
@@ -695,7 +695,10 @@ globextend(path, pglob, limitp) | |||
695 | len = (size_t)(p - path); | 695 | len = (size_t)(p - path); |
696 | *limitp += len; | 696 | *limitp += len; |
697 | if ((copy = malloc(len)) != NULL) { | 697 | if ((copy = malloc(len)) != NULL) { |
698 | g_Ctoc(path, copy); | 698 | if (g_Ctoc(path, copy, copy+len+1)) { |
699 | free(copy); | ||
700 | return(GLOB_NOSPACE); | ||
701 | } | ||
699 | pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; | 702 | pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; |
700 | } | 703 | } |
701 | pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; | 704 | pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; |
@@ -730,7 +733,8 @@ match(name, pat, patend) | |||
730 | do | 733 | do |
731 | if (match(name, pat, patend)) | 734 | if (match(name, pat, patend)) |
732 | return(1); | 735 | return(1); |
733 | while (*name++ != EOS); | 736 | while (*name++ != EOS) |
737 | ; | ||
734 | return(0); | 738 | return(0); |
735 | case M_ONE: | 739 | case M_ONE: |
736 | if (*name++ == EOS) | 740 | if (*name++ == EOS) |
@@ -788,8 +792,10 @@ g_opendir(str, pglob) | |||
788 | 792 | ||
789 | if (!*str) | 793 | if (!*str) |
790 | strcpy(buf, "."); | 794 | strcpy(buf, "."); |
791 | else | 795 | else { |
792 | g_Ctoc(str, buf); | 796 | if (g_Ctoc(str, buf, buf+sizeof(buf))) |
797 | return(NULL); | ||
798 | } | ||
793 | 799 | ||
794 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) | 800 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) |
795 | return((*pglob->gl_opendir)(buf)); | 801 | return((*pglob->gl_opendir)(buf)); |
@@ -805,7 +811,8 @@ g_lstat(fn, sb, pglob) | |||
805 | { | 811 | { |
806 | char buf[MAXPATHLEN]; | 812 | char buf[MAXPATHLEN]; |
807 | 813 | ||
808 | g_Ctoc(fn, buf); | 814 | if (g_Ctoc(fn, buf, buf+sizeof(buf))) |
815 | return(-1); | ||
809 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) | 816 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) |
810 | return((*pglob->gl_lstat)(buf, sb)); | 817 | return((*pglob->gl_lstat)(buf, sb)); |
811 | return(lstat(buf, sb)); | 818 | return(lstat(buf, sb)); |
@@ -819,7 +826,8 @@ g_stat(fn, sb, pglob) | |||
819 | { | 826 | { |
820 | char buf[MAXPATHLEN]; | 827 | char buf[MAXPATHLEN]; |
821 | 828 | ||
822 | g_Ctoc(fn, buf); | 829 | if (g_Ctoc(fn, buf, buf+sizeof(buf))) |
830 | return(-1); | ||
823 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) | 831 | if (pglob->gl_flags & GLOB_ALTDIRFUNC) |
824 | return((*pglob->gl_stat)(buf, sb)); | 832 | return((*pglob->gl_stat)(buf, sb)); |
825 | return(stat(buf, sb)); | 833 | return(stat(buf, sb)); |
@@ -837,33 +845,18 @@ g_strchr(str, ch) | |||
837 | return (NULL); | 845 | return (NULL); |
838 | } | 846 | } |
839 | 847 | ||
840 | #ifdef notdef | 848 | static int |
841 | static Char * | 849 | g_Ctoc(str, buf, ebuf) |
842 | g_strcat(dst, src) | ||
843 | Char *dst; | ||
844 | const Char* src; | ||
845 | { | ||
846 | Char *sdst = dst; | ||
847 | |||
848 | while (*dst++) | ||
849 | continue; | ||
850 | --dst; | ||
851 | while((*dst++ = *src++) != EOS) | ||
852 | continue; | ||
853 | |||
854 | return (sdst); | ||
855 | } | ||
856 | #endif | ||
857 | |||
858 | static void | ||
859 | g_Ctoc(str, buf) | ||
860 | register const Char *str; | 850 | register const Char *str; |
861 | char *buf; | 851 | char *buf, *ebuf; |
862 | { | 852 | { |
863 | register char *dc; | 853 | register char *dc; |
864 | 854 | ||
865 | for (dc = buf; (*dc++ = *str++) != EOS;) | 855 | for (dc = buf; dc < ebuf && (*dc++ = *str++) != EOS;) |
866 | continue; | 856 | continue; |
857 | if (dc >= ebuf) | ||
858 | return (1); | ||
859 | return (0); | ||
867 | } | 860 | } |
868 | 861 | ||
869 | #ifdef DEBUG | 862 | #ifdef DEBUG |