<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/c9e27644de1860151544d9d15fce83816c9f36a1">https://github.com/macports/macports-legacy-support/commit/c9e27644de1860151544d9d15fce83816c9f36a1</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit c9e27644de1860151544d9d15fce83816c9f36a1
</span>Author: Christian Cornelssen <ccorn@1tein.de>
AuthorDate: Sat Feb 2 16:16:26 2019 +0100
<span style='display:block; white-space:pre;color:#404040;'> Use asm symbol declarations for wrappers
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> The idea is taken from Apple's own declaration of `realpath`:
</span><span style='display:block; white-space:pre;color:#404040;'> It boils down to
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> extern char *realpath(const char * __restrict, char * __restrict)
</span><span style='display:block; white-space:pre;color:#404040;'> asm("_linker_symbol_for_realpath");
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This means that we do not need to use macros for renaming symbols
</span><span style='display:block; white-space:pre;color:#404040;'> (except for temporarily moving the original declaration out of the way).
</span><span style='display:block; white-space:pre;color:#404040;'> The compiler does that for us where necessary (and only there).
</span><span style='display:block; white-space:pre;color:#404040;'> This preserves source-level API compatibility.
</span><span style='display:block; white-space:pre;color:#404040;'> Take a look at test/test_{realpath,sysconf}.c for the scenarios tested.
</span>---
include/MacportsLegacySupport.h | 27 +++++-------
.../MacportsLegacyWrappers/sysconf_support.h | 20 ++++-----
.../MacportsLegacyWrappers/wrapper_macros.h | 27 +++++++-----
include/stdlib.h | 12 ++---
include/unistd.h | 20 +++------
src/macports_legacy_realpath.c | 6 +--
src/macports_legacy_sysconf.c | 19 +++-----
test/test_realpath.c | 51 +++++++++++++++++++++-
test/test_sysconf.c | 48 +++++++++++++++++---
9 files changed, 148 insertions(+), 82 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/MacportsLegacySupport.h b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;color:#808080;'>index fe83e64..2eaa2e6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -20,6 +20,7 @@
</span> #define _MACPORTS_LEGACYSUPPORTDEFS_H_
#include "AvailabilityMacros.h"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacyWrappers/wrapper_macros.h"
</span>
/* defines for when legacy support is required for various functions */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -59,26 +60,20 @@
</span> /* posix_memalign */
#define __MP_LEGACY_SUPPORT_POSIX_MEMALIGN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-/* realpath() wrap */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#if (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && !defined(__DISABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && !defined(__DISABLE_ALL_MACPORTS_FUNCTION_WRAPPING__) )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# define __MP_LEGACY_SUPPORT_REALPATH_WRAP__ 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# define __MP_LEGACY_SUPPORT_REALPATH_WRAP__ 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* realpath() wrap availability */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MP_LEGACY_SUPPORT_REALPATH_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* realpath() wrap status */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __ENABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__ (!__DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__ && !__DISABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__ && __MP_LEGACY_SUPPORT_REALPATH_WRAP__)
</span>
/* lsmod */
#define __MP_LEGACY_SUPPORT_LSMOD__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-/* sysconf() wrap */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#if (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && !defined(__DISABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && !defined(__DISABLE_ALL_MACPORTS_FUNCTION_WRAPPING__) )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# define __MP_LEGACY_SUPPORT_SYSCONF_WRAP__ 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# define __MP_LEGACY_SUPPORT_SYSCONF_WRAP__ 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sysconf() wrap availability */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MP_LEGACY_SUPPORT_SYSCONF_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sysconf() wrap status */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __ENABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__ (!__DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__ && !__DISABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__ && __MP_LEGACY_SUPPORT_SYSCONF_WRAP__)
</span>
/* arc4random */
#define __MP_LEGACY_SUPPORT_ARC4RANDOM__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_realpath.c b/include/MacportsLegacyWrappers/sysconf_support.h
</span>similarity index 71%
copy from test/test_realpath.c
copy to include/MacportsLegacyWrappers/sysconf_support.h
<span style='display:block; white-space:pre;color:#808080;'>index 603b72a..d67adb1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/MacportsLegacyWrappers/sysconf_support.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,6 +1,6 @@
</span>
/*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2019 Christian Cornelssen
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2019 Ken Cunningham <kencu@macports.org>
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -15,15 +15,13 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sysconf macros supported by the macports wrapper */
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int main() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- const char *p = realpath(".", NULL); /* bus error up to 10.5 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!p) return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("%s\n", p);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("realpath supports NULL pointer\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- free((void*)p);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _SC_NPROCESSORS_CONF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _SC_NPROCESSORS_CONF 57
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _SC_NPROCESSORS_ONLN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _SC_NPROCESSORS_ONLN 58
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span>
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_sysconf.c b/include/MacportsLegacyWrappers/wrapper_macros.h
</span>similarity index 52%
copy from test/test_sysconf.c
copy to include/MacportsLegacyWrappers/wrapper_macros.h
<span style='display:block; white-space:pre;color:#808080;'>index 7bb159b..919436b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/MacportsLegacyWrappers/wrapper_macros.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -15,17 +15,22 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _MACPORTS_LEGACYSUPPORTWRAP_H_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _MACPORTS_LEGACYSUPPORTWRAP_H_
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int main() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- long nconf = sysconf(_SC_NPROCESSORS_CONF);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- long nonln = sysconf(_SC_NPROCESSORS_ONLN);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("nconf = %ld; nonln = %ld\n", nconf, nonln);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(nconf > 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(nonln > 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* We need support for asm */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__GNUC__ && !__clang__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef __DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__ 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Could include Darwin's <sys/cdefs.h> and use __STRING, __CONCAT */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* But for wrappers we require asm, thus GCC/Clang, thus ANSI C, anyway */
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Wrapper support macros */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MP_LEGACY_WRAPPER(sym) macports_legacy_##sym
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MP_LEGACY_WRAPPER_ALIAS(sym) asm("_macports_legacy_" #sym)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !__DISABLE_MP_LEGACY_SUPPORT_FUNCTION_WRAPPING__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* _MACPORTS_LEGACYSUPPORTWRAP_H_ */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/stdlib.h b/include/stdlib.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 9260caf..c8ce165 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/stdlib.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/stdlib.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -23,33 +23,33 @@
</span> #include "MacportsLegacySupport.h"
/* realpath wrap */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __ENABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span>
/* we are going to move the old realpath definition out of the way */
#undef realpath
#define realpath(a,b) realpath_macports_original(a,b)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /*__MP_LEGACY_SUPPORT_REALPATH_WRAP__*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /*__ENABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__*/
</span>
/* Include the primary system stdlib.h */
#include_next <stdlib.h>
/* realpath wrap */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __ENABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span>
/* and now define realpath as our new wrapped function */
#undef realpath
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#define realpath(a,b) macports_legacy_realpath(a,b)
</span>
#ifdef __cplusplus
extern "C" {
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern char * macports_legacy_realpath(const char * __restrict, char * __restrict);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern char *realpath(const char * __restrict, char * __restrict)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __MP_LEGACY_WRAPPER_ALIAS(realpath);
</span> #ifdef __cplusplus
}
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /*__MP_LEGACY_SUPPORT_REALPATH_WRAP__*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /*__ENABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__*/
</span>
/* posix_memalign */
#if __MP_LEGACY_SUPPORT_POSIX_MEMALIGN__
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/unistd.h b/include/unistd.h
</span><span style='display:block; white-space:pre;color:#808080;'>index e06ac82..1fa73b6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/unistd.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/unistd.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2,13 +2,13 @@
</span> #include "MacportsLegacySupport.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __ENABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span>
/* redefine the original sysconf */
#undef sysconf
#define sysconf(a) sysconf_orig(a)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /*__MP_LEGACY_SUPPORT_SYSCONF_WRAP__*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /*__ENABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__*/
</span>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -16,26 +16,18 @@
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __ENABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span>
/* and now define sysconf as our new wrapped function */
#undef sysconf
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#define sysconf(a) macports_legacy_sysconf(a)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#ifndef _SC_NPROCESSORS_CONF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _SC_NPROCESSORS_CONF 57
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#ifndef _SC_NPROCESSORS_ONLN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _SC_NPROCESSORS_ONLN 58
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacyWrappers/sysconf_support.h"
</span>
#ifdef __cplusplus
extern "C" {
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-extern long macports_legacy_sysconf(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern long sysconf(int) __MP_LEGACY_WRAPPER_ALIAS(sysconf);
</span> #ifdef __cplusplus
}
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /*__MP_LEGACY_SUPPORT_SYSCONF_WRAP__*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __ENABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__ */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports_legacy_realpath.c b/src/macports_legacy_realpath.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 7db3400..ba28058 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports_legacy_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports_legacy_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -21,14 +21,14 @@
</span> #if __MP_LEGACY_SUPPORT_REALPATH_WRAP__
/* we need this blocker so as to not get caught in our own wrap */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#undef __MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define __DISABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef __DISABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __DISABLE_MP_LEGACY_SUPPORT_REALPATH_WRAP__ 1
</span>
#include <limits.h>
#include <stdlib.h>
char *
<span style='display:block; white-space:pre;background:#ffe0e0;'>-macports_legacy_realpath(const char * __restrict stringsearch, char * __restrict buffer)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__MP_LEGACY_WRAPPER(realpath)(const char * __restrict stringsearch, char * __restrict buffer)
</span> {
if (buffer == NULL) {
char *myrealpathbuf = malloc(PATH_MAX);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports_legacy_sysconf.c b/src/macports_legacy_sysconf.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 6855915..4bce9c5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports_legacy_sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports_legacy_sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -21,8 +21,8 @@
</span> #if __MP_LEGACY_SUPPORT_SYSCONF_WRAP__
/* we need this blocker so as to not get caught in our own wrap */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#undef __MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define __DISABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef __DISABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __DISABLE_MP_LEGACY_SUPPORT_SYSCONF_WRAP__ 1
</span>
#include <sys/types.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,18 +30,11 @@
</span>
#include <unistd.h>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#ifndef _SC_NPROCESSORS_CONF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _SC_NPROCESSORS_CONF 57
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#ifndef _SC_NPROCESSORS_ONLN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _SC_NPROCESSORS_ONLN 58
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> /* emulate two commonly used but missing selectors from sysconf() on 10.4 */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-long macports_legacy_sysconf(int name){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <MacportsLegacyWrappers/sysconf_support.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long __MP_LEGACY_WRAPPER(sysconf)(int name){
</span>
if ( name == _SC_NPROCESSORS_ONLN ) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -55,7 +48,7 @@ long macports_legacy_sysconf(int name){
</span>
if (ret < 0 || count < 1) {
/* try again with _SC_NPROCESSORS_CONF */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return macports_legacy_sysconf(_SC_NPROCESSORS_CONF);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return __MP_LEGACY_WRAPPER(sysconf)(_SC_NPROCESSORS_CONF);
</span> } else {
return (long)count;
}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_realpath.c b/test/test_realpath.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 603b72a..5f4dcb8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -15,14 +15,61 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Deliberately declaring some potentially redefined names
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * before including the associated header file, to test robustness.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Wrapper should work not only with calls, but with references as well */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* __restrict not needed here (and remember: nothing included yet) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef char * (*strfunc_t)(const char *, char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Renaming different objects should not affect functionality */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct { char *realpath; } rpv_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct { strfunc_t realpath; } rpf_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #include <stdlib.h>
#include <stdio.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <assert.h>
</span>
int main() {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with direct function call */
</span> const char *p = realpath(".", NULL); /* bus error up to 10.5 */
if (!p) return 1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("%s\n", p);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("realpath supports NULL pointer\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("cwd = %s\n", p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("realpath(path, NULL) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with name (reference) only */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strfunc_t f = realpath;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *q = f(".", NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!q) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (!strcmp(q, p));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("f = realpath, f(path, NULL) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free((void*)q);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with function macro disabler */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *q = (realpath)(".", NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!q) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (!strcmp(q, p));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("(realpath)(path, NULL) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free((void*)q);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with same-named fields */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rpf_t rpf = { realpath };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rpv_t rpv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rpv.realpath = rpf.realpath(".", NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!rpv.realpath) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (!strcmp(rpv.realpath, p));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("rpv.realpath = rpf.realpath(path, NULL) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free((void*)rpv.realpath);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> free((void*)p);
return 0;
}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_sysconf.c b/test/test_sysconf.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 7bb159b..7353e6f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -15,17 +15,53 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Deliberately declaring some potentially redefined names
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * before including the associated header file, to test robustness.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Wrapper should work not only with calls, but with references as well */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef long (*itol_t)(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Renaming different objects should not affect functionality */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct { long sysconf; } scv_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct { itol_t sysconf; } scf_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #include <unistd.h>
#include <stdio.h>
#include <assert.h>
int main() {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- long nconf = sysconf(_SC_NPROCESSORS_CONF);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- long nonln = sysconf(_SC_NPROCESSORS_ONLN);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- printf("nconf = %ld; nonln = %ld\n", nconf, nonln);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(nconf > 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(nonln > 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with direct function call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ long nconf = sysconf(_SC_NPROCESSORS_CONF);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ long nonln = sysconf(_SC_NPROCESSORS_ONLN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("nconf = %ld; nonln = %ld\n", nconf, nonln);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (nconf > 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (nonln > 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("sysconf(_SC_NPROCESSORS_XXXX) supported.\n");
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with name (reference) only */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ itol_t f = sysconf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (f(_SC_NPROCESSORS_CONF) == nconf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (f(_SC_NPROCESSORS_ONLN) == nonln);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("f = sysconf, f(_SC_NPROCESSORS_XXXX) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with function macro disabler */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert ((sysconf)(_SC_NPROCESSORS_CONF) == nconf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert ((sysconf)(_SC_NPROCESSORS_ONLN) == nonln);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("(sysconf)(_SC_NPROCESSORS_XXXX) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test with same-named fields */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ scf_t scf = { sysconf };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ scv_t scv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ scv.sysconf = scf.sysconf(_SC_NPROCESSORS_CONF);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (scv.sysconf == nconf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ scv.sysconf = scf.sysconf(_SC_NPROCESSORS_ONLN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert (scv.sysconf == nonln);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("scv.sysconf = scf.sysconf(_SC_NPROCESSORS_XXXX) supported.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span> }
</pre><pre style='margin:0'>
</pre>