careadlink: fix compilation error on mingw
authorEric Blake <eblake@redhat.com>
Fri, 8 Apr 2011 14:51:56 +0000 (08:51 -0600)
committerEric Blake <eblake@redhat.com>
Fri, 8 Apr 2011 14:59:00 +0000 (08:59 -0600)
Mingw compilation failed:

lib/careadlinkat.c: In function 'careadlinkat':
lib/careadlinkat.c:143:39: error: 'const struct allocator' has no member named 'malloc'
lib/careadlinkat.c:149:66: error: 'const struct allocator' has no member named 'realloc'
lib/careadlinkat.c:152:39: error: 'const struct allocator' has no member named 'realloc'
lib/careadlinkat.c:169:27: error: 'const struct allocator' has no member named 'malloc'
make[4]: *** [careadlinkat.lo] Error 1

because "careadlinkat.h" includes enough system headers to get
replacement names defined for malloc, then "allocator.h" defines
fields with those replacement names, then undefining the macros
tries to reference missing fields.

I figured this patch is less invasive than changing the field names
in allocator.h, and possibly requiring clients to change.

* lib/careadlinkat.c (standard_allocator): Avoid renaming fields
within struct allocator.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
lib/careadlinkat.c

index 922d211..2c887a6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-08  Eric Blake  <eblake@redhat.com>
+
+       careadlink: fix compilation error on mingw
+       * lib/careadlinkat.c (standard_allocator): Avoid renaming fields
+       within struct allocator.
+
 2011-04-06  Eric Blake  <eblake@redhat.com>
 
        binary-io: relicense under LGPLv2+
index 15ffe24..eb2e009 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-/* Use the system functions, not the gnulib overrides, because this
-   module does not depend on GNU or POSIX semantics.  */
-#undef malloc
-#undef realloc
-
 /* Define this independently so that stdint.h is not a prerequisite.  */
 #ifndef SIZE_MAX
 # define SIZE_MAX ((size_t) -1)
@@ -57,10 +52,10 @@ careadlinkatcwd (int fd, char const *filename, char *buffer,
 }
 #endif
 
-/* A standard allocator.  For now, only careadlinkat needs this, but
-   perhaps it should be moved to the allocator module.  */
-static struct allocator const standard_allocator =
-  { malloc, realloc, free, NULL };
+/* Forward declaration.  We want to #undef malloc before initializing
+   this struct, but cannot do so until after all code that uses named
+   fields from "allocator.h" has been compiled.  */
+static struct allocator const standard_allocator;
 
 /* Assuming the current directory is FD, get the symbolic link value
    of FILENAME as a null-terminated string and put it into a buffer.
@@ -173,3 +168,14 @@ careadlinkat (int fd, char const *filename,
   errno = ENOMEM;
   return NULL;
 }
+
+/* Use the system functions, not the gnulib overrides, because this
+   module does not depend on GNU or POSIX semantics.  See comments
+   above why this must occur here.  */
+#undef malloc
+#undef realloc
+
+/* A standard allocator.  For now, only careadlinkat needs this, but
+   perhaps it should be moved to the allocator module.  */
+static struct allocator const standard_allocator =
+  { malloc, realloc, free, NULL };