Index: aclocal.m4 =================================================================== --- aclocal.m4 (revision 1378) +++ aclocal.m4 (working copy) @@ -1,4 +1,3 @@ -builtin(include,objc.m4) builtin(include,pthread.m4) builtin(include,platform.m4) builtin(include,check.m4) @@ -23,7 +22,7 @@ # Result is cached. # # Defines one of the following preprocessor macros: -# APPLE_RUNTIME GNU_RUNTIME +# APPLE_RUNTIME GNU_RUNTIME MODERN_RUNTIME # # Substitutes the following variables: # OBJC_RUNTIME OBJC_RUNTIME_FLAGS OBJC_LIBS @@ -31,7 +30,7 @@ #------------------------------------------------------------------------ AC_DEFUN([OD_OBJC_RUNTIME],[ AC_REQUIRE([AC_PROG_OBJC]) - AC_ARG_WITH(objc-runtime, AC_HELP_STRING([--with-objc-runtime], [Specify either "GNU" or "apple"]), [with_objc_runtime=${withval}]) + AC_ARG_WITH(objc-runtime, AC_HELP_STRING([--with-objc-runtime], [Specify either "GNU", "apple", or "modern"]), [with_objc_runtime=${withval}]) if test x"${with_objc_runtime}" != x; then case "${with_objc_runtime}" in @@ -39,8 +38,10 @@ ;; apple) ;; + modern) + ;; *) - AC_MSG_ERROR([${with_objc_runtime} is not a valid argument to --with-objc-runtime. Please specify either "GNU" or "apple"]) + AC_MSG_ERROR([${with_objc_runtime} is not a valid argument to --with-objc-runtime. Please specify either "GNU", "apple", or "modern"]) ;; esac fi @@ -174,6 +175,33 @@ od_cv_objc_runtime_gnu="no" fi + if test x"${with_objc_runtime}" = x || test x"${with_objc_runtime}" = x"modern"; then + AC_MSG_CHECKING([for Modern Objective C runtime]) + AC_CACHE_VAL(od_cv_objc_runtime_modern, [ + # The following uses quadrigraphs + # '@<:@' = '[' + # '@:>@' = ']' + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + #include + #include + ], [ + id class = objc_lookUpClass("NSObject"); + id obj = @<:@class alloc@:>@; + puts(@<:@obj name@:>@); + ]) + ], [ + od_cv_objc_runtime_modern="yes" + ], [ + od_cv_objc_runtime_modern="no" + ] + ) + ]) + AC_MSG_RESULT(${od_cv_objc_runtime_modern}) + else + od_cv_objc_runtime_modern="no" + fi + # Apple runtime is prefered if test x"${od_cv_objc_runtime_apple}" = x"yes"; then OBJC_RUNTIME="APPLE_RUNTIME" @@ -185,6 +213,16 @@ OBJC_RUNTIME_FLAGS="-fgnu-runtime" AC_MSG_NOTICE([Using GNU Objective-C runtime]) AC_DEFINE([GNU_RUNTIME], 1, [Define if using the GNU Objective-C runtime and compiler.]) + elif test x"${od_cv_objc_runtime_modern}" = x"yes"; then + OBJC_RUNTIME="MODERN_RUNTIME" + case "${target_os}" in + linux*) OBJC_RUNTIME_FLAGS="-fgnu-runtime" + OBJC_LIBS="-lgnustep-base ${OBJC_LIBS}";; + darwin*) OBJC_RUNTIME_FLAGS="-fnext-runtime" + LDFLAGS="-framework Foundation ${LDFLAGS}";; + esac + AC_MSG_NOTICE([Using Modern Objective-C runtime]) + AC_DEFINE([MODERN_RUNTIME], 1, [Define if using the Modern Objective-C runtime and compiler.]) else AC_MSG_FAILURE([Could not locate a working Objective-C runtime.]) fi Index: src/TRObject.h =================================================================== --- src/TRObject.h (revision 1378) +++ src/TRObject.h (working copy) @@ -40,7 +40,11 @@ #endif #include +#ifdef MODERN_RUNTIME +#include +#else #include +#endif #include "auth-ldap.h" @@ -54,7 +58,11 @@ @end +#ifdef MODERN_RUNTIME +@interface TRObject : NSObject { +#else @interface TRObject : Object { +#endif unsigned int _refCount; } Index: src/TRObject.m =================================================================== --- src/TRObject.m (revision 1378) +++ src/TRObject.m (working copy) @@ -53,9 +53,11 @@ * Additionally, we implement brain-dead, non-thread-safe * reference counting. */ +#ifndef MODERN_RUNTIME @interface Object (AppleAddedAReallyStupidGCCWarning) - (void) dealloc; @end +#endif @implementation TRObject @@ -69,7 +71,11 @@ } - (void) dealloc { +#ifdef MODERN_RUNTIME + [super dealloc]; +#else [super free]; +#endif /* Make Apple's objc compiler be quiet */ if (false) Index: src/auth-ldap.m =================================================================== --- src/auth-ldap.m (revision 1378) +++ src/auth-ldap.m (working copy) @@ -48,6 +48,9 @@ #include #include #include +#ifdef MODERN_RUNTIME +#include +#endif /* Plugin Context */ typedef struct ldap_ctx { @@ -267,7 +270,6 @@ } #endif - *type = OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT) | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_DISCONNECT); @@ -550,6 +552,10 @@ TRLDAPEntry *ldapUser = nil; int ret = OPENVPN_PLUGIN_FUNC_ERROR; +#ifdef MODERN_RUNTIME + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +#endif + username = get_env("username", envp); password = get_env("password", envp); remoteAddress = get_env("ifconfig_pool_remote_ip", envp); @@ -613,5 +619,8 @@ [ldapUser release]; if (ldap) [ldap release]; +#ifdef MODERN_RUNTIME + [pool drain]; +#endif return (ret); } Index: tests/Makefile.in =================================================================== --- tests/Makefile.in (revision 1378) +++ tests/Makefile.in (working copy) @@ -26,7 +26,7 @@ CFLAGS+= @CHECK_CFLAGS@ -DTEST_DATA=\"${srcdir}/data\" OBJCFLAGS+= @CHECK_CFLAGS@ -DTEST_DATA=\"${srcdir}/data\" LIBS+= -lauth-ldap-testing $(OBJC_LIBS) $(LDAP_LIBS) @CHECK_LIBS@ -LDFLAGS+= -L${top_builddir}src $(LIBS) +LDFLAGS+= -L${top_builddir}/src $(LIBS) # Recompile the tests every time all: tests