]> git.pld-linux.org Git - packages/proftpd.git/blob - proftpd-glob.patch
- LSB conformance
[packages/proftpd.git] / proftpd-glob.patch
1 diff -urN proftpd-1.2.1/Make.rules.in proftpd-1.2/Make.rules.in
2 --- proftpd-1.2.1/Make.rules.in Thu Feb 22 05:51:10 2001
3 +++ proftpd-1.2/Make.rules.in   Mon Mar 19 23:11:35 2001
4 @@ -63,7 +63,7 @@
5             src/support.o src/inet.o src/log.o src/io.o src/ident.o \
6             src/data.o src/modules.o src/auth.o src/fs.o
7  
8 -LIB_OBJS=getopt.o getopt1.o pr_fnmatch.o strsep.o vsnprintf.o glob.o pwgrent.o
9 +LIB_OBJS=getopt.o getopt1.o pr_fnmatch.o strsep.o vsnprintf.o glibc-glob.o pwgrent.o
10  
11  FTPCOUNT_OBJS=ftpcount.o pool.o log.o utils.o
12  BUILD_FTPCOUNT_OBJS=src/ftpcount.o src/pool.o src/log.o src/utils.o
13 diff -urN proftpd-1.2.1/acconfig.h proftpd-1.2/acconfig.h
14 --- proftpd-1.2.1/acconfig.h    Wed Feb 14 05:12:48 2001
15 +++ proftpd-1.2/acconfig.h      Mon Mar 19 23:11:35 2001
16 @@ -18,12 +18,6 @@
17  /* Define if you have BSD sendfile() semantics */
18  #undef HAVE_BSD_SENDFILE
19  
20 -/* Define if you have the <glob.h> header file. */
21 -#undef HAVE_GLOB_H
22 -
23 -/* Define if your <glob.h> defines GLOB_PERIOD macro. */
24 -#undef HAVE_GLOB_PERIOD
25 -
26  /* Define if you have Linux sendfile() semantics */
27  #undef HAVE_LINUX_SENDFILE
28  
29 diff -urN proftpd-1.2.1/config.h.in proftpd-1.2/config.h.in
30 --- proftpd-1.2.1/config.h.in   Fri Feb 23 03:47:26 2001
31 +++ proftpd-1.2/config.h.in     Mon Mar 19 23:11:35 2001
32 @@ -19,12 +19,6 @@
33  /* Define if you have BSD sendfile() semantics */
34  #undef HAVE_BSD_SENDFILE
35  
36 -/* Define if you have the <glob.h> header file. */
37 -#undef HAVE_GLOB_H
38 -
39 -/* Define if your <glob.h> defines GLOB_PERIOD macro. */
40 -#undef HAVE_GLOB_PERIOD
41 -
42  /* Define if you have Linux sendfile() semantics */
43  #undef HAVE_LINUX_SENDFILE
44  
45 @@ -210,9 +204,6 @@
46  /* Define if you have the gettimeofday function.  */
47  #undef HAVE_GETTIMEOFDAY
48  
49 -/* Define if you have the glob function.  */
50 -#undef HAVE_GLOB
51 -
52  /* Define if you have the inet_aton function.  */
53  #undef HAVE_INET_ATON
54  
55 @@ -320,6 +311,9 @@
56  
57  /* Define if you have the <libutil.h> header file.  */
58  #undef HAVE_LIBUTIL_H
59 +
60 +/* Define if you have the <limits.h> header file.  */
61 +#undef HAVE_LIMITS_H
62  
63  /* Define if you have the <memory.h> header file.  */
64  #undef HAVE_MEMORY_H
65 diff -urN proftpd-1.2.1/configure.in proftpd-1.2/configure.in
66 --- proftpd-1.2.1/configure.in  Thu Mar  1 04:18:43 2001
67 +++ proftpd-1.2/configure.in    Mon Mar 19 23:11:35 2001
68 @@ -300,14 +300,13 @@
69  
70  fi
71  
72 -AC_CHECK_HEADERS(ctype.h getopt.h crypt.h bstring.h strings.h)
73 +AC_CHECK_HEADERS(ctype.h getopt.h crypt.h bstring.h strings.h limits.h)
74  AC_CHECK_HEADERS(sys/types.h sys/param.h sys/file.h sys/uio.h)
75  AC_CHECK_HEADERS(netdb.h netinet/in.h netinet/tcp.h arpa/inet.h sys/stat.h)
76  AC_CHECK_HEADERS(errno.h sys/socket.h sys/termios.h sys/termio.h)
77  AC_CHECK_HEADERS(sys/statvfs.h sys/vfs.h sys/select.h)
78  AC_CHECK_HEADERS(utmpx.h)
79  AC_CHECK_HEADERS(regex.h)
80 -AC_CHECK_HEADER(glob.h,have_glob_h="yes",)
81  AC_CHECK_HEADER(syslog.h,have_syslog_h="yes",)
82  
83  dnl Checks for typedefs, structures, and compiler characteristics.
84 @@ -362,35 +361,6 @@
85    fi
86  fi
87  
88 -if test "$have_glob_h" = "yes"; then
89 -  dnl See if we have GLOB_PERIOD
90 -  AC_CACHE_CHECK(whether your glob.h defines GLOB_PERIOD,
91 -               pr_cv_header_glob_period,
92 -       AC_EGREP_CPP(yes,[
93 -#include <glob.h>
94 -#ifdef GLOB_PERIOD
95 -  yes
96 -#endif
97 -       ],pr_cv_header_glob_period="yes",pr_cv_header_glob_period="no"))
98 -
99 -  dnl See if we have GLOB_ALTDIRFUNC
100 -  if test "$pr_cv_header_glob_period" = "yes"; then
101 -    AC_CACHE_CHECK(whether your glob.h defines GLOB_ALTDIRFUNC,
102 -                       pr_cv_header_glob_altdirfunc,
103 -       AC_EGREP_CPP(yes,[
104 -#include <glob.h>
105 -#ifdef GLOB_ALTDIRFUNC
106 -  yes
107 -#endif
108 -       ],pr_cv_header_glob_altdirfunc="yes",pr_cv_header_glob_altdirfunc="no"))
109 -
110 -    if test "$pr_cv_header_glob_altdirfunc" = "yes"; then
111 -      AC_DEFINE(HAVE_GLOB_H)
112 -      AC_DEFINE(HAVE_GLOB_PERIOD)
113 -    fi
114 -  fi
115 -fi
116 -
117  dnl See if various LOG_ macros are defined
118  if test "$have_syslog_h" = "yes"; then
119    AC_DEFINE(HAVE_SYSLOG_H)
120 @@ -538,13 +508,6 @@
121                 AC_DEFINE(HAVE_BSD_SENDFILE)
122                 ;;
123    esac
124 -fi
125 -
126 -dnl Only check for glob if we have glob.h, GLOB_PERIOD, and GLOB_ALTDIRFUNC
127 -if test "$have_glob_h" = "yes" && \
128 -   test "$pr_cv_header_glob_period" = "yes" && \
129 -   test "$pr_cv_header_glob_altdirfunc" = "yes"; then
130 -       AC_CHECK_FUNCS(glob)
131  fi
132  
133  dnl Check for various argv[] replacing functions on various OSs
134 diff -urN proftpd-1.2.1/include/conf.h proftpd-1.2/include/conf.h
135 --- proftpd-1.2.1/include/conf.h        Sun Aug 13 17:19:39 2000
136 +++ proftpd-1.2/include/conf.h  Mon Mar 19 23:11:35 2001
137 @@ -38,7 +38,7 @@
138   */
139  
140  /* Generic configuration and standard header file includes.
141 - * $Id$
142 + * $Id$
143   */
144  
145  #ifndef __CONF_H
146 @@ -156,10 +156,6 @@
147  
148  #ifdef HAVE_SYSLOG_H
149  # include <syslog.h>
150 -#endif
151 -
152 -#ifdef HAVE_GLOB
153 -# include <glob.h>
154  #endif
155  
156  #ifdef HAVE_DIRENT_H
157 diff -urN proftpd-1.2.1/include/glibc-glob.h proftpd-1.2/include/glibc-glob.h
158 --- proftpd-1.2.1/include/glibc-glob.h  Thu Jan  1 01:00:00 1970
159 +++ proftpd-1.2/include/glibc-glob.h    Thu Mar 22 14:43:36 2001
160 @@ -0,0 +1,221 @@
161 +/* Copyright (C) 1991,92,95,96,97,98,2000,2001 Free Software Foundation, Inc.
162 +
163 +   The GNU C Library is free software; you can redistribute it and/or
164 +   modify it under the terms of the GNU Library General Public License as
165 +   published by the Free Software Foundation; either version 2 of the
166 +   License, or (at your option) any later version.
167 +
168 +   The GNU C Library is distributed in the hope that it will be useful,
169 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
170 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
171 +   Library General Public License for more details.
172 +
173 +   You should have received a copy of the GNU Library General Public
174 +   License along with the GNU C Library; see the file COPYING.LIB.  If not,
175 +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
176 +   Boston, MA 02111-1307, USA.  */
177 +
178 +#ifndef        _GLOB_H
179 +#define        _GLOB_H 1
180 +
181 +#ifdef __cplusplus
182 +extern "C" {
183 +#endif
184 +
185 +#undef __ptr_t
186 +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
187 +# if !defined __GLIBC__ || !defined __P
188 +#  undef __P
189 +#  undef __PMT
190 +#  define __P(protos)  protos
191 +#  define __PMT(protos)        protos
192 +#  if !defined __GNUC__ || __GNUC__ < 2
193 +#   undef __const
194 +#   define __const const
195 +#  endif
196 +# endif
197 +# define __ptr_t       void *
198 +#else /* Not C++ or ANSI C.  */
199 +# undef        __P
200 +# undef __PMT
201 +# define __P(protos)   ()
202 +# define __PMT(protos) ()
203 +# undef        __const
204 +# define __const
205 +# define __ptr_t       char *
206 +#endif /* C++ or ANSI C.  */
207 +
208 +/* We need `size_t' for the following definitions.  */
209 +#ifndef __size_t
210 +# if defined __GNUC__ && __GNUC__ >= 2
211 +typedef __SIZE_TYPE__ __size_t;
212 +#  ifdef _XOPEN_SOURCE
213 +typedef __SIZE_TYPE__ size_t;
214 +#  endif
215 +# else
216 +/* This is a guess.  */
217 +typedef unsigned long int __size_t;
218 +# endif
219 +#else
220 +/* The GNU CC stddef.h version defines __size_t as empty.  We need a real
221 +   definition.  */
222 +# undef __size_t
223 +# define __size_t size_t
224 +#endif
225 +
226 +/* Bits set in the FLAGS argument to `glob'.  */
227 +#define        GLOB_ERR        (1 << 0)/* Return on read errors.  */
228 +#define        GLOB_MARK       (1 << 1)/* Append a slash to each name.  */
229 +#define        GLOB_NOSORT     (1 << 2)/* Don't sort the names.  */
230 +#define        GLOB_DOOFFS     (1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
231 +#define        GLOB_NOCHECK    (1 << 4)/* If nothing matches, return the pattern.  */
232 +#define        GLOB_APPEND     (1 << 5)/* Append to results of a previous call.  */
233 +#define        GLOB_NOESCAPE   (1 << 6)/* Backslashes don't quote metacharacters.  */
234 +#define        GLOB_PERIOD     (1 << 7)/* Leading `.' can be matched by metachars.  */
235 +
236 +#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \
237 +     || defined _GNU_SOURCE)
238 +# define GLOB_MAGCHAR   (1 << 8)/* Set in gl_flags if any metachars seen.  */
239 +# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
240 +# define GLOB_BRACE     (1 << 10)/* Expand "{a,b}" to "a" "b".  */
241 +# define GLOB_NOMAGIC   (1 << 11)/* If no magic chars, return the pattern.  */
242 +# define GLOB_TILDE     (1 << 12)/* Expand ~user and ~ to home directories. */
243 +# define GLOB_ONLYDIR   (1 << 13)/* Match only directories.  */
244 +# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
245 +                                     if the user name is not available.  */
246 +# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
247 +                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
248 +                        GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
249 +                        GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
250 +#else
251 +# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
252 +                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
253 +                        GLOB_PERIOD)
254 +#endif
255 +
256 +/* Error returns from `glob'.  */
257 +#define        GLOB_NOSPACE    1       /* Ran out of memory.  */
258 +#define        GLOB_ABORTED    2       /* Read error.  */
259 +#define        GLOB_NOMATCH    3       /* No matches found.  */
260 +#define GLOB_NOSYS     4       /* Not implemented.  */
261 +#ifdef _GNU_SOURCE
262 +/* Previous versions of this file defined GLOB_ABEND instead of
263 +   GLOB_ABORTED.  Provide a compatibility definition here.  */
264 +# define GLOB_ABEND GLOB_ABORTED
265 +#endif
266 +
267 +/* Structure describing a globbing run.  */
268 +#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
269 +# ifdef _GNU_SOURCE
270 +struct stat;
271 +# endif
272 +#endif
273 +typedef struct
274 +  {
275 +    __size_t gl_pathc;         /* Count of paths matched by the pattern.  */
276 +    char **gl_pathv;           /* List of matched pathnames.  */
277 +    __size_t gl_offs;          /* Slots to reserve in `gl_pathv'.  */
278 +    int gl_flags;              /* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
279 +
280 +    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
281 +       are used instead of the normal file access functions.  */
282 +    void (*gl_closedir) __PMT ((void *));
283 +#ifdef _GNU_SOURCE
284 +    struct dirent *(*gl_readdir) __PMT ((void *));
285 +#else
286 +    void *(*gl_readdir) __PMT ((void *));
287 +#endif
288 +    __ptr_t (*gl_opendir) __PMT ((__const char *));
289 +#ifdef _GNU_SOURCE
290 +    int (*gl_lstat) __PMT ((__const char *,
291 +                           struct stat *));
292 +    int (*gl_stat) __PMT ((__const char *, struct stat *));
293 +#else
294 +    int (*gl_lstat) __PMT ((__const char *, void *));
295 +    int (*gl_stat) __PMT ((__const char *, void *));
296 +#endif
297 +  } glob_t;
298 +
299 +#ifdef _LARGEFILE64_SOURCE
300 +# ifdef _GNU_SOURCE
301 +struct stat64;
302 +# endif
303 +typedef struct
304 +  {
305 +    __size_t gl_pathc;
306 +    char **gl_pathv;
307 +    __size_t gl_offs;
308 +    int gl_flags;
309 +
310 +    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
311 +       are used instead of the normal file access functions.  */
312 +    void (*gl_closedir) __PMT ((void *));
313 +# ifdef _GNU_SOURCE
314 +    struct dirent64 *(*gl_readdir) __PMT ((void *));
315 +# else
316 +    void *(*gl_readdir) __PMT ((void *));
317 +# endif
318 +    __ptr_t (*gl_opendir) __PMT ((__const char *));
319 +# ifdef _GNU_SOURCE
320 +    int (*gl_lstat) __PMT ((__const char *,
321 +                           struct stat64 *));
322 +    int (*gl_stat) __PMT ((__const char *,
323 +                          struct stat64 *));
324 +# else
325 +    int (*gl_lstat) __PMT ((__const char *, void *));
326 +    int (*gl_stat) __PMT ((__const char *, void *));
327 +# endif
328 +  } glob64_t;
329 +#endif
330 +
331 +#if _FILE_OFFSET_BITS == 64 && __GNUC__ < 2
332 +# define glob glob64
333 +# define globfree globfree64
334 +#endif
335 +
336 +/* Do glob searching for PATTERN, placing results in PGLOB.
337 +   The bits defined above may be set in FLAGS.
338 +   If a directory cannot be opened or read and ERRFUNC is not nil,
339 +   it is called with the pathname that caused the error, and the
340 +   `errno' value from the failing call; if it returns non-zero
341 +   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
342 +   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
343 +   Otherwise, `glob' returns zero.  */
344 +#if _FILE_OFFSET_BITS != 64 || __GNUC__ < 2
345 +extern int glob __P ((__const char *__pattern, int __flags,
346 +                     int (*__errfunc) (__const char *, int),
347 +                     glob_t *__pglob));
348 +
349 +/* Free storage allocated in PGLOB by a previous `glob' call.  */
350 +extern void globfree __P ((glob_t *__pglob));
351 +#else
352 +extern int glob __P ((__const char *__pattern, int __flags,
353 +                     int (*__errfunc) (__const char *, int),
354 +                     glob_t *__pglob));
355 +
356 +extern void globfree __P ((glob_t *__pglob));
357 +#endif
358 +
359 +#ifdef _LARGEFILE64_SOURCE
360 +extern int glob64 __P ((__const char *__pattern, int __flags,
361 +                       int (*__errfunc) (__const char *, int),
362 +                       glob64_t *__pglob));
363 +
364 +extern void globfree64 __P ((glob64_t *__pglob));
365 +#endif
366 +
367 +
368 +#ifdef _GNU_SOURCE
369 +/* Return nonzero if PATTERN contains any metacharacters.
370 +   Metacharacters can be quoted with backslashes if QUOTE is nonzero.
371 +
372 +   This function is not part of the interface specified by POSIX.2
373 +   but several programs want to use it.  */
374 +extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
375 +#endif
376 +
377 +#ifdef __cplusplus
378 +}
379 +#endif
380 +
381 +#endif /* glob.h  */
382 diff -urN proftpd-1.2.1/include/libsupp.h proftpd-1.2/include/libsupp.h
383 --- proftpd-1.2.1/include/libsupp.h     Wed Aug  2 07:25:24 2000
384 +++ proftpd-1.2/include/libsupp.h       Mon Mar 19 23:11:35 2001
385 @@ -23,66 +23,10 @@
386  
387  /* ProFTPD support library definitions.
388   *
389 - * $Id$
390 + * $Id$
391   */
392  
393 -#if !defined HAVE_GLOB && !defined __PROFTPD_SUPPORT_LIBRARY
394 -
395 -#ifndef __P
396 -#define __P(x) x
397 -#endif
398 -
399 -/* Bits set in the FLAGS argument to `glob'.  */
400 -#define GLOB_ERR        (1 << 0)/* Return on read errors.  */
401 -#define GLOB_MARK       (1 << 1)/* Append a slash to each name.  */
402 -#define GLOB_NOSORT     (1 << 2)/* Don't sort the names.  */
403 -#define GLOB_DOOFFS     (1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
404 -#define GLOB_NOCHECK    (1 << 4)/* If nothing matches, return the pattern.  */ 
405 -#define GLOB_APPEND     (1 << 5)/* Append to results of a previous call.  */   
406 -#define GLOB_NOESCAPE   (1 << 6)/* Backslashes don't quote metacharacters.  */
407 -#define GLOB_PERIOD     (1 << 7)/* Leading `.' can be matched by metachars.  */
408 -# define GLOB_MAGCHAR    (1 << 8)/* Set in gl_flags if any metachars seen.  */
409 -# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
410 -# define GLOB_BRACE      (1 << 10)/* Expand "{a,b}" to "a" "b".  */
411 -# define GLOB_NOMAGIC    (1 << 11)/* If no magic chars, return the pattern.  */
412 -# define GLOB_TILDE      (1 << 12)/* Expand ~user and ~ to home directories. */
413 -# define GLOB_ONLYDIR    (1 << 13)/* Match only directories.  */
414 -# define __GLOB_FLAGS   (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
415 -                         GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
416 -                         GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
417 -                         GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR)
418 -#define GLOB_NOSPACE    1       /* Ran out of memory.  */
419 -#define GLOB_ABORTED    2       /* Read error.  */
420 -#define GLOB_NOMATCH    3       /* No matches found.  */
421 -
422 -/* Structure describing a globbing run.  */
423 -#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
424 -struct stat;
425 -#endif
426 -typedef struct
427 -  {
428 -    int gl_pathc;               /* Count of paths matched by the pattern.  */
429 -    char **gl_pathv;            /* List of matched pathnames.  */
430 -    int gl_offs;                /* Slots to reserve in `gl_pathv'.  */
431 -    int gl_flags;               /* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
432 -
433 -    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
434 -       are used instead of the normal file access functions.  */  
435 -    void (*gl_closedir) __P ((void *));
436 -    struct dirent *(*gl_readdir) __P ((void *));
437 -    void *(*gl_opendir) __P ((const char *));
438 -    int (*gl_lstat) __P ((const char *, struct stat *));
439 -    int (*gl_stat) __P ((const char *, struct stat *));
440 -  } glob_t;
441 -
442 -extern int glob (const char *__pattern, int __flags,
443 -                      int (*__errfunc)(const char *, int),
444 -                      glob_t *__pglob);
445 -extern void globfree (glob_t *__pglob);
446 -extern int __glob_pattern_p (const char *__pattern, int __quote);
447 -extern int glob_pattern_p (const char *__pattern, int __quote);
448 -
449 -#endif /* HAVE_GLOB */
450 +#include <glibc-glob.h>
451  
452  /* Bits set in the FLAGS argument to `pr_fnmatch'.  */
453  #define        PR_FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'.  */
454 diff -urN proftpd-1.2.1/lib/Makefile.in proftpd-1.2/lib/Makefile.in
455 --- proftpd-1.2.1/lib/Makefile.in       Thu Mar  1 17:02:10 2001
456 +++ proftpd-1.2/lib/Makefile.in Sun Feb 25 00:09:19 2001
457 @@ -32,15 +32,15 @@
458  # Dependancies written below
459  # DO NOT DELETE
460  
461 +pr_fnmatch.o: ../include/conf.h ../include/version.h ../config.h
462 +pr_fnmatch.o: ../include/default_paths.h ../include/options.h
463 +pr_fnmatch.o: ../include/libsupp.h pr_fnmatch_loop.c
464  getopt.o: ../include/conf.h ../include/version.h ../config.h
465  getopt.o: ../include/default_paths.h ../include/options.h getopt.h
466  getopt1.o: ../include/conf.h ../include/version.h ../config.h
467  getopt1.o: ../include/default_paths.h ../include/options.h getopt.h
468  glob.o: ../include/conf.h ../include/version.h ../config.h
469  glob.o: ../include/default_paths.h ../include/options.h ../include/libsupp.h
470 -pr_fnmatch.o: ../include/conf.h ../include/version.h ../config.h
471 -pr_fnmatch.o: ../include/default_paths.h ../include/options.h
472 -pr_fnmatch.o: ../include/libsupp.h pr_fnmatch_loop.c
473  pwgrent.o: ../include/conf.h ../include/version.h ../config.h
474  pwgrent.o: ../include/default_paths.h ../include/options.h
475  strsep.o: ../include/conf.h ../include/version.h ../config.h
476 diff -urN proftpd-1.2.1/lib/glibc-glob.c proftpd-1.2/lib/glibc-glob.c
477 --- proftpd-1.2.1/lib/glibc-glob.c      Thu Jan  1 01:00:00 1970
478 +++ proftpd-1.2/lib/glibc-glob.c        Sat Mar 17 21:34:31 2001
479 @@ -0,0 +1,1544 @@
480 +/* Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc.
481 +
482 +   This library is free software; you can redistribute it and/or
483 +   modify it under the terms of the GNU Library General Public License as
484 +   published by the Free Software Foundation; either version 2 of the
485 +   License, or (at your option) any later version.
486 +
487 +   This library is distributed in the hope that it will be useful,
488 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
489 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
490 +   Library General Public License for more details.
491 +
492 +   You should have received a copy of the GNU Library General Public
493 +   License along with this library; see the file COPYING.LIB.  If not,
494 +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
495 +   Boston, MA 02111-1307, USA.  */
496 +
497 +/* AIX requires this to be the first thing in the file.  */
498 +
499 +#if defined _AIX && !defined __GNUC__
500 + #pragma alloca
501 +#endif
502 +
503 +#include <config.h>
504 +
505 +#define MAX_RECURSION 8
506 +#define MAX_RESULTS 100000UL
507 +
508 +/* Enable GNU extensions in glob.h.  */
509 +#ifndef _GNU_SOURCE
510 +# define _GNU_SOURCE   1
511 +#endif
512 +
513 +#include <errno.h>
514 +#include <sys/types.h>
515 +#include <sys/stat.h>
516 +
517 +/* Outcomment the following line for production quality code.  */
518 +/* #define NDEBUG 1 */
519 +#include <assert.h>
520 +
521 +#include <stdio.h>             /* Needed on stupid SunOS for assert.  */
522 +
523 +
524 +/* Comment out all this code if we are using the GNU C Library, and are not
525 +   actually compiling the library itself.  This code is part of the GNU C
526 +   Library, but also included in many other GNU distributions.  Compiling
527 +   and linking in this code is a waste when using the GNU C library
528 +   (especially if it is a shared library).  Rather than having every GNU
529 +   program understand `configure --with-gnu-libc' and omit the object files,
530 +   it is simpler to just do this in the source for each such file.  */
531 +
532 +/* Proftpd modification: always undefine __GNU_LIBRARY__ because we are not
533 + * compiling as part of glibc.
534 + * jss - 3/17/2001
535 + */
536 +
537 +#undef __GNU_LIBRARY__
538 +
539 +#define GLOB_INTERFACE_VERSION 1
540 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
541 +# include <gnu-versions.h>
542 +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
543 +#  define ELIDE_CODE
544 +# endif
545 +#endif
546 +
547 +#undef ELIDE_CODE
548 +#define __alloca alloca
549 +#define __readdir readdir
550 +
551 +#ifndef ELIDE_CODE
552 +#if !defined _LIBC || !defined GLOB_ONLY_P
553 +
554 +#if defined STDC_HEADERS || defined __GNU_LIBRARY__
555 +# include <stddef.h>
556 +#endif
557 +
558 +#if defined HAVE_UNISTD_H || defined _LIBC
559 +# include <unistd.h>
560 +# ifndef POSIX
561 +#  ifdef _POSIX_VERSION
562 +#   define POSIX
563 +#  endif
564 +# endif
565 +#endif
566 +
567 +#if !defined _AMIGA && !defined VMS && !defined WINDOWS32
568 +# include <pwd.h>
569 +#endif
570 +
571 +#if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
572 +extern int errno;
573 +#endif
574 +#ifndef __set_errno
575 +# define __set_errno(val) errno = (val)
576 +#endif
577 +
578 +#ifndef        NULL
579 +# define NULL  0
580 +#endif
581 +
582 +#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
583 +# include <dirent.h>
584 +# define NAMLEN(dirent) strlen((dirent)->d_name)
585 +#else
586 +# define dirent direct
587 +# define NAMLEN(dirent) (dirent)->d_namlen
588 +# ifdef HAVE_SYS_NDIR_H
589 +#  include <sys/ndir.h>
590 +# endif
591 +# ifdef HAVE_SYS_DIR_H
592 +#  include <sys/dir.h>
593 +# endif
594 +# ifdef HAVE_NDIR_H
595 +#  include <ndir.h>
596 +# endif
597 +# ifdef HAVE_VMSDIR_H
598 +#  include "vmsdir.h"
599 +# endif /* HAVE_VMSDIR_H */
600 +#endif
601 +
602 +
603 +/* In GNU systems, <dirent.h> defines this macro for us.  */
604 +#ifdef _D_NAMLEN
605 +# undef NAMLEN
606 +# define NAMLEN(d) _D_NAMLEN(d)
607 +#endif
608 +
609 +/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
610 +   if the `d_type' member for `struct dirent' is available.  */
611 +#ifdef _DIRENT_HAVE_D_TYPE
612 +# define HAVE_D_TYPE   1
613 +#endif
614 +
615 +#if _LIBC
616 +# define HAVE_DIRENT64 1
617 +#endif
618 +
619 +/* If the system has the `struct dirent64' type we use it internally.  */
620 +#if defined HAVE_DIRENT64 && !defined COMPILE_GLOB64
621 +# if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
622 +#  define CONVERT_D_NAMLEN(d64, d32)
623 +# else
624 +#  define CONVERT_D_NAMLEN(d64, d32) \
625 +  (d64)->d_namlen = (d32)->d_namlen;
626 +# endif
627 +
628 +# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
629 +#  define CONVERT_D_INO(d64, d32)
630 +# else
631 +#  define CONVERT_D_INO(d64, d32) \
632 +  (d64)->d_ino = (d32)->d_ino;
633 +# endif
634 +
635 +# ifdef HAVE_D_TYPE
636 +#  define CONVERT_D_TYPE(d64, d32) \
637 +  (d64)->d_type = (d32)->d_type;
638 +# else
639 +#  define CONVERT_D_TYPE(d64, d32)
640 +# endif
641 +
642 +# define CONVERT_DIRENT_DIRENT64(d64, d32) \
643 +  memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1);                   \
644 +  CONVERT_D_NAMLEN (d64, d32)                                                \
645 +  CONVERT_D_INO (d64, d32)                                                   \
646 +  CONVERT_D_TYPE (d64, d32)
647 +#endif
648 +
649 +
650 +#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
651 +/* Posix does not require that the d_ino field be present, and some
652 +   systems do not provide it. */
653 +# define REAL_DIR_ENTRY(dp) 1
654 +#else
655 +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
656 +#endif /* POSIX */
657 +
658 +#if defined STDC_HEADERS || defined __GNU_LIBRARY__
659 +# include <stdlib.h>
660 +# include <string.h>
661 +# define       ANSI_STRING
662 +#else  /* No standard headers.  */
663 +
664 +extern char *getenv ();
665 +
666 +# ifdef HAVE_STRING_H
667 +#  include <string.h>
668 +#  define ANSI_STRING
669 +# else
670 +#  include <strings.h>
671 +# endif
672 +# ifdef        HAVE_MEMORY_H
673 +#  include <memory.h>
674 +# endif
675 +
676 +extern char *malloc (), *realloc ();
677 +extern void free ();
678 +
679 +extern void qsort ();
680 +extern void abort (), exit ();
681 +
682 +#endif /* Standard headers.  */
683 +
684 +#ifndef        ANSI_STRING
685 +
686 +# ifndef bzero
687 +extern void bzero ();
688 +# endif
689 +# ifndef bcopy
690 +extern void bcopy ();
691 +# endif
692 +
693 +# define memcpy(d, s, n)       bcopy ((s), (d), (n))
694 +# define strrchr       rindex
695 +/* memset is only used for zero here, but let's be paranoid.  */
696 +# define memset(s, better_be_zero, n) \
697 +  ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
698 +#endif /* Not ANSI_STRING.  */
699 +
700 +#if !defined HAVE_STRCOLL && !defined _LIBC
701 +# define strcoll       strcmp
702 +#endif
703 +
704 +#if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
705 +# define HAVE_MEMPCPY  1
706 +# undef  mempcpy
707 +# define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
708 +#endif
709 +
710 +static unsigned long nbresults;
711 +
712 +#ifndef        __GNU_LIBRARY__
713 +# ifdef        __GNUC__
714 +__inline
715 +# endif
716 +# ifndef __SASC
717 +#  ifdef WINDOWS32
718 +static void *
719 +#  else
720 +static char *
721 +# endif
722 +my_realloc (p, n)
723 +     char *p;
724 +     unsigned int n;
725 +{
726 +  /* These casts are the for sake of the broken Ultrix compiler,
727 +     which warns of illegal pointer combinations otherwise.  */
728 +  if (p == NULL)
729 +    return (char *) malloc (n);
730 +  return (char *) realloc (p, n);
731 +}
732 +# define       realloc my_realloc
733 +# endif /* __SASC */
734 +#endif /* __GNU_LIBRARY__ */
735 +
736 +
737 +#if !defined __alloca && !defined __GNU_LIBRARY__
738 +
739 +# ifdef        __GNUC__
740 +#  undef alloca
741 +#  define alloca(n)    __builtin_alloca (n)
742 +# else /* Not GCC.  */
743 +#  ifdef HAVE_ALLOCA_H
744 +#   include <alloca.h>
745 +#  else        /* Not HAVE_ALLOCA_H.  */
746 +#   ifndef _AIX
747 +#    ifdef WINDOWS32
748 +#     include <malloc.h>
749 +#    else
750 +extern char *alloca ();
751 +#    endif /* WINDOWS32 */
752 +#   endif /* Not _AIX.  */
753 +#  endif /* sparc or HAVE_ALLOCA_H.  */
754 +# endif        /* GCC.  */
755 +
756 +# define __alloca      alloca
757 +
758 +#endif
759 +
760 +#ifndef __GNU_LIBRARY__
761 +# define __stat stat
762 +# ifdef STAT_MACROS_BROKEN
763 +#  undef S_ISDIR
764 +# endif
765 +# ifndef S_ISDIR
766 +#  define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
767 +# endif
768 +#endif
769 +
770 +#ifdef _LIBC
771 +# undef strdup
772 +# define strdup(str) __strdup (str)
773 +# define sysconf(id) __sysconf (id)
774 +# define closedir(dir) __closedir (dir)
775 +# define opendir(name) __opendir (name)
776 +# define readdir(str) __readdir64 (str)
777 +# define getpwnam_r(name, bufp, buf, len, res) \
778 +   __getpwnam_r (name, bufp, buf, len, res)
779 +# ifndef __stat64
780 +#  define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
781 +# endif
782 +# define HAVE_STAT64   1
783 +#endif
784 +
785 +#ifndef HAVE_STAT64
786 +# define __stat64(fname, buf) __stat (fname, buf)
787 +/* This is the variable name we are using.  */
788 +# define st64 st
789 +#endif
790 +
791 +#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
792 +# undef        size_t
793 +# define size_t        unsigned int
794 +#endif
795 +
796 +/* Some system header files erroneously define these.
797 +   We want our own definitions from <fnmatch.h> to take precedence.  */
798 +#ifndef __GNU_LIBRARY__
799 +# undef        FNM_PATHNAME
800 +# undef        FNM_NOESCAPE
801 +# undef        FNM_PERIOD
802 +#endif
803 +#include <fnmatch.h>
804 +
805 +/* Some system header files erroneously define these.
806 +   We want our own definitions from <glob.h> to take precedence.  */
807 +#ifndef __GNU_LIBRARY__
808 +# undef        GLOB_ERR
809 +# undef        GLOB_MARK
810 +# undef        GLOB_NOSORT
811 +# undef        GLOB_DOOFFS
812 +# undef        GLOB_NOCHECK
813 +# undef        GLOB_APPEND
814 +# undef        GLOB_NOESCAPE
815 +# undef        GLOB_PERIOD
816 +#endif
817 +#include <glibc-glob.h>
818 +
819 +#ifdef HAVE_GETLOGIN_R
820 +extern int getlogin_r __P ((char *, size_t));
821 +#else
822 +extern char *getlogin __P ((void));
823 +#endif
824 +\f
825 +static
826 +#if __GNUC__ - 0 >= 2
827 +inline
828 +#endif
829 +const char *next_brace_sub __P ((const char *begin));
830 +
831 +#endif /* GLOB_ONLY_P */
832 +
833 +static int glob_in_dir __P ((const char *pattern, const char *directory,
834 +                            int flags,
835 +                            int (*errfunc) (const char *, int),
836 +                            glob_t *pglob));
837 +
838 +/* Prototype __glob_pattern_p to avoid compiler warning.
839 + * jss - 3/17/2001
840 + */
841 +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
842 +/* Return nonzero if PATTERN contains any metacharacters.
843 +   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
844 +int __glob_pattern_p (const char *pattern, int quote);
845 +#endif /* NO_GLOB_PATTERN_P */
846 +
847 +#if !defined _LIBC || !defined GLOB_ONLY_P
848 +static int prefix_array __P ((const char *prefix, char **array, size_t n));
849 +static int collated_compare __P ((const __ptr_t, const __ptr_t));
850 +
851 +
852 +/* Find the end of the sub-pattern in a brace expression.  We define
853 +   this as an inline function if the compiler permits.  */
854 +static
855 +#if __GNUC__ - 0 >= 2
856 +inline
857 +#endif
858 +const char *
859 +next_brace_sub (begin)
860 +     const char *begin;
861 +{
862 +  unsigned int depth = 0;
863 +  const char *cp = begin;
864 +
865 +  while (1)
866 +    {
867 +      if (depth == 0)
868 +       {
869 +         if (*cp != ',' && *cp != '}' && *cp != '\0')
870 +           {
871 +             if (*cp == '{')
872 +               ++depth;
873 +             ++cp;
874 +             continue;
875 +           }
876 +       }
877 +      else
878 +       {
879 +         while (*cp != '\0' && (*cp != '}' || depth > 0))
880 +           {
881 +             if (*cp == '}')
882 +               --depth;
883 +             ++cp;
884 +           }
885 +         if (*cp == '\0')
886 +           /* An incorrectly terminated brace expression.  */
887 +           return NULL;
888 +
889 +         continue;
890 +       }
891 +      break;
892 +    }
893 +
894 +  return cp;
895 +}
896 +
897 +#endif /* !GLOB_ONLY_P */
898 +
899 +
900 +/* Do glob searching for PATTERN, placing results in PGLOB.
901 +   The bits defined above may be set in FLAGS.
902 +   If a directory cannot be opened or read and ERRFUNC is not nil,
903 +   it is called with the pathname that caused the error, and the
904 +   `errno' value from the failing call; if it returns non-zero
905 +   `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
906 +   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
907 +   Otherwise, `glob' returns zero.  */
908 +static int
909 +glob_limited (depth, pattern, flags, errfunc, pglob)
910 +        unsigned int depth;                    
911 +     const char *pattern;
912 +     int flags;
913 +     int (*errfunc) __P ((const char *, int));
914 +     glob_t *pglob;
915 +{
916 +  const char *filename;
917 +  const char *dirname;
918 +  size_t dirlen;
919 +  int status;
920 +  size_t oldcount;
921 +
922 +       if (depth > MAX_RECURSION) {
923 +               return GLOB_NOSPACE;
924 +       }
925 +  if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
926 +    {
927 +      __set_errno (EINVAL);
928 +      return -1;
929 +    }
930 +
931 +  if (!(flags & GLOB_DOOFFS))
932 +    /* Have to do this so `globfree' knows where to start freeing.  It
933 +       also makes all the code that uses gl_offs simpler. */
934 +    pglob->gl_offs = 0;
935 +
936 +  if (flags & GLOB_BRACE)
937 +    {
938 +      const char *begin = strchr (pattern, '{');
939 +      if (begin != NULL)
940 +       {
941 +         /* Allocate working buffer large enough for our work.  Note that
942 +           we have at least an opening and closing brace.  */
943 +         size_t firstc;
944 +         char *alt_start;
945 +         const char *p;
946 +         const char *next;
947 +         const char *rest;
948 +         size_t rest_len;
949 +#ifdef __GNUC__
950 +         char onealt[strlen (pattern) - 1];
951 +#else
952 +         char *onealt = (char *) malloc (strlen (pattern) - 1);
953 +         if (onealt == NULL)
954 +           {
955 +             if (!(flags & GLOB_APPEND))
956 +               globfree (pglob);
957 +             return GLOB_NOSPACE;
958 +           }
959 +#endif
960 +
961 +         /* We know the prefix for all sub-patterns.  */
962 +#ifdef HAVE_MEMPCPY
963 +         alt_start = mempcpy (onealt, pattern, begin - pattern);
964 +#else
965 +         memcpy (onealt, pattern, begin - pattern);
966 +         alt_start = &onealt[begin - pattern];
967 +#endif
968 +
969 +         /* Find the first sub-pattern and at the same time find the
970 +            rest after the closing brace.  */
971 +         next = next_brace_sub (begin + 1);
972 +         if (next == NULL)
973 +           {
974 +             /* It is an illegal expression.  */
975 +#ifndef __GNUC__
976 +             free (onealt);
977 +#endif
978 +             return glob_limited (depth + 1U, pattern, flags & ~GLOB_BRACE, errfunc, pglob);
979 +           }
980 +
981 +         /* Now find the end of the whole brace expression.  */
982 +         rest = next;
983 +         while (*rest != '}')
984 +           {
985 +             rest = next_brace_sub (rest + 1);
986 +             if (rest == NULL)
987 +               {
988 +                 /* It is an illegal expression.  */
989 +#ifndef __GNUC__
990 +                 free (onealt);
991 +#endif
992 +                 return glob_limited (depth + 1U, pattern, flags & ~GLOB_BRACE, errfunc, pglob);
993 +               }
994 +           }
995 +         /* Please note that we now can be sure the brace expression
996 +            is well-formed.  */
997 +         rest_len = strlen (++rest) + 1;
998 +
999 +         /* We have a brace expression.  BEGIN points to the opening {,
1000 +            NEXT points past the terminator of the first element, and END
1001 +            points past the final }.  We will accumulate result names from
1002 +            recursive runs for each brace alternative in the buffer using
1003 +            GLOB_APPEND.  */
1004 +
1005 +         if (!(flags & GLOB_APPEND))
1006 +           {
1007 +             /* This call is to set a new vector, so clear out the
1008 +                vector so we can append to it.  */
1009 +             pglob->gl_pathc = 0;
1010 +             pglob->gl_pathv = NULL;
1011 +           }
1012 +         firstc = pglob->gl_pathc;
1013 +
1014 +         p = begin + 1;
1015 +         while (1)
1016 +           {
1017 +             int result;
1018 +                       
1019 +             /* Construct the new glob expression.  */
1020 +#ifdef HAVE_MEMPCPY
1021 +             mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
1022 +#else
1023 +             memcpy (alt_start, p, next - p);
1024 +             memcpy (&alt_start[next - p], rest, rest_len);
1025 +#endif
1026 +
1027 +             result = glob_limited (depth + 1U, onealt,
1028 +                            ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
1029 +                             | GLOB_APPEND), errfunc, pglob);
1030 +
1031 +             /* If we got an error, return it.  */
1032 +             if (result && result != GLOB_NOMATCH)
1033 +               {
1034 +#ifndef __GNUC__
1035 +                 free (onealt);
1036 +#endif
1037 +                 if (!(flags & GLOB_APPEND))
1038 +                   globfree (pglob);
1039 +                 return result;
1040 +               }
1041 +
1042 +             if (*next == '}')
1043 +               /* We saw the last entry.  */
1044 +               break;
1045 +
1046 +             p = next + 1;
1047 +             next = next_brace_sub (p);
1048 +             assert (next != NULL);
1049 +           }
1050 +
1051 +#ifndef __GNUC__
1052 +         free (onealt);
1053 +#endif
1054 +
1055 +         if (pglob->gl_pathc != firstc)
1056 +           /* We found some entries.  */
1057 +           return 0;
1058 +         else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
1059 +           return GLOB_NOMATCH;
1060 +       }
1061 +    }
1062 +
1063 +  /* Find the filename.  */
1064 +  filename = strrchr (pattern, '/');
1065 +#if defined __MSDOS__ || defined WINDOWS32
1066 +  /* The case of "d:pattern".  Since `:' is not allowed in
1067 +     file names, we can safely assume that wherever it
1068 +     happens in pattern, it signals the filename part.  This
1069 +     is so we could some day support patterns like "[a-z]:foo".  */
1070 +  if (filename == NULL)
1071 +    filename = strchr (pattern, ':');
1072 +#endif /* __MSDOS__ || WINDOWS32 */
1073 +  if (filename == NULL)
1074 +    {
1075 +      /* This can mean two things: a simple name or "~name".  The latter
1076 +        case is nothing but a notation for a directory.  */
1077 +      if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
1078 +       {
1079 +         dirname = pattern;
1080 +         dirlen = strlen (pattern);
1081 +
1082 +         /* Set FILENAME to NULL as a special flag.  This is ugly but
1083 +            other solutions would require much more code.  We test for
1084 +            this special case below.  */
1085 +         filename = NULL;
1086 +       }
1087 +      else
1088 +       {
1089 +         filename = pattern;
1090 +#ifdef _AMIGA
1091 +         dirname = "";
1092 +#else
1093 +         dirname = ".";
1094 +#endif
1095 +         dirlen = 0;
1096 +       }
1097 +    }
1098 +  else if (filename == pattern)
1099 +    {
1100 +      /* "/pattern".  */
1101 +      dirname = "/";
1102 +      dirlen = 1;
1103 +      ++filename;
1104 +    }
1105 +  else
1106 +    {
1107 +      char *newp;
1108 +      dirlen = filename - pattern;
1109 +#if defined __MSDOS__ || defined WINDOWS32
1110 +      if (*filename == ':'
1111 +         || (filename > pattern + 1 && filename[-1] == ':'))
1112 +       {
1113 +         char *drive_spec;
1114 +
1115 +         ++dirlen;
1116 +         drive_spec = (char *) __alloca (dirlen + 1);
1117 +#ifdef HAVE_MEMPCPY
1118 +         *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
1119 +#else
1120 +         memcpy (drive_spec, pattern, dirlen);
1121 +         drive_spec[dirlen] = '\0';
1122 +#endif
1123 +         /* For now, disallow wildcards in the drive spec, to
1124 +            prevent infinite recursion in glob.  */
1125 +         if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
1126 +           return GLOB_NOMATCH;
1127 +         /* If this is "d:pattern", we need to copy `:' to DIRNAME
1128 +            as well.  If it's "d:/pattern", don't remove the slash
1129 +            from "d:/", since "d:" and "d:/" are not the same.*/
1130 +       }
1131 +#endif
1132 +      newp = (char *) __alloca (dirlen + 1);
1133 +#ifdef HAVE_MEMPCPY
1134 +      *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
1135 +#else
1136 +      memcpy (newp, pattern, dirlen);
1137 +      newp[dirlen] = '\0';
1138 +#endif
1139 +      dirname = newp;
1140 +      ++filename;
1141 +
1142 +      if (filename[0] == '\0'
1143 +#if defined __MSDOS__ || defined WINDOWS32
1144 +          && dirname[dirlen - 1] != ':'
1145 +         && (dirlen < 3 || dirname[dirlen - 2] != ':'
1146 +             || dirname[dirlen - 1] != '/')
1147 +#endif
1148 +         && dirlen > 1)
1149 +       /* "pattern/".  Expand "pattern", appending slashes.  */
1150 +       {
1151 +         int val = glob_limited (depth + 1U, dirname, flags | GLOB_MARK, errfunc, pglob);
1152 +         if (val == 0)
1153 +           pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
1154 +                              | (flags & GLOB_MARK));
1155 +         return val;
1156 +       }
1157 +    }
1158 +
1159 +  if (!(flags & GLOB_APPEND))
1160 +    {
1161 +      pglob->gl_pathc = 0;
1162 +      if (!(flags & GLOB_DOOFFS))
1163 +        pglob->gl_pathv = NULL;
1164 +      else
1165 +       {
1166 +         size_t i;
1167 +         pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1)
1168 +                                             * sizeof (char *));
1169 +         if (pglob->gl_pathv == NULL)
1170 +           return GLOB_NOSPACE;
1171 +
1172 +         for (i = 0; i <= pglob->gl_offs; ++i)
1173 +           pglob->gl_pathv[i] = NULL;
1174 +       }
1175 +    }
1176 +
1177 +  oldcount = pglob->gl_pathc + pglob->gl_offs;
1178 +
1179 +#ifndef VMS
1180 +  if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
1181 +    {
1182 +      if (dirname[1] == '\0' || dirname[1] == '/')
1183 +       {
1184 +         /* Look up home directory.  */
1185 +         const char *home_dir = getenv ("HOME");
1186 +# ifdef _AMIGA
1187 +         if (home_dir == NULL || home_dir[0] == '\0')
1188 +           home_dir = "SYS:";
1189 +# else
1190 +#  ifdef WINDOWS32
1191 +         if (home_dir == NULL || home_dir[0] == '\0')
1192 +            home_dir = "c:/users/default"; /* poor default */
1193 +#  else
1194 +         if (home_dir == NULL || home_dir[0] == '\0')
1195 +           {
1196 +             int success;
1197 +             char *name;
1198 +#   if defined HAVE_GETLOGIN_R || defined _LIBC
1199 +             size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
1200 +
1201 +             if (buflen == 0)
1202 +               /* `sysconf' does not support _SC_LOGIN_NAME_MAX.  Try
1203 +                  a moderate value.  */
1204 +               buflen = 20;
1205 +             name = (char *) __alloca (buflen);
1206 +
1207 +             success = getlogin_r (name, buflen) >= 0;
1208 +#   else
1209 +             success = (name = getlogin ()) != NULL;
1210 +#   endif
1211 +             if (success)
1212 +               {
1213 +                 struct passwd *p;
1214 +#   if defined HAVE_GETPWNAM_R || defined _LIBC
1215 +                 long int pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
1216 +                 char *pwtmpbuf;
1217 +                 struct passwd pwbuf;
1218 +                 int save = errno;
1219 +
1220 +                 if (pwbuflen == -1)
1221 +                   /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
1222 +                      Try a moderate value.  */
1223 +                   pwbuflen = 1024;
1224 +                 pwtmpbuf = (char *) __alloca (pwbuflen);
1225 +
1226 +                 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
1227 +                        != 0)
1228 +                   {
1229 +                     if (errno != ERANGE)
1230 +                       {
1231 +                         p = NULL;
1232 +                         break;
1233 +                       }
1234 +                     pwbuflen *= 2;
1235 +                     pwtmpbuf = (char *) __alloca (pwbuflen);
1236 +                     __set_errno (save);
1237 +                   }
1238 +#   else
1239 +                 p = getpwnam (name);
1240 +#   endif
1241 +                 if (p != NULL)
1242 +                   home_dir = p->pw_dir;
1243 +               }
1244 +           }
1245 +         if (home_dir == NULL || home_dir[0] == '\0')
1246 +           {
1247 +             if (flags & GLOB_TILDE_CHECK)
1248 +               return GLOB_NOMATCH;
1249 +             else
1250 +               home_dir = "~"; /* No luck.  */
1251 +           }
1252 +#  endif /* WINDOWS32 */
1253 +# endif
1254 +         /* Now construct the full directory.  */
1255 +         if (dirname[1] == '\0')
1256 +           dirname = home_dir;
1257 +         else
1258 +           {
1259 +             char *newp;
1260 +             size_t home_len = strlen (home_dir);
1261 +             newp = (char *) __alloca (home_len + dirlen);
1262 +# ifdef HAVE_MEMPCPY
1263 +             mempcpy (mempcpy (newp, home_dir, home_len),
1264 +                      &dirname[1], dirlen);
1265 +# else
1266 +             memcpy (newp, home_dir, home_len);
1267 +             memcpy (&newp[home_len], &dirname[1], dirlen);
1268 +# endif
1269 +             dirname = newp;
1270 +           }
1271 +       }
1272 +# if !defined _AMIGA && !defined WINDOWS32
1273 +      else
1274 +       {
1275 +         char *end_name = strchr (dirname, '/');
1276 +         const char *user_name;
1277 +         const char *home_dir;
1278 +
1279 +         if (end_name == NULL)
1280 +           user_name = dirname + 1;
1281 +         else
1282 +           {
1283 +             char *newp;
1284 +             newp = (char *) __alloca (end_name - dirname);
1285 +# ifdef HAVE_MEMPCPY
1286 +             *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
1287 +               = '\0';
1288 +# else
1289 +             memcpy (newp, dirname + 1, end_name - dirname);
1290 +             newp[end_name - dirname - 1] = '\0';
1291 +# endif
1292 +             user_name = newp;
1293 +           }
1294 +
1295 +         /* Look up specific user's home directory.  */
1296 +         {
1297 +           struct passwd *p;
1298 +#  if defined HAVE_GETPWNAM_R || defined _LIBC
1299 +           long int buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
1300 +           char *pwtmpbuf;
1301 +           struct passwd pwbuf;
1302 +           int save = errno;
1303 +
1304 +           if (buflen == -1)
1305 +             /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.  Try a
1306 +                moderate value.  */
1307 +             buflen = 1024;
1308 +           pwtmpbuf = (char *) __alloca (buflen);
1309 +
1310 +           while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
1311 +             {
1312 +               if (errno != ERANGE)
1313 +                 {
1314 +                   p = NULL;
1315 +                   break;
1316 +                 }
1317 +               buflen *= 2;
1318 +               pwtmpbuf = __alloca (buflen);
1319 +               __set_errno (save);
1320 +             }
1321 +#  else
1322 +           p = getpwnam (user_name);
1323 +#  endif
1324 +           if (p != NULL)
1325 +             home_dir = p->pw_dir;
1326 +           else
1327 +             home_dir = NULL;
1328 +         }
1329 +         /* If we found a home directory use this.  */
1330 +         if (home_dir != NULL)
1331 +           {
1332 +             char *newp;
1333 +             size_t home_len = strlen (home_dir);
1334 +             size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
1335 +             newp = (char *) __alloca (home_len + rest_len + 1);
1336 +#  ifdef HAVE_MEMPCPY
1337 +             *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
1338 +                                 end_name, rest_len)) = '\0';
1339 +#  else
1340 +             memcpy (newp, home_dir, home_len);
1341 +             memcpy (&newp[home_len], end_name, rest_len);
1342 +             newp[home_len + rest_len] = '\0';
1343 +#  endif
1344 +             dirname = newp;
1345 +           }
1346 +         else
1347 +           if (flags & GLOB_TILDE_CHECK)
1348 +             /* We have to regard it as an error if we cannot find the
1349 +                home directory.  */
1350 +             return GLOB_NOMATCH;
1351 +       }
1352 +# endif        /* Not Amiga && not WINDOWS32.  */
1353 +    }
1354 +#endif /* Not VMS.  */
1355 +
1356 +  /* Now test whether we looked for "~" or "~NAME".  In this case we
1357 +     can give the answer now.  */
1358 +  if (filename == NULL)
1359 +    {
1360 +      struct stat st;
1361 +#ifdef HAVE_STAT64
1362 +      struct stat64 st64;
1363 +#endif
1364 +
1365 +      /* Return the directory if we don't check for error or if it exists.  */
1366 +      if ((flags & GLOB_NOCHECK)
1367 +         || (((flags & GLOB_ALTDIRFUNC)
1368 +              ? ((*pglob->gl_stat) (dirname, &st) == 0
1369 +                 && S_ISDIR (st.st_mode))
1370 +              : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
1371 +       {
1372 +         int newcount = pglob->gl_pathc + pglob->gl_offs;
1373 +
1374 +         pglob->gl_pathv
1375 +           = (char **) realloc (pglob->gl_pathv,
1376 +                                (newcount + 1 + 1) * sizeof (char *));
1377 +         if (pglob->gl_pathv == NULL)
1378 +           return GLOB_NOSPACE;
1379 +
1380 +#if defined HAVE_STRDUP || defined _LIBC
1381 +          pglob->gl_pathv[newcount] = strdup (dirname);
1382 +#else
1383 +         {
1384 +           size_t len = strlen (dirname) + 1;
1385 +           char *dircopy = malloc (len);
1386 +           if (dircopy != NULL)
1387 +             pglob->gl_pathv[newcount] = memcpy (dircopy, dirname, len);
1388 +         }
1389 +#endif
1390 +         if (pglob->gl_pathv[newcount] == NULL)
1391 +           {
1392 +             free (pglob->gl_pathv);
1393 +             return GLOB_NOSPACE;
1394 +           }
1395 +         pglob->gl_pathv[++newcount] = NULL;
1396 +         ++pglob->gl_pathc;
1397 +         pglob->gl_flags = flags;
1398 +
1399 +         return 0;
1400 +       }
1401 +
1402 +      /* Not found.  */
1403 +      return GLOB_NOMATCH;
1404 +    }
1405 +
1406 +  if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
1407 +    {
1408 +      /* The directory name contains metacharacters, so we
1409 +        have to glob for the directory, and then glob for
1410 +        the pattern in each directory found.  */
1411 +      glob_t dirs;
1412 +      size_t i;
1413 +
1414 +      if ((flags & GLOB_ALTDIRFUNC) != 0)
1415 +       {
1416 +         /* Use the alternative access functions also in the recursive
1417 +            call.  */
1418 +         dirs.gl_opendir = pglob->gl_opendir;
1419 +         dirs.gl_readdir = pglob->gl_readdir;
1420 +         dirs.gl_closedir = pglob->gl_closedir;
1421 +         dirs.gl_stat = pglob->gl_stat;
1422 +         dirs.gl_lstat = pglob->gl_lstat;
1423 +       }
1424 +
1425 +      status = glob_limited (depth + 1U, dirname,
1426 +                    ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE
1427 +                               | GLOB_ALTDIRFUNC))
1428 +                     | GLOB_NOSORT | GLOB_ONLYDIR),
1429 +                    errfunc, &dirs);
1430 +      if (status != 0)
1431 +       return status;
1432 +
1433 +      /* We have successfully globbed the preceding directory name.
1434 +        For each name we found, call glob_in_dir on it and FILENAME,
1435 +        appending the results to PGLOB.  */
1436 +      for (i = 0; i < dirs.gl_pathc; ++i)
1437 +       {
1438 +         int old_pathc;
1439 +
1440 +#ifdef SHELL
1441 +         {
1442 +           /* Make globbing interruptible in the bash shell. */
1443 +           extern int interrupt_state;
1444 +
1445 +           if (interrupt_state)
1446 +             {
1447 +               globfree (&dirs);
1448 +               return GLOB_ABORTED;
1449 +             }
1450 +         }
1451 +#endif /* SHELL.  */
1452 +
1453 +         old_pathc = pglob->gl_pathc;
1454 +         status = glob_in_dir (filename, dirs.gl_pathv[i],
1455 +                               ((flags | GLOB_APPEND) & ~GLOB_NOCHECK),
1456 +                               errfunc, pglob);
1457 +         if (status == GLOB_NOMATCH)
1458 +           /* No matches in this directory.  Try the next.  */
1459 +           continue;
1460 +
1461 +         if (status != 0)
1462 +           {
1463 +             globfree (&dirs);
1464 +             globfree (pglob);
1465 +             return status;
1466 +           }
1467 +
1468 +         /* Stick the directory on the front of each name.  */
1469 +         if (prefix_array (dirs.gl_pathv[i],
1470 +                           &pglob->gl_pathv[old_pathc + pglob->gl_offs],
1471 +                           pglob->gl_pathc - old_pathc))
1472 +           {
1473 +             globfree (&dirs);
1474 +             globfree (pglob);
1475 +             return GLOB_NOSPACE;
1476 +           }
1477 +       }
1478 +
1479 +      flags |= GLOB_MAGCHAR;
1480 +
1481 +      /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1482 +        But if we have not found any matching entry and the GLOB_NOCHECK
1483 +        flag was set we must return the list consisting of the disrectory
1484 +        names followed by the filename.  */
1485 +      if (pglob->gl_pathc + pglob->gl_offs == oldcount)
1486 +       {
1487 +         /* No matches.  */
1488 +         if (flags & GLOB_NOCHECK)
1489 +           {
1490 +             size_t filename_len = strlen (filename) + 1;
1491 +             char **new_pathv;
1492 +             int newcount = pglob->gl_pathc + pglob->gl_offs;
1493 +             struct stat st;
1494 +#ifdef HAVE_STAT64
1495 +             struct stat64 st64;
1496 +#endif
1497 +
1498 +             /* This is an pessimistic guess about the size.  */
1499 +             pglob->gl_pathv
1500 +               = (char **) realloc (pglob->gl_pathv,
1501 +                                    (newcount + dirs.gl_pathc + 1)
1502 +                                    * sizeof (char *));
1503 +             if (pglob->gl_pathv == NULL)
1504 +               {
1505 +                 globfree (&dirs);
1506 +                 return GLOB_NOSPACE;
1507 +               }
1508 +
1509 +             for (i = 0; i < dirs.gl_pathc; ++i)
1510 +               {
1511 +                 const char *dir = dirs.gl_pathv[i];
1512 +                 size_t dir_len = strlen (dir);
1513 +
1514 +                 /* First check whether this really is a directory.  */
1515 +                 if (((flags & GLOB_ALTDIRFUNC)
1516 +                      ? ((*pglob->gl_stat) (dir, &st) != 0
1517 +                         || !S_ISDIR (st.st_mode))
1518 +                      : (__stat64 (dir, &st64) != 0
1519 +                         || !S_ISDIR (st64.st_mode))))
1520 +                   /* No directory, ignore this entry.  */
1521 +                   continue;
1522 +
1523 +                 pglob->gl_pathv[newcount] = malloc (dir_len + 1
1524 +                                                     + filename_len);
1525 +                 if (pglob->gl_pathv[newcount] == NULL)
1526 +                   {
1527 +                     globfree (&dirs);
1528 +                     globfree (pglob);
1529 +                     return GLOB_NOSPACE;
1530 +                   }
1531 +
1532 +#ifdef HAVE_MEMPCPY
1533 +                 mempcpy (mempcpy (mempcpy (pglob->gl_pathv[newcount],
1534 +                                            dir, dir_len),
1535 +                                   "/", 1),
1536 +                          filename, filename_len);
1537 +#else
1538 +                 memcpy (pglob->gl_pathv[newcount], dir, dir_len);
1539 +                 pglob->gl_pathv[newcount][dir_len] = '/';
1540 +                 memcpy (&pglob->gl_pathv[newcount][dir_len + 1],
1541 +                         filename, filename_len);
1542 +#endif
1543 +                 ++pglob->gl_pathc;
1544 +                 ++newcount;
1545 +               }
1546 +
1547 +             pglob->gl_pathv[newcount] = NULL;
1548 +             pglob->gl_flags = flags;
1549 +
1550 +             /* Now we know how large the gl_pathv vector must be.  */
1551 +             new_pathv = (char **) realloc (pglob->gl_pathv,
1552 +                                            ((newcount + 1)
1553 +                                             * sizeof (char *)));
1554 +             if (new_pathv != NULL)
1555 +               pglob->gl_pathv = new_pathv;
1556 +           }
1557 +         else
1558 +           {
1559 +             globfree (&dirs);
1560 +             return GLOB_NOMATCH;
1561 +           }
1562 +       }
1563 +
1564 +      globfree (&dirs);
1565 +    }
1566 +  else
1567 +    {
1568 +      int old_pathc = pglob->gl_pathc;
1569 +
1570 +      status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
1571 +      if (status != 0)
1572 +       return status;
1573 +
1574 +      if (dirlen > 0)
1575 +       {
1576 +         /* Stick the directory on the front of each name.  */
1577 +         if (prefix_array (dirname,
1578 +                           &pglob->gl_pathv[old_pathc + pglob->gl_offs],
1579 +                           pglob->gl_pathc - old_pathc))
1580 +           {
1581 +             globfree (pglob);
1582 +             return GLOB_NOSPACE;
1583 +           }
1584 +       }
1585 +    }
1586 +
1587 +  if (flags & GLOB_MARK)
1588 +    {
1589 +      /* Append slashes to directory names.  */
1590 +      size_t i;
1591 +      struct stat st;
1592 +#ifdef HAVE_STAT64
1593 +      struct stat64 st64;
1594 +#endif
1595 +
1596 +      for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
1597 +       if (((flags & GLOB_ALTDIRFUNC)
1598 +            ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
1599 +               && S_ISDIR (st.st_mode))
1600 +            : (__stat64 (pglob->gl_pathv[i], &st64) == 0
1601 +               && S_ISDIR (st64.st_mode))))
1602 +         {
1603 +           size_t len = strlen (pglob->gl_pathv[i]) + 2;
1604 +           char *new = realloc (pglob->gl_pathv[i], len);
1605 +           if (new == NULL)
1606 +             {
1607 +               globfree (pglob);
1608 +               return GLOB_NOSPACE;
1609 +             }
1610 +           strcpy (&new[len - 2], "/");
1611 +           pglob->gl_pathv[i] = new;
1612 +         }
1613 +    }
1614 +
1615 +  if (!(flags & GLOB_NOSORT))
1616 +    {
1617 +      /* Sort the vector.  */
1618 +      qsort ((__ptr_t) &pglob->gl_pathv[oldcount],
1619 +            pglob->gl_pathc + pglob->gl_offs - oldcount,
1620 +            sizeof (char *), collated_compare);
1621 +    }
1622 +
1623 +  return 0;
1624 +}
1625 +
1626 +int
1627 +glob (pattern, flags, errfunc, pglob)
1628 +
1629 +     const char *pattern;
1630 +     int flags;
1631 +     int (*errfunc) __P ((const char *, int));
1632 +     glob_t *pglob;
1633 +{
1634 +       nbresults = 0UL;
1635 +       return glob_limited(0U, pattern, flags, errfunc, pglob);
1636 +}
1637 +
1638 +#if !defined _LIBC || !defined GLOB_ONLY_P
1639 +
1640 +/* Free storage allocated in PGLOB by a previous `glob' call.  */
1641 +void
1642 +globfree (pglob)
1643 +     register glob_t *pglob;
1644 +{
1645 +  if (pglob->gl_pathv != NULL)
1646 +    {
1647 +      size_t i;
1648 +      for (i = 0; i < pglob->gl_pathc; ++i)
1649 +       if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
1650 +         free ((__ptr_t) pglob->gl_pathv[pglob->gl_offs + i]);
1651 +      free ((__ptr_t) pglob->gl_pathv);
1652 +    }
1653 +}
1654 +
1655 +
1656 +/* Do a collated comparison of A and B.  */
1657 +static int
1658 +collated_compare (a, b)
1659 +     const __ptr_t a;
1660 +     const __ptr_t b;
1661 +{
1662 +  const char *const s1 = *(const char *const * const) a;
1663 +  const char *const s2 = *(const char *const * const) b;
1664 +
1665 +  if (s1 == s2)
1666 +    return 0;
1667 +  if (s1 == NULL)
1668 +    return 1;
1669 +  if (s2 == NULL)
1670 +    return -1;
1671 +  return strcoll (s1, s2);
1672 +}
1673 +
1674 +
1675 +/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1676 +   elements in place.  Return nonzero if out of memory, zero if successful.
1677 +   A slash is inserted between DIRNAME and each elt of ARRAY,
1678 +   unless DIRNAME is just "/".  Each old element of ARRAY is freed.  */
1679 +static int
1680 +prefix_array (dirname, array, n)
1681 +     const char *dirname;
1682 +     char **array;
1683 +     size_t n;
1684 +{
1685 +  register size_t i;
1686 +  size_t dirlen = strlen (dirname);
1687 +#if defined __MSDOS__ || defined WINDOWS32
1688 +  int sep_char = '/';
1689 +# define DIRSEP_CHAR sep_char
1690 +#else
1691 +# define DIRSEP_CHAR '/'
1692 +#endif
1693 +
1694 +  if (dirlen == 1 && dirname[0] == '/')
1695 +    /* DIRNAME is just "/", so normal prepending would get us "//foo".
1696 +       We want "/foo" instead, so don't prepend any chars from DIRNAME.  */
1697 +    dirlen = 0;
1698 +#if defined __MSDOS__ || defined WINDOWS32
1699 +  else if (dirlen > 1)
1700 +    {
1701 +      if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
1702 +       /* DIRNAME is "d:/".  Don't prepend the slash from DIRNAME.  */
1703 +       --dirlen;
1704 +      else if (dirname[dirlen - 1] == ':')
1705 +       {
1706 +         /* DIRNAME is "d:".  Use `:' instead of `/'.  */
1707 +         --dirlen;
1708 +         sep_char = ':';
1709 +       }
1710 +    }
1711 +#endif
1712 +
1713 +  for (i = 0; i < n; ++i)
1714 +    {
1715 +      size_t eltlen = strlen (array[i]) + 1;
1716 +      char *new = (char *) malloc (dirlen + 1 + eltlen);
1717 +      if (new == NULL)
1718 +       {
1719 +         while (i > 0)
1720 +           free ((__ptr_t) array[--i]);
1721 +         return 1;
1722 +       }
1723 +
1724 +#ifdef HAVE_MEMPCPY
1725 +      {
1726 +       char *endp = (char *) mempcpy (new, dirname, dirlen);
1727 +       *endp++ = DIRSEP_CHAR;
1728 +       mempcpy (endp, array[i], eltlen);
1729 +      }
1730 +#else
1731 +      memcpy (new, dirname, dirlen);
1732 +      new[dirlen] = DIRSEP_CHAR;
1733 +      memcpy (&new[dirlen + 1], array[i], eltlen);
1734 +#endif
1735 +      free ((__ptr_t) array[i]);
1736 +      array[i] = new;
1737 +    }
1738 +
1739 +  return 0;
1740 +}
1741 +
1742 +
1743 +/* We must not compile this function twice.  */
1744 +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1745 +/* Return nonzero if PATTERN contains any metacharacters.
1746 +   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
1747 +int
1748 +__glob_pattern_p (pattern, quote)
1749 +     const char *pattern;
1750 +     int quote;
1751 +{
1752 +  register const char *p;
1753 +  int open = 0;
1754 +
1755 +  for (p = pattern; *p != '\0'; ++p)
1756 +    switch (*p)
1757 +      {
1758 +      case '?':
1759 +      case '*':
1760 +       return 1;
1761 +
1762 +      case '\\':
1763 +       if (quote && p[1] != '\0')
1764 +         ++p;
1765 +       break;
1766 +
1767 +      case '[':
1768 +       open = 1;
1769 +       break;
1770 +
1771 +      case ']':
1772 +       if (open)
1773 +         return 1;
1774 +       break;
1775 +      }
1776 +
1777 +  return 0;
1778 +}
1779 +# ifdef _LIBC
1780 +weak_alias (__glob_pattern_p, glob_pattern_p)
1781 +# endif
1782 +#endif
1783 +
1784 +#endif /* !GLOB_ONLY_P */
1785 +
1786 +
1787 +/* Like `glob', but PATTERN is a final pathname component,
1788 +   and matches are searched for in DIRECTORY.
1789 +   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever done.
1790 +   The GLOB_APPEND flag is assumed to be set (always appends).  */
1791 +static int
1792 +glob_in_dir (pattern, directory, flags, errfunc, pglob)
1793 +     const char *pattern;
1794 +     const char *directory;
1795 +     int flags;
1796 +     int (*errfunc) __P ((const char *, int));
1797 +     glob_t *pglob;
1798 +{
1799 +  __ptr_t stream = NULL;
1800 +  struct globlink
1801 +    {
1802 +      struct globlink *next;
1803 +      char *name;
1804 +    };
1805 +  struct globlink *names = NULL;
1806 +  size_t nfound;
1807 +  int meta;
1808 +  int save;
1809 +
1810 +  meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
1811 +  if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
1812 +    {
1813 +      /* We need not do any tests.  The PATTERN contains no meta
1814 +        characters and we must not return an error therefore the
1815 +        result will always contain exactly one name.  */
1816 +      flags |= GLOB_NOCHECK;
1817 +      nfound = 0;
1818 +    }
1819 +  else if (meta == 0 &&
1820 +          ((flags & GLOB_NOESCAPE) || strchr(pattern, '\\') == NULL))
1821 +    {
1822 +      /* Since we use the normal file functions we can also use stat()
1823 +        to verify the file is there.  */
1824 +      struct stat st;
1825 +# ifdef HAVE_STAT64
1826 +      struct stat64 st64;
1827 +# endif
1828 +      size_t patlen = strlen (pattern);
1829 +      size_t dirlen = strlen (directory);
1830 +      char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
1831 +
1832 +# ifdef HAVE_MEMPCPY
1833 +      mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1834 +                       "/", 1),
1835 +              pattern, patlen + 1);
1836 +# else
1837 +      memcpy (fullname, directory, dirlen);
1838 +      fullname[dirlen] = '/';
1839 +      memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
1840 +# endif
1841 +      if (((flags & GLOB_ALTDIRFUNC)
1842 +          ? (*pglob->gl_stat) (fullname, &st)
1843 +          : __stat64 (fullname, &st64)) == 0)
1844 +       /* We found this file to be existing.  Now tell the rest
1845 +          of the function to copy this name into the result.  */
1846 +       flags |= GLOB_NOCHECK;
1847 +
1848 +      nfound = 0;
1849 +    }
1850 +  else
1851 +    {
1852 +      if (pattern[0] == '\0')
1853 +       {
1854 +         /* This is a special case for matching directories like in
1855 +            "*a/".  */
1856 +         names = (struct globlink *) __alloca (sizeof (struct globlink));
1857 +         names->name = (char *) malloc (1);
1858 +         if (names->name == NULL)
1859 +           goto memory_error;
1860 +         names->name[0] = '\0';
1861 +         names->next = NULL;
1862 +         nfound = 1;
1863 +         meta = 0;
1864 +       }
1865 +      else
1866 +       {
1867 +         stream = ((flags & GLOB_ALTDIRFUNC)
1868 +                   ? (*pglob->gl_opendir) (directory)
1869 +                   : (__ptr_t) opendir (directory));
1870 +         if (stream == NULL)
1871 +           {
1872 +             if (errno != ENOTDIR
1873 +                 && ((errfunc != NULL && (*errfunc) (directory, errno))
1874 +                     || (flags & GLOB_ERR)))
1875 +               return GLOB_ABORTED;
1876 +             nfound = 0;
1877 +             meta = 0;
1878 +           }
1879 +         else
1880 +           {
1881 +             int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
1882 +                              | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
1883 +#if defined _AMIGA || defined VMS
1884 +                                  | FNM_CASEFOLD
1885 +#endif
1886 +                                  );
1887 +             nfound = 0;
1888 +             flags |= GLOB_MAGCHAR;
1889 +
1890 +             while (1)
1891 +               {
1892 +                 const char *name;
1893 +                 size_t len;
1894 +#if defined HAVE_DIRENT64 && !defined COMPILE_GLOB64
1895 +                 struct dirent64 *d;
1896 +                 struct dirent64 d64;
1897 +
1898 +                 if (flags & GLOB_ALTDIRFUNC)
1899 +                   {
1900 +                     struct dirent *d32 = (*pglob->gl_readdir) (stream);
1901 +                     if (d32 != NULL)
1902 +                       {
1903 +                         CONVERT_DIRENT_DIRENT64 (&d64, d32);
1904 +                         d = &d64;
1905 +                       }
1906 +                     else
1907 +                       d = NULL;
1908 +                   }
1909 +                 else
1910 +                   d = __readdir64 ((DIR *) stream);
1911 +#else
1912 +                 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
1913 +                                     ? ((struct dirent *)
1914 +                                        (*pglob->gl_readdir) (stream))
1915 +                                     : __readdir ((DIR *) stream));
1916 +#endif
1917 +                 if (d == NULL)
1918 +                   break;
1919 +                 if (nbresults > MAX_RESULTS) {        
1920 +                         break;
1921 +                 }
1922 +                 nbresults++;  
1923 +                 if (! REAL_DIR_ENTRY (d))
1924 +                   continue;
1925 +
1926 +#ifdef HAVE_D_TYPE
1927 +                 /* If we shall match only directories use the information
1928 +                    provided by the dirent call if possible.  */
1929 +                 if ((flags & GLOB_ONLYDIR)
1930 +                     && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
1931 +                   continue;
1932 +#endif
1933 +
1934 +                 name = d->d_name;
1935 +                       
1936 +                 if (fnmatch (pattern, name, fnm_flags) == 0)
1937 +                   {
1938 +                     struct globlink *new = (struct globlink *)
1939 +                       __alloca (sizeof (struct globlink));
1940 +                     len = NAMLEN (d);                 
1941 +                     new->name = (char *) malloc (len + 1);
1942 +                     if (new->name == NULL)
1943 +                       goto memory_error;
1944 +#ifdef HAVE_MEMPCPY
1945 +                     *((char *) mempcpy ((__ptr_t) new->name, name, len))
1946 +                       = '\0';
1947 +#else
1948 +                     memcpy ((__ptr_t) new->name, name, len);
1949 +                     new->name[len] = '\0';
1950 +#endif
1951 +                     new->next = names;
1952 +                     names = new;
1953 +                     ++nfound;
1954 +                   }
1955 +               }
1956 +           }
1957 +       }
1958 +    }
1959 +
1960 +  if (nfound == 0 && (flags & GLOB_NOCHECK))
1961 +    {
1962 +      size_t len = strlen (pattern);
1963 +      nfound = 1;
1964 +      names = (struct globlink *) __alloca (sizeof (struct globlink));
1965 +      names->next = NULL;
1966 +      names->name = (char *) malloc (len + 1);
1967 +      if (names->name == NULL)
1968 +       goto memory_error;
1969 +#ifdef HAVE_MEMPCPY
1970 +      *((char *) mempcpy (names->name, pattern, len)) = '\0';
1971 +#else
1972 +      memcpy (names->name, pattern, len);
1973 +      names->name[len] = '\0';
1974 +#endif
1975 +    }
1976 +
1977 +  if (nfound != 0)
1978 +    {
1979 +      pglob->gl_pathv
1980 +       = (char **) realloc (pglob->gl_pathv,
1981 +                            (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
1982 +                            * sizeof (char *));
1983 +      if (pglob->gl_pathv == NULL)
1984 +       goto memory_error;
1985 +
1986 +      for (; names != NULL; names = names->next)
1987 +       pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc++] = names->name;
1988 +      pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
1989 +
1990 +      pglob->gl_flags = flags;
1991 +    }
1992 +
1993 +  save = errno;
1994 +  if (stream != NULL)
1995 +    {
1996 +      if (flags & GLOB_ALTDIRFUNC)
1997 +       (*pglob->gl_closedir) (stream);
1998 +      else
1999 +       closedir ((DIR *) stream);
2000 +    }
2001 +  __set_errno (save);
2002 +
2003 +  return nfound == 0 ? GLOB_NOMATCH : 0;
2004 +
2005 + memory_error:
2006 +  {
2007 +    int save = errno;
2008 +    if (flags & GLOB_ALTDIRFUNC)
2009 +      (*pglob->gl_closedir) (stream);
2010 +    else
2011 +      closedir ((DIR *) stream);
2012 +    __set_errno (save);
2013 +  }
2014 +  while (names != NULL)
2015 +    {
2016 +      if (names->name != NULL)
2017 +       free ((__ptr_t) names->name);
2018 +      names = names->next;
2019 +    }
2020 +  return GLOB_NOSPACE;
2021 +}
2022 +
2023 +#endif /* Not ELIDE_CODE.  */
2024 diff -urN proftpd-1.2.1/lib/glob.c proftpd-1.2/lib/glob.c
2025 --- proftpd-1.2.1/lib/glob.c    Wed Jul 26 10:16:33 2000
2026 +++ proftpd-1.2/lib/glob.c      Thu Jan  1 01:00:00 1970
2027 @@ -1,1108 +0,0 @@
2028 -/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
2029 -
2030 -   This library is free software; you can redistribute it and/or
2031 -   modify it under the terms of the GNU Library General Public License as
2032 -   published by the Free Software Foundation; either version 2 of the
2033 -   License, or (at your option) any later version.
2034 -
2035 -   This library is distributed in the hope that it will be useful,
2036 -   but WITHOUT ANY WARRANTY; without even the implied warranty of
2037 -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2038 -   Library General Public License for more details.
2039 -
2040 -   You should have received a copy of the GNU Library General Public
2041 -   License along with this library; see the file COPYING.LIB.  If not,
2042 -   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
2043 -   Boston, MA 02111-1307, USA.  */
2044 -
2045 -/* AIX requires this to be the first thing in the file.  */
2046 -#if defined _AIX && !defined __GNUC__
2047 - #pragma alloca
2048 -#endif
2049 -
2050 -/* Enable GNU extensions in glob.h.  */
2051 -#ifndef _GNU_SOURCE
2052 -# define _GNU_SOURCE   1
2053 -#endif
2054 -
2055 -/* Required to tell conf.h not to include the standard ProFTPD
2056 - * header files
2057 - */
2058 -
2059 -#define __PROFTPD_SUPPORT_LIBRARY
2060 -
2061 -#include <conf.h>
2062 -
2063 -#include <errno.h>
2064 -#include <sys/types.h>
2065 -#include <sys/stat.h>
2066 -
2067 -#include <assert.h>
2068 -#include <stdio.h>     /* Needed on stupid SunOS for assert. */
2069 -
2070 -#include <libsupp.h>
2071 -
2072 -#undef _LIBC
2073 -#undef __GNU_LIBRARY__
2074 -
2075 -#ifndef HAVE_GLOB
2076 -
2077 -/* Comment out all this code if we are using the GNU C Library, and are not
2078 -   actually compiling the library itself.  This code is part of the GNU C
2079 -   Library, but also included in many other GNU distributions.  Compiling
2080 -   and linking in this code is a waste when using the GNU C library
2081 -   (especially if it is a shared library).  Rather than having every GNU
2082 -   program understand `configure --with-gnu-libc' and omit the object files,
2083 -   it is simpler to just do this in the source for each such file.  */
2084 -
2085 -#if defined(STDC_HEADERS) || defined(__GNU_LIBRARY__)
2086 -# include <stddef.h>
2087 -#endif
2088 -
2089 -#if defined(HAVE_UNISTD_H) || defined(_LIBC)
2090 -# include <unistd.h>
2091 -# ifndef POSIX
2092 -#  ifdef _POSIX_VERSION
2093 -#   define POSIX
2094 -#  endif
2095 -# endif
2096 -#endif
2097 -
2098 -#if !defined(_AMIGA) && !defined(VMS) && !defined(WINDOWS32)
2099 -# include <pwd.h>
2100 -#endif
2101 -
2102 -#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
2103 -extern int errno;
2104 -#endif
2105 -#ifndef __set_errno
2106 -# define __set_errno(val) errno = (val)
2107 -#endif
2108 -
2109 -#ifndef NULL
2110 -# define NULL  0
2111 -#endif
2112 -
2113 -#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
2114 -# include <dirent.h>
2115 -# define NAMLEN(dirent) strlen((dirent)->d_name)
2116 -#else 
2117 -# define dirent direct
2118 -# define NAMLEN(dirent) (dirent)->d_namlen
2119 -# ifdef HAVE_SYS_NDIR_H
2120 -#  include <sys/ndir.h>
2121 -# endif
2122 -# ifdef HAVE_SYS_DIR_H
2123 -#  include <sys/dir.h>
2124 -# endif
2125 -# ifdef HAVE_NDIR_H
2126 -#  include <ndir.h>
2127 -# endif
2128 -# ifdef HAVE_VMSDIR_H
2129 -#  include "vmsdir.h"  
2130 -# endif /* HAVE_VMSDIR_H */
2131 -#endif
2132 -
2133 -/* In GNU systems, <dirent.h> defines this macro for us.  */
2134 -#ifdef _D_NAMLEN   
2135 -# undef NAMLEN
2136 -# define NAMLEN(d) _D_NAMLEN(d)
2137 -#endif
2138 -
2139 -#ifdef _DIRENT_HAVE_D_TYPE
2140 -# define HAVE_D_TYPE   1
2141 -#endif
2142 -
2143 -#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
2144 -/* Posix does not require that the d_ino field be present, and some
2145 -   systems do not provide it. */
2146 -# define REAL_DIR_ENTRY(dp) 1
2147 -#else
2148 -# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
2149 -#endif /* POSIX */
2150 -
2151 -#if defined STDC_HEADERS || defined __GNU_LIBRARY__
2152 -# include <stdlib.h>
2153 -# include <string.h>
2154 -# define        ANSI_STRING
2155 -#else   /* No standard headers.  */
2156 -
2157 -extern char *getenv ();
2158 -
2159 -# ifdef HAVE_STRING_H
2160 -#  include <string.h>
2161 -#  define ANSI_STRING
2162 -# else
2163 -#  include <strings.h>
2164 -# endif
2165 -# ifdef HAVE_MEMORY_H
2166 -#  include <memory.h>
2167 -# endif
2168 -
2169 -#ifndef __osf__
2170 -extern char *malloc (), *realloc ();
2171 -extern void free (); 
2172 -
2173 -extern void qsort ();
2174 -extern void abort (), exit ();
2175 -#endif /* __osf__ */
2176 -
2177 -#endif  /* Standard headers.  */
2178 -
2179 -#ifndef ANSI_STRING
2180 -
2181 -# ifndef bzero
2182 -extern void bzero ();
2183 -# endif
2184 -# ifndef bcopy
2185 -extern void bcopy ();
2186 -# endif
2187 -
2188 -# undef memcpy
2189 -# define memcpy(d, s, n)        bcopy ((s), (d), (n))
2190 -# undef strrchr
2191 -# define strrchr        rindex
2192 -/* memset is only used for zero here, but let's be paranoid.  */
2193 -# undef memset
2194 -# define memset(s, better_be_zero, n) \
2195 -  ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
2196 -#endif  /* Not ANSI_STRING.  */
2197 -
2198 -#if !defined HAVE_STRCOLL && !defined _LIBC
2199 -# define strcoll        strcmp
2200 -#endif
2201 -
2202 -#if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
2203 -# define HAVE_MEMPCPY   1
2204 -# define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
2205 -#endif
2206 -
2207 -#ifndef        __GNU_LIBRARY__
2208 -# ifdef        __GNUC__
2209 -__inline
2210 -# endif
2211 -# ifndef __SASC
2212 -#  ifdef WINDOWS32
2213 -static void *
2214 -#  else
2215 -static char *
2216 -# endif
2217 -my_realloc (p, n)
2218 -     char *p;
2219 -     unsigned int n;
2220 -{
2221 -  /* These casts are the for sake of the broken Ultrix compiler,
2222 -     which warns of illegal pointer combinations otherwise.  */
2223 -  if (p == NULL)
2224 -    return (char *) malloc (n);
2225 -  return (char *) realloc (p, n);
2226 -}
2227 -# define       realloc my_realloc
2228 -# endif /* __SASC */
2229 -#endif /* __GNU_LIBRARY__ */
2230 -
2231 -
2232 -#if !defined __alloca && !defined __GNU_LIBRARY__
2233 -
2234 -# ifdef        __GNUC__
2235 -#  undef alloca
2236 -#  define alloca(n)    __builtin_alloca (n)
2237 -# else /* Not GCC.  */
2238 -#  ifdef HAVE_ALLOCA_H
2239 -#   include <alloca.h>
2240 -#  else        /* Not HAVE_ALLOCA_H.  */
2241 -#   ifndef _AIX
2242 -#    ifdef WINDOWS32
2243 -#     include <malloc.h>
2244 -#    else
2245 -extern char *alloca ();
2246 -#    endif /* WINDOWS32 */
2247 -#   endif /* Not _AIX.  */
2248 -#  endif /* sparc or HAVE_ALLOCA_H.  */
2249 -# endif        /* GCC.  */
2250 -
2251 -# define __alloca      alloca
2252 -
2253 -#endif
2254 -
2255 -#ifndef __GNU_LIBRARY__
2256 -# define __stat stat
2257 -# ifdef STAT_MACROS_BROKEN
2258 -#  undef S_ISDIR
2259 -# endif
2260 -# ifndef S_ISDIR
2261 -#  define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
2262 -# endif
2263 -#endif
2264 -
2265 -#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
2266 -# undef        size_t
2267 -# define size_t        unsigned int
2268 -#endif
2269 -
2270 -/* Some system header files erroneously define these.
2271 -   We want our own definitions from <glob.h> to take precedence.  */
2272 -#undef GLOB_ERR
2273 -#undef GLOB_MARK
2274 -#undef GLOB_NOSORT
2275 -#undef GLOB_DOOFFS
2276 -#undef GLOB_NOCHECK
2277 -#undef GLOB_APPEND
2278 -#undef GLOB_NOESCAPE
2279 -#undef GLOB_PERIOD
2280 -#include "glob.h"
2281 -
2282 -static
2283 -#if __GNUC__ - 0 >= 2
2284 -inline
2285 -#endif
2286 -const char *next_brace_sub __P ((const char *begin));
2287 -static int glob_in_dir __P ((const char *pattern, const char *directory,
2288 -                            int flags,
2289 -                            int (*errfunc) __P ((const char *, int)),
2290 -                            glob_t *pglob));
2291 -static int prefix_array __P ((const char *prefix, char **array, size_t n));
2292 -static int collated_compare __P ((const __ptr_t, const __ptr_t));
2293 -
2294 -
2295 -/* Find the end of the sub-pattern in a brace expression.  We define
2296 -   this as an inline function if the compiler permits.  */
2297 -static
2298 -#if __GNUC__ - 0 >= 2
2299 -inline
2300 -#endif
2301 -const char *
2302 -next_brace_sub (begin)
2303 -     const char *begin;
2304 -{
2305 -  unsigned int depth = 0;
2306 -  const char *cp = begin;
2307 -
2308 -  while (1)
2309 -    {
2310 -      if (depth == 0)
2311 -       {
2312 -         if (*cp != ',' && *cp != '}' && *cp != '\0')
2313 -           {
2314 -             if (*cp == '{')
2315 -               ++depth;
2316 -             ++cp;
2317 -             continue;
2318 -           }
2319 -       }
2320 -      else
2321 -       {
2322 -         while (*cp != '\0' && (*cp != '}' || depth > 0))
2323 -           {
2324 -             if (*cp == '}')
2325 -               --depth;
2326 -             ++cp;
2327 -           }
2328 -         if (*cp == '\0')
2329 -           /* An incorrectly terminated brace expression.  */
2330 -           return NULL;
2331 -
2332 -         continue;
2333 -       }
2334 -      break;
2335 -    }
2336 -
2337 -  return cp;
2338 -}
2339 -
2340 -/* Do glob searching for PATTERN, placing results in PGLOB.
2341 -   The bits defined above may be set in FLAGS.
2342 -   If a directory cannot be opened or read and ERRFUNC is not nil,
2343 -   it is called with the pathname that caused the error, and the
2344 -   `errno' value from the failing call; if it returns non-zero
2345 -   `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
2346 -   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
2347 -   Otherwise, `glob' returns zero.  */
2348 -int
2349 -glob (pattern, flags, errfunc, pglob)
2350 -     const char *pattern;
2351 -     int flags;
2352 -     int (*errfunc) __P ((const char *, int));
2353 -     glob_t *pglob;
2354 -{
2355 -  const char *filename;
2356 -  char *dirname;
2357 -  size_t dirlen;
2358 -  int status;
2359 -  int oldcount;
2360 -
2361 -  if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
2362 -    {
2363 -      __set_errno (EINVAL);
2364 -      return -1;
2365 -    }
2366 -
2367 -  if (flags & GLOB_BRACE)
2368 -    {
2369 -      const char *begin = strchr (pattern, '{');
2370 -      if (begin != NULL)
2371 -       {
2372 -         /* Allocate working buffer large enough for our work.  Note that
2373 -           we have at least an opening and closing brace.  */
2374 -         int firstc;
2375 -         char *alt_start;
2376 -         const char *p;
2377 -         const char *next;
2378 -         const char *rest;
2379 -         size_t rest_len;
2380 -#ifdef __GNUC__
2381 -         char onealt[strlen (pattern) - 1];
2382 -#else
2383 -         char *onealt = (char *) malloc (strlen (pattern) - 1);
2384 -         if (onealt == NULL)
2385 -           {
2386 -             if (!(flags & GLOB_APPEND))
2387 -               globfree (pglob);
2388 -             return GLOB_NOSPACE;
2389 -           }
2390 -#endif
2391 -
2392 -         /* We know the prefix for all sub-patterns.  */
2393 -#ifdef HAVE_MEMPCPY
2394 -         alt_start = mempcpy (onealt, pattern, begin - pattern);
2395 -#else
2396 -         memcpy (onealt, pattern, begin - pattern);
2397 -         alt_start = &onealt[begin - pattern];
2398 -#endif
2399 -
2400 -         /* Find the first sub-pattern and at the same time find the
2401 -            rest after the closing brace.  */
2402 -         next = next_brace_sub (begin + 1);
2403 -         if (next == NULL)
2404 -           {
2405 -             /* It is an illegal expression.  */
2406 -#ifndef __GNUC__
2407 -             free (onealt);
2408 -#endif
2409 -             return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
2410 -           }
2411 -
2412 -         /* Now find the end of the whole brace expression.  */
2413 -         rest = next;
2414 -         while (*rest != '}')
2415 -           {
2416 -             rest = next_brace_sub (rest + 1);
2417 -             if (rest == NULL)
2418 -               {
2419 -                 /* It is an illegal expression.  */
2420 -#ifndef __GNUC__
2421 -                 free (onealt);
2422 -#endif
2423 -                 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
2424 -               }
2425 -           }
2426 -         /* Please note that we now can be sure the brace expression
2427 -            is well-formed.  */
2428 -         rest_len = strlen (++rest) + 1;
2429 -
2430 -         /* We have a brace expression.  BEGIN points to the opening {,
2431 -            NEXT points past the terminator of the first element, and END
2432 -            points past the final }.  We will accumulate result names from
2433 -            recursive runs for each brace alternative in the buffer using
2434 -            GLOB_APPEND.  */
2435 -
2436 -         if (!(flags & GLOB_APPEND))
2437 -           {
2438 -             /* This call is to set a new vector, so clear out the
2439 -                vector so we can append to it.  */
2440 -             pglob->gl_pathc = 0;
2441 -             pglob->gl_pathv = NULL;
2442 -           }
2443 -         firstc = pglob->gl_pathc;
2444 -
2445 -         p = begin + 1;
2446 -         while (1)
2447 -           {
2448 -             int result;
2449 -
2450 -             /* Construct the new glob expression.  */
2451 -#ifdef HAVE_MEMPCPY
2452 -             mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
2453 -#else
2454 -             memcpy (alt_start, p, next - p);
2455 -             memcpy (&alt_start[next - p], rest, rest_len);
2456 -#endif
2457 -
2458 -             result = glob (onealt,
2459 -                            ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
2460 -                             | GLOB_APPEND), errfunc, pglob);
2461 -
2462 -             /* If we got an error, return it.  */
2463 -             if (result && result != GLOB_NOMATCH)
2464 -               {
2465 -#ifndef __GNUC__
2466 -                 free (onealt);
2467 -#endif
2468 -                 if (!(flags & GLOB_APPEND))
2469 -                   globfree (pglob);
2470 -                 return result;
2471 -               }
2472 -
2473 -             if (*next == '}')
2474 -               /* We saw the last entry.  */
2475 -               break;
2476 -
2477 -             p = next + 1;
2478 -             next = next_brace_sub (p);
2479 -             assert (next != NULL);
2480 -           }
2481 -
2482 -#ifndef __GNUC__
2483 -         free (onealt);
2484 -#endif
2485 -
2486 -         if (pglob->gl_pathc != firstc)
2487 -           /* We found some entries.  */
2488 -           return 0;
2489 -         else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
2490 -           return GLOB_NOMATCH;
2491 -       }
2492 -    }
2493 -
2494 -  /* Find the filename.  */
2495 -  filename = strrchr (pattern, '/');
2496 -  if (filename == NULL)
2497 -    {
2498 -      filename = pattern;
2499 -#ifdef _AMIGA
2500 -      dirname = (char *) "";
2501 -#else
2502 -      dirname = (char *) ".";
2503 -#endif
2504 -      dirlen = 0;
2505 -    }
2506 -  else if (filename == pattern)
2507 -    {
2508 -      /* "/pattern".  */
2509 -      dirname = (char *) "/";
2510 -      dirlen = 1;
2511 -      ++filename;
2512 -    }
2513 -  else
2514 -    {
2515 -      dirlen = filename - pattern;
2516 -      dirname = (char *) __alloca (dirlen + 1);
2517 -#ifdef HAVE_MEMPCPY
2518 -      *((char *) mempcpy (dirname, pattern, dirlen)) = '\0';
2519 -#else
2520 -      memcpy (dirname, pattern, dirlen);
2521 -      dirname[dirlen] = '\0';
2522 -#endif
2523 -      ++filename;
2524 -    }
2525 -
2526 -  if (filename[0] == '\0' && dirlen > 1)
2527 -    /* "pattern/".  Expand "pattern", appending slashes.  */
2528 -    {
2529 -      int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
2530 -      if (val == 0)
2531 -       pglob->gl_flags = (pglob->gl_flags & ~GLOB_MARK) | (flags & GLOB_MARK);
2532 -      return val;
2533 -    }
2534 -
2535 -  if (!(flags & GLOB_APPEND))
2536 -    {
2537 -      pglob->gl_pathc = 0;
2538 -      pglob->gl_pathv = NULL;
2539 -    }
2540 -
2541 -  oldcount = pglob->gl_pathc;
2542 -
2543 -#ifndef VMS
2544 -  if ((flags & GLOB_TILDE) && dirname[0] == '~')
2545 -    {
2546 -      if (dirname[1] == '\0' || dirname[1] == '/')
2547 -       {
2548 -         /* Look up home directory.  */
2549 -         char *home_dir = getenv ("HOME");
2550 -# ifdef _AMIGA
2551 -         if (home_dir == NULL || home_dir[0] == '\0')
2552 -           home_dir = "SYS:";
2553 -# else
2554 -#  ifdef WINDOWS32
2555 -         if (home_dir == NULL || home_dir[0] == '\0')
2556 -            home_dir = "c:/users/default"; /* poor default */
2557 -#  else
2558 -         if (home_dir == NULL || home_dir[0] == '\0')
2559 -           {
2560 -             int success;
2561 -#   if defined HAVE_GETLOGIN_R || defined _LIBC
2562 -             extern int getlogin_r __P ((char *, size_t));
2563 -             size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
2564 -             char *name;
2565 -
2566 -             if (buflen == 0)
2567 -               /* `sysconf' does not support _SC_LOGIN_NAME_MAX.  Try
2568 -                  a moderate value.  */
2569 -               buflen = 16;
2570 -             name = (char *) __alloca (buflen);
2571 -
2572 -             success = getlogin_r (name, buflen) >= 0;
2573 -#   else
2574 -             extern char *getlogin __P ((void));
2575 -             char *name;
2576 -
2577 -             success = (name = getlogin ()) != NULL;
2578 -#   endif
2579 -             if (success)
2580 -               {
2581 -#   if defined HAVE_GETPWNAM_R || defined _LIBC
2582 -                 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
2583 -                 char *pwtmpbuf;
2584 -                 struct passwd pwbuf, *p;
2585 -
2586 -                 pwtmpbuf = (char *) __alloca (pwbuflen);
2587 -
2588 -                 success = (__getpwnam_r (name, &pwbuf, pwtmpbuf,
2589 -                                          pwbuflen, &p) >= 0);
2590 -#   else
2591 -                 struct passwd *p = getpwnam (name);
2592 -                 success = p != NULL;
2593 -#   endif
2594 -                 if (success)
2595 -                   home_dir = p->pw_dir;
2596 -               }
2597 -           }
2598 -         if (home_dir == NULL || home_dir[0] == '\0')
2599 -           home_dir = (char *) "~"; /* No luck.  */
2600 -#  endif /* WINDOWS32 */
2601 -# endif
2602 -         /* Now construct the full directory.  */
2603 -         if (dirname[1] == '\0')
2604 -           dirname = home_dir;
2605 -         else
2606 -           {
2607 -             char *newp;
2608 -             size_t home_len = strlen (home_dir);
2609 -             newp = (char *) __alloca (home_len + dirlen);
2610 -# ifdef HAVE_MEMPCPY
2611 -             mempcpy (mempcpy (newp, home_dir, home_len),
2612 -                      &dirname[1], dirlen);
2613 -# else
2614 -             memcpy (newp, home_dir, home_len);
2615 -             memcpy (&newp[home_len], &dirname[1], dirlen);
2616 -# endif
2617 -             dirname = newp;
2618 -           }
2619 -       }
2620 -# if !defined _AMIGA && !defined WINDOWS32
2621 -      else
2622 -       {
2623 -         char *end_name = strchr (dirname, '/');
2624 -         char *user_name;
2625 -         char *home_dir;
2626 -
2627 -         if (end_name == NULL)
2628 -           user_name = dirname + 1;
2629 -         else
2630 -           {
2631 -             user_name = (char *) __alloca (end_name - dirname);
2632 -# ifdef HAVE_MEMPCPY
2633 -             *((char *) mempcpy (user_name, dirname + 1, end_name - dirname))
2634 -               = '\0';
2635 -# else
2636 -             memcpy (user_name, dirname + 1, end_name - dirname);
2637 -             user_name[end_name - dirname - 1] = '\0';
2638 -# endif
2639 -           }
2640 -
2641 -         /* Look up specific user's home directory.  */
2642 -         {
2643 -#  if defined HAVE_GETPWNAM_R || defined _LIBC
2644 -           size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
2645 -           char *pwtmpbuf = (char *) __alloca (buflen);
2646 -           struct passwd pwbuf, *p;
2647 -           if (__getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0)
2648 -             home_dir = p->pw_dir;
2649 -           else
2650 -             home_dir = NULL;
2651 -#  else
2652 -           struct passwd *p = getpwnam (user_name);
2653 -           if (p != NULL)
2654 -             home_dir = p->pw_dir;
2655 -           else
2656 -             home_dir = NULL;
2657 -#  endif
2658 -         }
2659 -         /* If we found a home directory use this.  */
2660 -         if (home_dir != NULL)
2661 -           {
2662 -             char *newp;
2663 -             size_t home_len = strlen (home_dir);
2664 -             size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
2665 -             newp = (char *) __alloca (home_len + rest_len + 1);
2666 -#  ifdef HAVE_MEMPCPY
2667 -             *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
2668 -                                 end_name, rest_len)) = '\0';
2669 -#  else
2670 -             memcpy (newp, home_dir, home_len);
2671 -             memcpy (&newp[home_len], end_name, rest_len);
2672 -             newp[home_len + rest_len] = '\0';
2673 -#  endif
2674 -             dirname = newp;
2675 -           }
2676 -       }
2677 -# endif        /* Not Amiga && not WINDOWS32.  */
2678 -    }
2679 -#endif /* Not VMS.  */
2680 -
2681 -  if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
2682 -    {
2683 -      /* The directory name contains metacharacters, so we
2684 -        have to glob for the directory, and then glob for
2685 -        the pattern in each directory found.  */
2686 -      glob_t dirs;
2687 -      register int i;
2688 -
2689 -      status = glob (dirname,
2690 -                    ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE))
2691 -                     | GLOB_NOSORT | GLOB_ONLYDIR),
2692 -                    errfunc, &dirs);
2693 -      if (status != 0)
2694 -       return status;
2695 -
2696 -      /* We have successfully globbed the preceding directory name.
2697 -        For each name we found, call glob_in_dir on it and FILENAME,
2698 -        appending the results to PGLOB.  */
2699 -      for (i = 0; i < dirs.gl_pathc; ++i)
2700 -       {
2701 -         int oldcount;
2702 -
2703 -#ifdef SHELL
2704 -         {
2705 -           /* Make globbing interruptible in the bash shell. */
2706 -           extern int interrupt_state;
2707 -
2708 -           if (interrupt_state)
2709 -             {
2710 -               globfree (&dirs);
2711 -               globfree (&files);
2712 -               return GLOB_ABORTED;
2713 -             }
2714 -         }
2715 -#endif /* SHELL.  */
2716 -
2717 -         oldcount = pglob->gl_pathc;
2718 -         status = glob_in_dir (filename, dirs.gl_pathv[i],
2719 -                               ((flags | GLOB_APPEND)
2720 -                                & ~(GLOB_NOCHECK | GLOB_ERR)),
2721 -                               errfunc, pglob);
2722 -         if (status == GLOB_NOMATCH)
2723 -           /* No matches in this directory.  Try the next.  */
2724 -           continue;
2725 -
2726 -         if (status != 0)
2727 -           {
2728 -             globfree (&dirs);
2729 -             globfree (pglob);
2730 -             return status;
2731 -           }
2732 -
2733 -         /* Stick the directory on the front of each name.  */
2734 -         if (prefix_array (dirs.gl_pathv[i],
2735 -                           &pglob->gl_pathv[oldcount],
2736 -                           pglob->gl_pathc - oldcount))
2737 -           {
2738 -             globfree (&dirs);
2739 -             globfree (pglob);
2740 -             return GLOB_NOSPACE;
2741 -           }
2742 -       }
2743 -
2744 -      flags |= GLOB_MAGCHAR;
2745 -
2746 -      if (pglob->gl_pathc == oldcount)
2747 -        {
2748 -       /* No matches.  */
2749 -       if (flags & GLOB_NOCHECK)
2750 -         {
2751 -           size_t len = strlen (pattern) + 1;
2752 -           char *patcopy = (char *) malloc (len);
2753 -           if (patcopy == NULL)
2754 -             return GLOB_NOSPACE;
2755 -           memcpy (patcopy, pattern, len);
2756 -
2757 -           pglob->gl_pathv
2758 -             = (char **) realloc (pglob->gl_pathv,
2759 -                                  (pglob->gl_pathc +
2760 -                                   ((flags & GLOB_DOOFFS) ?
2761 -                                    pglob->gl_offs : 0) +
2762 -                                   1 + 1) *
2763 -                                  sizeof (char *));
2764 -           if (pglob->gl_pathv == NULL)
2765 -             {
2766 -               free (patcopy);
2767 -               return GLOB_NOSPACE;
2768 -             }
2769 -
2770 -           if (flags & GLOB_DOOFFS)
2771 -             while (pglob->gl_pathc < pglob->gl_offs)
2772 -               pglob->gl_pathv[pglob->gl_pathc++] = NULL;
2773 -
2774 -           pglob->gl_pathv[pglob->gl_pathc++] = patcopy;
2775 -           pglob->gl_pathv[pglob->gl_pathc] = NULL;
2776 -           pglob->gl_flags = flags;
2777 -         }
2778 -       else {
2779 -         return GLOB_NOMATCH;
2780 -        }
2781 -      }
2782 -    }
2783 -  else
2784 -    {
2785 -      status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
2786 -      if (status != 0)
2787 -       return status;
2788 -
2789 -      if (dirlen > 0)
2790 -       {
2791 -         /* Stick the directory on the front of each name.  */
2792 -         if (prefix_array (dirname,
2793 -                           &pglob->gl_pathv[oldcount],
2794 -                           pglob->gl_pathc - oldcount))
2795 -           {
2796 -             globfree (pglob);
2797 -             return GLOB_NOSPACE;
2798 -           }
2799 -       }
2800 -    }
2801 -
2802 -  if (flags & GLOB_MARK)
2803 -    {
2804 -      /* Append slashes to directory names.  */
2805 -      int i;
2806 -      struct stat st;
2807 -      for (i = oldcount; i < pglob->gl_pathc; ++i)
2808 -       if (((flags & GLOB_ALTDIRFUNC) ?
2809 -            (*pglob->gl_stat) (pglob->gl_pathv[i], &st) :
2810 -            __stat (pglob->gl_pathv[i], &st)) == 0 &&
2811 -           S_ISDIR (st.st_mode))
2812 -         {
2813 -           size_t len = strlen (pglob->gl_pathv[i]) + 2;
2814 -           char *new = realloc (pglob->gl_pathv[i], len);
2815 -           if (new == NULL)
2816 -             {
2817 -               globfree (pglob);
2818 -               return GLOB_NOSPACE;
2819 -             }
2820 -           strncpy (&new[len - 2], "/", 2);
2821 -           pglob->gl_pathv[i] = new;
2822 -         }
2823 -    }
2824 -
2825 -  if (!(flags & GLOB_NOSORT))
2826 -    /* Sort the vector.  */
2827 -    qsort ((__ptr_t) &pglob->gl_pathv[oldcount],
2828 -          pglob->gl_pathc - oldcount,
2829 -          sizeof (char *), collated_compare);
2830 -
2831 -  return 0;
2832 -}
2833 -
2834 -
2835 -/* Free storage allocated in PGLOB by a previous `glob' call.  */
2836 -void
2837 -globfree (pglob)
2838 -     register glob_t *pglob;
2839 -{
2840 -  if (pglob->gl_pathv != NULL)
2841 -    {
2842 -      register int i;
2843 -      for (i = 0; i < pglob->gl_pathc; ++i)
2844 -       if (pglob->gl_pathv[i] != NULL)
2845 -         free ((__ptr_t) pglob->gl_pathv[i]);
2846 -      free ((__ptr_t) pglob->gl_pathv);
2847 -    }
2848 -}
2849 -
2850 -
2851 -/* Do a collated comparison of A and B.  */
2852 -static int
2853 -collated_compare (a, b)
2854 -     const __ptr_t a;
2855 -     const __ptr_t b;
2856 -{
2857 -  const char *const s1 = *(const char *const * const) a;
2858 -  const char *const s2 = *(const char *const * const) b;
2859 -
2860 -  if (s1 == s2)
2861 -    return 0;
2862 -  if (s1 == NULL)
2863 -    return 1;
2864 -  if (s2 == NULL)
2865 -    return -1;
2866 -  return strcoll (s1, s2);
2867 -}
2868 -
2869 -
2870 -/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
2871 -   elements in place.  Return nonzero if out of memory, zero if successful.
2872 -   A slash is inserted between DIRNAME and each elt of ARRAY,
2873 -   unless DIRNAME is just "/".  Each old element of ARRAY is freed.  */
2874 -static int
2875 -prefix_array (dirname, array, n)
2876 -     const char *dirname;
2877 -     char **array;
2878 -     size_t n;
2879 -{
2880 -  register size_t i;
2881 -  size_t dirlen = strlen (dirname);
2882 -
2883 -  if (dirlen == 1 && dirname[0] == '/')
2884 -    /* DIRNAME is just "/", so normal prepending would get us "//foo".
2885 -       We want "/foo" instead, so don't prepend any chars from DIRNAME.  */
2886 -    dirlen = 0;
2887 -
2888 -  for (i = 0; i < n; ++i)
2889 -    {
2890 -      size_t eltlen = strlen (array[i]) + 1;
2891 -      char *new = (char *) malloc (dirlen + 1 + eltlen);
2892 -      if (new == NULL)
2893 -       {
2894 -         while (i > 0)
2895 -           free ((__ptr_t) array[--i]);
2896 -         return 1;
2897 -       }
2898 -
2899 -#ifdef HAVE_MEMPCPY
2900 -      {
2901 -       char *endp = (char *) mempcpy (new, dirname, dirlen);
2902 -       *endp++ = '/';
2903 -       mempcpy (endp, array[i], eltlen);
2904 -      }
2905 -#else
2906 -      memcpy (new, dirname, dirlen);
2907 -      new[dirlen] = '/';
2908 -      memcpy (&new[dirlen + 1], array[i], eltlen);
2909 -#endif
2910 -      free ((__ptr_t) array[i]);
2911 -      array[i] = new;
2912 -    }
2913 -
2914 -  return 0;
2915 -}
2916 -
2917 -
2918 -/* Return nonzero if PATTERN contains any metacharacters.
2919 -   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
2920 -int
2921 -__glob_pattern_p (pattern, quote)
2922 -     const char *pattern;
2923 -     int quote;
2924 -{
2925 -  register const char *p;
2926 -  int open = 0;
2927 -
2928 -  for (p = pattern; *p != '\0'; ++p)
2929 -    switch (*p)
2930 -      {
2931 -      case '?':
2932 -      case '*':
2933 -       return 1;
2934 -
2935 -      case '\\':
2936 -       if (quote && p[1] != '\0')
2937 -         ++p;
2938 -       break;
2939 -
2940 -      case '[':
2941 -       open = 1;
2942 -       break;
2943 -
2944 -      case ']':
2945 -       if (open)
2946 -         return 1;
2947 -       break;
2948 -      }
2949 -
2950 -  return 0;
2951 -}
2952 -#ifdef _LIBC
2953 -weak_alias (__glob_pattern_p, glob_pattern_p)
2954 -#endif
2955 -
2956 -
2957 -/* Like `glob', but PATTERN is a final pathname component,
2958 -   and matches are searched for in DIRECTORY.
2959 -   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever done.
2960 -   The GLOB_APPEND flag is assumed to be set (always appends).  */
2961 -static int
2962 -glob_in_dir (pattern, directory, flags, errfunc, pglob)
2963 -     const char *pattern;
2964 -     const char *directory;
2965 -     int flags;
2966 -     int (*errfunc) __P ((const char *, int));
2967 -     glob_t *pglob;
2968 -{
2969 -  __ptr_t stream;
2970 -
2971 -  struct globlink
2972 -    {
2973 -      struct globlink *next;
2974 -      char *name;
2975 -    };
2976 -  struct globlink *names = NULL;
2977 -  size_t nfound;
2978 -  int meta;
2979 -  int save;
2980 -
2981 -  stream = ((flags & GLOB_ALTDIRFUNC) ?
2982 -           (*pglob->gl_opendir) (directory) :
2983 -           (__ptr_t) opendir (directory));
2984 -  if (stream == NULL)
2985 -    {
2986 -      if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
2987 -         (flags & GLOB_ERR))
2988 -       return GLOB_ABORTED;
2989 -      nfound = 0;
2990 -      meta = 0;
2991 -    }
2992 -  else if (pattern[0] == '\0')
2993 -    {
2994 -      /* This is a special case for matching directories like in
2995 -        "*a/".  */
2996 -      names = (struct globlink *) __alloca (sizeof (struct globlink));
2997 -      names->name = (char *) malloc (1);
2998 -      if (names->name == NULL)
2999 -       goto memory_error;
3000 -      names->name[0] = '\0';
3001 -      names->next = NULL;
3002 -      nfound = 1;
3003 -      meta = 0;
3004 -    }
3005 -  else
3006 -    {
3007 -      nfound = 0;
3008 -      meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
3009 -      if(meta)
3010 -       flags |= GLOB_MAGCHAR;
3011 -
3012 -      while (1)
3013 -       {
3014 -         const char *name;
3015 -         size_t len;
3016 -         struct dirent *d = ((flags & GLOB_ALTDIRFUNC) ?
3017 -                             (*pglob->gl_readdir) (stream) :
3018 -                             readdir ((DIR *) stream));
3019 -         if (d == NULL)
3020 -           break;
3021 -         if (! REAL_DIR_ENTRY (d))
3022 -           continue;
3023 -
3024 -#ifdef HAVE_D_TYPE
3025 -         /* If we shall match only directories use the information
3026 -            provided by the dirent call if possible.  */
3027 -         if ((flags & GLOB_ONLYDIR)
3028 -             && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
3029 -           continue;
3030 -#endif
3031 -
3032 -         name = d->d_name;
3033 -
3034 -         if ((!meta && strcmp (pattern, name) == 0)
3035 -             || pr_fnmatch (pattern, name,
3036 -                            (!(flags & GLOB_PERIOD) ? PR_FNM_PERIOD : 0) |
3037 -                            ((flags & GLOB_NOESCAPE) ? PR_FNM_NOESCAPE : 0)
3038 -#ifdef _AMIGA
3039 -                         | FNM_CASEFOLD
3040 -#endif
3041 -                        ) == 0)
3042 -           {
3043 -             struct globlink *new
3044 -               = (struct globlink *) __alloca (sizeof (struct globlink));
3045 -             len = NAMLEN (d);
3046 -             new->name = (char *) malloc (len + 1);
3047 -             if (new->name == NULL)
3048 -               goto memory_error;
3049 -#ifdef HAVE_MEMPCPY
3050 -             *((char *) mempcpy ((__ptr_t) new->name, name, len)) = '\0';
3051 -#else
3052 -             memcpy ((__ptr_t) new->name, name, len);
3053 -             new->name[len] = '\0';
3054 -#endif
3055 -             new->next = names;
3056 -             names = new;
3057 -             ++nfound;
3058 -             if (!meta)
3059 -               break;
3060 -           }
3061 -       }
3062 -    }
3063 -
3064 -  if (nfound == 0 && (flags & GLOB_NOMAGIC) && !meta)
3065 -    flags |= GLOB_NOCHECK;
3066 -
3067 -  if (nfound == 0 && (flags & GLOB_NOCHECK))
3068 -    {
3069 -      size_t len = strlen (pattern);
3070 -      nfound = 1;
3071 -      names = (struct globlink *) __alloca (sizeof (struct globlink));
3072 -      names->next = NULL;
3073 -      names->name = (char *) malloc (len + 1);
3074 -      if (names->name == NULL)
3075 -       goto memory_error;
3076 -#ifdef HAVE_MEMPCPY
3077 -      *((char *) mempcpy (names->name, pattern, len)) = '\0';
3078 -#else
3079 -      memcpy (names->name, pattern, len);
3080 -      names->name[len] = '\0';
3081 -#endif
3082 -    }
3083 -
3084 -  if (nfound != 0)
3085 -    {
3086 -      pglob->gl_pathv
3087 -       = (char **) realloc (pglob->gl_pathv,
3088 -                            (pglob->gl_pathc +
3089 -                             ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
3090 -                             nfound + 1) *
3091 -                            sizeof (char *));
3092 -      if (pglob->gl_pathv == NULL)
3093 -       goto memory_error;
3094 -
3095 -      if (flags & GLOB_DOOFFS)
3096 -       while (pglob->gl_pathc < pglob->gl_offs)
3097 -         pglob->gl_pathv[pglob->gl_pathc++] = NULL;
3098 -
3099 -      for (; names != NULL; names = names->next)
3100 -       pglob->gl_pathv[pglob->gl_pathc++] = names->name;
3101 -      pglob->gl_pathv[pglob->gl_pathc] = NULL;
3102 -
3103 -      pglob->gl_flags = flags;
3104 -    }
3105 -
3106 -  save = errno;
3107 -  if(stream) {
3108 -    if (flags & GLOB_ALTDIRFUNC)
3109 -      (*pglob->gl_closedir) (stream);
3110 -    else
3111 -      closedir ((DIR *) stream);
3112 -  }
3113 -  __set_errno (save);
3114 -
3115 -  return nfound == 0 ? GLOB_NOMATCH : 0;
3116 -
3117 - memory_error:
3118 -  {
3119 -    int save = errno;
3120 -    if (flags & GLOB_ALTDIRFUNC)
3121 -      (*pglob->gl_closedir) (stream);
3122 -    else
3123 -      closedir ((DIR *) stream);
3124 -    __set_errno (save);
3125 -  }
3126 -  while (names != NULL)
3127 -    {
3128 -      if (names->name != NULL)
3129 -       free ((__ptr_t) names->name);
3130 -      names = names->next;
3131 -    }
3132 -  return GLOB_NOSPACE;
3133 -}
3134 -
3135 -#endif /* HAVE_GLOB */
3136 diff -urN proftpd-1.2.1/lib/glob.h proftpd-1.2/lib/glob.h
3137 --- proftpd-1.2.1/lib/glob.h    Sun Oct 18 04:24:41 1998
3138 +++ proftpd-1.2/lib/glob.h      Thu Jan  1 01:00:00 1970
3139 @@ -1,133 +0,0 @@
3140 -/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
3141 -
3142 -   The GNU C Library is free software; you can redistribute it and/or
3143 -   modify it under the terms of the GNU Library General Public License as
3144 -   published by the Free Software Foundation; either version 2 of the
3145 -   License, or (at your option) any later version.
3146 -
3147 -   The GNU C Library is distributed in the hope that it will be useful,
3148 -   but WITHOUT ANY WARRANTY; without even the implied warranty of
3149 -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3150 -   Library General Public License for more details.
3151 -
3152 -   You should have received a copy of the GNU Library General Public
3153 -   License along with the GNU C Library; see the file COPYING.LIB.  If not,
3154 -   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3155 -   Boston, MA 02111-1307, USA.  */
3156 -
3157 -#ifndef        _GLOB_H
3158 -#define        _GLOB_H 1
3159 -
3160 -#ifdef __cplusplus
3161 -extern "C"
3162 -{
3163 -#endif
3164 -
3165 -#undef __ptr_t
3166 -#if (defined __cplusplus || (defined __STDC__ && __STDC__) \
3167 -     || defined WINDOWS32)
3168 -# undef        __P
3169 -# define __P(protos)   protos
3170 -# define __ptr_t       void *
3171 -# if !defined __GNUC__ || __GNUC__ < 2
3172 -#  undef __const
3173 -#  define __const const
3174 -# endif
3175 -#else /* Not C++ or ANSI C.  */
3176 -# undef        __P
3177 -# define __P(protos)   ()
3178 -# undef        __const
3179 -# define __const
3180 -# define __ptr_t       char *
3181 -#endif /* C++ or ANSI C.  */
3182 -
3183 -/* Bits set in the FLAGS argument to `glob'.  */
3184 -#define        GLOB_ERR        (1 << 0)/* Return on read errors.  */
3185 -#define        GLOB_MARK       (1 << 1)/* Append a slash to each name.  */
3186 -#define        GLOB_NOSORT     (1 << 2)/* Don't sort the names.  */
3187 -#define        GLOB_DOOFFS     (1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
3188 -#define        GLOB_NOCHECK    (1 << 4)/* If nothing matches, return the pattern.  */
3189 -#define        GLOB_APPEND     (1 << 5)/* Append to results of a previous call.  */
3190 -#define        GLOB_NOESCAPE   (1 << 6)/* Backslashes don't quote metacharacters.  */
3191 -#define        GLOB_PERIOD     (1 << 7)/* Leading `.' can be matched by metachars.  */
3192 -
3193 -#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \
3194 -     || defined _GNU_SOURCE)
3195 -# define GLOB_MAGCHAR   (1 << 8)/* Set in gl_flags if any metachars seen.  */
3196 -# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
3197 -# define GLOB_BRACE     (1 << 10)/* Expand "{a,b}" to "a" "b".  */
3198 -# define GLOB_NOMAGIC   (1 << 11)/* If no magic chars, return the pattern.  */
3199 -# define GLOB_TILDE     (1 << 12)/* Expand ~user and ~ to home directories. */
3200 -# define GLOB_ONLYDIR   (1 << 13)/* Match only directories.  */
3201 -# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
3202 -                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
3203 -                        GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
3204 -                        GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR)
3205 -#else
3206 -# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
3207 -                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
3208 -                        GLOB_PERIOD)
3209 -#endif
3210 -
3211 -/* Error returns from `glob'.  */
3212 -#define        GLOB_NOSPACE    1       /* Ran out of memory.  */
3213 -#define        GLOB_ABORTED    2       /* Read error.  */
3214 -#define        GLOB_NOMATCH    3       /* No matches found.  */
3215 -
3216 -#ifdef _GNU_SOURCE
3217 -/* Previous versions of this file defined GLOB_ABEND instead of
3218 -   GLOB_ABORTED.  Provide a compatibility definition here.  */
3219 -# define GLOB_ABEND GLOB_ABORTED
3220 -#endif
3221 -
3222 -/* Structure describing a globbing run.  */
3223 -#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
3224 -struct stat;
3225 -#endif
3226 -typedef struct
3227 -  {
3228 -    int gl_pathc;              /* Count of paths matched by the pattern.  */
3229 -    char **gl_pathv;           /* List of matched pathnames.  */
3230 -    int gl_offs;               /* Slots to reserve in `gl_pathv'.  */
3231 -    int gl_flags;              /* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
3232 -
3233 -    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
3234 -       are used instead of the normal file access functions.  */
3235 -    void (*gl_closedir) __P ((void *));
3236 -    struct dirent *(*gl_readdir) __P ((void *));
3237 -    __ptr_t (*gl_opendir) __P ((__const char *));
3238 -    int (*gl_lstat) __P ((__const char *, struct stat *));
3239 -    int (*gl_stat) __P ((__const char *, struct stat *));
3240 -  } glob_t;
3241 -
3242 -/* Do glob searching for PATTERN, placing results in PGLOB.
3243 -   The bits defined above may be set in FLAGS.
3244 -   If a directory cannot be opened or read and ERRFUNC is not nil,
3245 -   it is called with the pathname that caused the error, and the
3246 -   `errno' value from the failing call; if it returns non-zero
3247 -   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
3248 -   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
3249 -   Otherwise, `glob' returns zero.  */
3250 -extern int glob __P ((__const char *__pattern, int __flags,
3251 -                     int (*__errfunc) __P ((__const char *, int)),
3252 -                     glob_t *__pglob));
3253 -
3254 -/* Free storage allocated in PGLOB by a previous `glob' call.  */
3255 -extern void globfree __P ((glob_t *__pglob));
3256 -
3257 -
3258 -#ifdef _GNU_SOURCE
3259 -/* Return nonzero if PATTERN contains any metacharacters.
3260 -   Metacharacters can be quoted with backslashes if QUOTE is nonzero.
3261 -
3262 -   This function is not part of the interface specified by POSIX.2
3263 -   but several programs want to use it.  */
3264 -extern int __glob_pattern_p __P ((__const char *__pattern, int __quote));
3265 -extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
3266 -#endif
3267 -
3268 -#ifdef __cplusplus
3269 -}
3270 -#endif
3271 -
3272 -#endif /* glob.h  */
3273 diff -urN proftpd-1.2.1/src/fs.c proftpd-1.2/src/fs.c
3274 --- proftpd-1.2.1/src/fs.c      Sat Feb  3 00:09:26 2001
3275 +++ proftpd-1.2/src/fs.c        Mon Mar 19 23:11:36 2001
3276 @@ -19,7 +19,7 @@
3277   */
3278  
3279  /* ProFTPD virtual/modular file-system support
3280 - * $Id$
3281 + * $Id$
3282   */
3283  
3284  #include "conf.h"
3285 @@ -1132,10 +1132,10 @@
3286      flags |= GLOB_ALTDIRFUNC;
3287      
3288      pglob->gl_closedir = (void (*)(void*))fs_closedir;
3289 -    pglob->gl_readdir = fs_readdir;
3290 +    pglob->gl_readdir = (void*(*)(void*))fs_readdir;
3291      pglob->gl_opendir = fs_opendir;
3292 -    pglob->gl_lstat = fs_lstat;
3293 -    pglob->gl_stat = fs_stat;
3294 +    pglob->gl_lstat = (int (*)(const char *,void*))fs_lstat;
3295 +    pglob->gl_stat = (int (*)(const char *,void*))fs_stat;
3296    }
3297  
3298    return glob(pattern,flags,errfunc,pglob);
3299
This page took 0.343856 seconds and 3 git commands to generate.