lib: glob: Fix compilation
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 26 Jun 2018 14:39:38 +0000 (17:39 +0300)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 31 Jul 2018 12:56:48 +0000 (15:56 +0300)
The glibc glob() implementation seems to be meant to be compilable
outside of glibc, but that clearly hasn't been tested for some time. Fix
compilation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
lib/compat/glob.c

index c653809..e48b030 100644 (file)
 # include <config.h>
 #endif
 
+#define _GNU_SOURCE
+#define __glibc_unlikely(x)            x
+#define __libc_use_alloca(x)           0
+#define alloca_account(size, avar)     alloca(size)
+
 #include <glob.h>
 
 #include <errno.h>
 # endif
 # define struct_stat64         struct stat64
 #else /* !_LIBC */
-# include "getlogin_r.h"
-# include "mempcpy.h"
-# include "stat-macros.h"
-# include "strdup.h"
+# include <unistd.h>
 # define __stat64(fname, buf)  stat (fname, buf)
 # define struct_stat64         struct stat
 # define __stat(fname, buf)    stat (fname, buf)
 # define __readdir             readdir
 # define __readdir64           readdir64
 # define __glob_pattern_p      glob_pattern_p
+# define __getlogin_r(buf, len)        getlogin_r(buf, len)
+# define __strdup(str)         strdup (str)
 #endif /* _LIBC */
 
 #include <fnmatch.h>
@@ -292,9 +296,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
   int malloc_dirname = 0;
   glob_t dirs;
   int retval = 0;
-#ifdef _LIBC
   size_t alloca_used = 0;
-#endif
 
   if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
     {
@@ -700,8 +702,11 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
 #   endif
                  if (p != NULL)
                    {
+#   if defined HAVE_GETPWNAM_R || defined _LIBC
                      if (!malloc_pwtmpbuf)
+#   endif
                        home_dir = p->pw_dir;
+#   if defined HAVE_GETPWNAM_R || defined _LIBC
                      else
                        {
                          size_t home_dir_len = strlen (p->pw_dir) + 1;
@@ -723,6 +728,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
 
                          free (pwtmpbuf);
                        }
+#   endif
                    }
                }
            }
@@ -931,8 +937,10 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
                    dirname = malloc (home_len + rest_len + 1);
                    if (dirname == NULL)
                      {
+#  if defined HAVE_GETPWNAM_R || defined _LIBC
                        if (__glibc_unlikely (malloc_pwtmpbuf))
                          free (pwtmpbuf);
+#  endif
                        retval = GLOB_NOSPACE;
                        goto out;
                      }
@@ -944,13 +952,17 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
                dirlen = home_len + rest_len;
                dirname_modified = 1;
 
+#  if defined HAVE_GETPWNAM_R || defined _LIBC
                if (__glibc_unlikely (malloc_pwtmpbuf))
                  free (pwtmpbuf);
+#  endif
              }
            else
              {
+#  if defined HAVE_GETPWNAM_R || defined _LIBC
                if (__glibc_unlikely (malloc_pwtmpbuf))
                  free (pwtmpbuf);
+#  endif
 
                if (flags & GLOB_TILDE_CHECK)
                  /* We have to regard it as an error if we cannot find the