[Rpm-maint] [PATCH 2/4] Fixes missing glob_pattern_p on mac.

Giulio Eulisse Giulio.Eulisse at cern.ch
Tue Apr 20 09:42:04 UTC 2010


The weak_alias used to assign __glob_pattern_p to glob_pattern_p does not get
executed on mac. I tried specifing #pragma weak but it does not work as well
so in the end I solved the problem by duplicating the function where needed.
---
 build/files.c       |   33 ++++++++++++++++++++++++++++++++-
 rpmio/rpmfileutil.c |   33 ++++++++++++++++++++++++++++++++-
 2 files changed, 64 insertions(+), 2 deletions(-)
-------------- next part --------------
diff --git a/build/files.c b/build/files.c
index 7db729a..79020ba 100644
--- a/build/files.c
+++ b/build/files.c
@@ -1656,6 +1656,37 @@ exit:
     return rc;
 }
 
+static int
+__glob_pattern_p (const char *pattern, int quote)
+{
+  register const char *p;
+  int open = 0;
+
+  for (p = pattern; *p != '\0'; ++p)
+    switch (*p)
+      {
+      case '?':
+      case '*':
+        return 1;
+
+      case '\\':
+        if (quote && p[1] != '\0')
+          ++p;
+        break;
+
+      case '[':
+        open = 1;
+        break;
+
+      case ']':
+        if (open)
+          return 1;
+        break;
+      }
+
+  return 0;
+}
+
 /**
  * Add a file to a binary package.
  * @param pkg
@@ -1670,7 +1701,7 @@ static rpmRC processBinaryFile(Package pkg, FileList fl, const char * fileName)
     char *diskPath = NULL;
     int rc = RPMRC_OK;
     
-    doGlob = glob_pattern_p(fileName, quote);
+    doGlob = __glob_pattern_p(fileName, quote);
 
     /* Check that file starts with leading "/" */
     if (*fileName != '/') {
diff --git a/rpmio/rpmfileutil.c b/rpmio/rpmfileutil.c
index cb36ebe..d762292 100644
--- a/rpmio/rpmfileutil.c
+++ b/rpmio/rpmfileutil.c
@@ -543,6 +543,37 @@ char * rpmGetPath(const char *path, ...)
     return rpmCleanPath(res);
 }
 
+static int
+__glob_pattern_p (const char *pattern, int quote)
+{
+  register const char *p;
+  int open = 0;
+
+  for (p = pattern; *p != '\0'; ++p)
+    switch (*p)
+      {
+      case '?':
+      case '*':
+        return 1;
+
+      case '\\':
+        if (quote && p[1] != '\0')
+          ++p;
+        break;
+
+      case '[':
+        open = 1;
+        break;
+
+      case ']':
+        if (open)
+          return 1;
+        break;
+      }
+
+  return 0;
+}
+
 int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr)
 {
     int ac = 0;
@@ -588,7 +619,7 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr)
 	int local = (ut == URL_IS_PATH) || (ut == URL_IS_UNKNOWN);
 	glob_t gl;
 
-	if (!local || (!glob_pattern_p(av[j], 0) && strchr(path, '~') == NULL)) {
+	if (!local || (!__glob_pattern_p(av[j], 0) && strchr(path, '~') == NULL)) {
 	    argvAdd(&argv, av[j]);
 	    continue;
 	}


More information about the Rpm-maint mailing list