From 9cc991025d6139a3a8f3e0f1570bf39a66f3aafa Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 8 Apr 2011 08:51:56 -0600 Subject: [PATCH] careadlink: fix compilation error on mingw 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 --- ChangeLog | 6 ++++++ lib/careadlinkat.c | 24 +++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 922d2116c..2c887a61b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-04-08 Eric Blake + + careadlink: fix compilation error on mingw + * lib/careadlinkat.c (standard_allocator): Avoid renaming fields + within struct allocator. + 2011-04-06 Eric Blake binary-io: relicense under LGPLv2+ diff --git a/lib/careadlinkat.c b/lib/careadlinkat.c index 15ffe24c0..eb2e009e9 100644 --- a/lib/careadlinkat.c +++ b/lib/careadlinkat.c @@ -30,11 +30,6 @@ #include #include -/* 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 }; -- 2.11.0