]> git.saurik.com Git - apple/libresolv.git/commitdiff
libresolv-65.200.2.tar.gz macos-1014 macos-10141 macos-10142 macos-10143 macos-10144 macos-10145 macos-10146 macos-1015 v65.200.2 v67
authorApple <opensource@apple.com>
Tue, 6 Mar 2018 00:51:23 +0000 (00:51 +0000)
committerApple <opensource@apple.com>
Tue, 6 Mar 2018 00:51:23 +0000 (00:51 +0000)
20 files changed:
dns.c
dns_private.h
dns_util.c
dns_util.h
dst.h
dst_hmac_link.c
dst_internal.h
installapi.h [new file with mode: 0644]
libresolv.xcodeproj/project.pbxproj
res_data.c
res_debug.c
res_init.c
res_private.h
res_query.c
res_send.c
res_update.h
resolv.h
xcodescripts/libresolv.xcconfig
xcodescripts/links.sh
xcodescripts/manpages.sh

diff --git a/dns.c b/dns.c
index fa2e658a7733e99fa9505f7de847331b9b01230e..61dcccbc1fb8a550e757554277eb6763a8610acc 100644 (file)
--- a/dns.c
+++ b/dns.c
@@ -728,7 +728,7 @@ _pdns_check_search_list(pdns_handle_t *pdns)
        }
 }
 
-__private_extern__ void
+__attribute__((__visibility__("hidden"))) void
 _check_cache(sdns_handle_t *sdns)
 {
        int i, n, status, refresh, sc_dns_count;
@@ -1405,7 +1405,7 @@ _pdns_query(sdns_handle_t *sdns, pdns_handle_t *pdns, const char *name, uint32_t
        return res_nquery_soa_min(pdns->res, name, class, type, (u_char *)buf, len, from, (int32_t *)fromlen, min);
 }
 
-__private_extern__ int
+__attribute__((__visibility__("hidden"))) int
 _pdns_search(sdns_handle_t *sdns, pdns_handle_t *pdns, const char *name, uint32_t class, uint32_t type, char *buf, uint32_t len, struct sockaddr *from, uint32_t *fromlen)
 {
        char *dot, *qname;
@@ -1520,7 +1520,7 @@ _sdns_send(sdns_handle_t *sdns, const char *name, uint32_t class, uint32_t type,
        return n;
 }
 
-__private_extern__ int
+__attribute__((__visibility__("hidden"))) int
 _sdns_search(sdns_handle_t *sdns, const char *name, uint32_t class, uint32_t type, uint32_t fqdn, uint32_t recurse, char *buf, uint32_t len, struct sockaddr *from, uint32_t *fromlen, int *min)
 {
        pdns_handle_t *primary, **pdns;
index 8320ab73c0629881588492ca4f8b5a73da448239..c097db65d18b01c506147de98b3c20d3270e447d 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef __DNS_PRIVATE_H__
 #define __DNS_PRIVATE_H__
 
+#include <dns.h>
+#include <resolv.h>
 #include <sys/cdefs.h>
 
 #define MDNS_HANDLE_NAME "*MDNS*"
index f44a00839b029c959fe70832057d361dc778a7db..51159e15d95b64380b971b9e77a2696c5f1c7237 100644 (file)
@@ -74,9 +74,6 @@
 
 #define MAXPACKET 1024
 
-extern void res_client_close(res_state res);
-extern int __res_nquery(res_state statp, const char *name, int class, int type, u_char *answer, int anslen);
-extern int dns_res_send(res_state statp, const u_char *buf, int buflen, u_char *ans, int *anssiz, struct sockaddr *from, int *fromlen);
 extern void _check_cache(sdns_handle_t *sdns);
 extern int _sdns_search(sdns_handle_t *sdns, const char *name, uint32_t class, uint32_t type, uint32_t fqdn, uint32_t recurse, char *buf, uint32_t len, struct sockaddr *from, uint32_t *fromlen, int *min);
 extern int _pdns_search(sdns_handle_t *sdns, pdns_handle_t *pdns, const char *name, uint32_t class, uint32_t type, char *buf, uint32_t len, struct sockaddr *from, uint32_t *fromlen);
@@ -316,6 +313,7 @@ _dns_parse_domain_name(const char *p, char **x, int32_t *remaining)
        return name;
 }
 
+static
 dns_resource_record_t *
 _dns_parse_resource_record_internal(const char *p, char **x, int32_t *remaining)
 {
@@ -742,6 +740,7 @@ dns_parse_resource_record(const char *buf, uint32_t len)
        return _dns_parse_resource_record_internal(buf, &x, &remaining);
 }
 
+static
 dns_question_t *
 _dns_parse_question_internal(const char *p, char **x, int32_t *remaining)
 {
@@ -1159,55 +1158,6 @@ _dns_append_resource_record(dns_resource_record_t *r, char **s, uint16_t *l)
        }
 }
 
-char *
-dns_build_reply(dns_reply_t *dnsr, uint16_t *rl)
-{
-       uint16_t i, len;
-       dns_header_t *h;
-       char *s, *x;
-
-       if (dnsr == NULL) return NULL;
-
-       len = NS_HFIXEDSZ;
-
-       s = malloc(len);
-       x = s + len;
-
-       memset(s, 0, len);
-       *rl = len;
-
-       h = (dns_header_t *)s;
-
-       h->xid = htons(dnsr->header->xid);
-       h->flags = htons(dnsr->header->flags);
-       h->qdcount = htons(dnsr->header->qdcount);
-       h->ancount = htons(dnsr->header->ancount);
-       h->nscount = htons(dnsr->header->nscount);
-       h->arcount = htons(dnsr->header->arcount);
-
-       for (i = 0; i < dnsr->header->qdcount; i++)
-       {
-               _dns_append_question(dnsr->question[i], &s, rl);
-       }
-
-       for (i = 0; i < dnsr->header->ancount; i++)
-       {
-               _dns_append_resource_record(dnsr->answer[i], &s, rl);
-       }
-
-       for (i = 0; i < dnsr->header->nscount; i++)
-       {
-               _dns_append_resource_record(dnsr->authority[i], &s, rl);
-       }
-
-       for (i = 0; i < dnsr->header->arcount; i++)
-       {
-               _dns_append_resource_record(dnsr->additional[i], &s, rl);
-       }
-
-       return s;
-}
-
 void
 dns_free_question(dns_question_t *q)
 {
@@ -1247,6 +1197,7 @@ dns_get_buffer_size(dns_handle_t d)
        return dns->recvsize;
 }
 
+static
 dns_reply_t *
 dns_lookup_soa_min(dns_handle_t d, const char *name, uint32_t class, uint32_t type, int *min)
 {
index c29dfd76319310bf6a8cda4502c900394b02e5a2..5f9da7d60e8d174a5b13f8ea323873ca13b6ea5b 100644 (file)
@@ -31,6 +31,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <dns.h>
+#include <stdio.h>
 
 /*
  * Status returned in a dns_reply_t
diff --git a/dst.h b/dst.h
index 791bd8201cdfaa684f36d772b050e2c0fc4f8bb0..c769deae72960ae5aa4fdef55633f8862d878791 100644 (file)
--- a/dst.h
+++ b/dst.h
@@ -1,6 +1,8 @@
 #ifndef DST_H
 #define DST_H
 
+#pragma GCC visibility push(hidden)
+
 #ifndef HAS_DST_KEY
 #define DST_KEY RES_9_DST_KEY
 typedef struct dst_key {
@@ -153,4 +155,6 @@ u_int16_t dst_s_id_calc(const u_char *key_data, const int key_len);
 #define MISSING_KEY_OR_SIGNATURE (-30)
 #define UNSUPPORTED_KEYALG     (-31)
 
+#pragma GCC visibility pop
+
 #endif /* DST_H */
index b5b3375414e9fd95642df63a50c11c31d18f997e..e4b47d8a43dba4253bef44b1f3e73155279aaf97 100644 (file)
@@ -466,16 +466,10 @@ dst_hmac_md5_init()
 }
 
 #else 
+#include "dst_internal.h"
 #define dst_hmac_md5_init res_9_dst_hmac_md5_init
 int
 dst_hmac_md5_init(){
        return (0);
 }
 #endif
-
-
-
-
-
-
-
index 177af3afdb9ad5b1ee0e204a45fed0c9f6ddbdc1..40ece0d686676dff12764209a189afc8dccd3b03 100644 (file)
@@ -18,6 +18,7 @@
  * WITH THE USE OR PERFORMANCE OF THE SOFTWARE.
  */
 #include <limits.h>
+#include <stdio.h>
 #include <sys/param.h>
 #if (!defined(BSD)) || (BSD < 199306)
 # include <sys/bitypes.h>
@@ -55,6 +56,8 @@ typedef struct dst_key {
 #include <isc/dst.h>
 #endif
 
+#pragma GCC visibility push(hidden)
+
 /* 
  * define what crypto systems are supported for RSA, 
  * BSAFE is prefered over RSAREF; only one can be set at any time
@@ -183,6 +186,6 @@ void
 dst_s_dump(const int mode, const u_char *data, const int size,
             const char *msg);
 
-
+#pragma GCC visibility pop
 
 #endif /* DST_INTERNAL_H */
diff --git a/installapi.h b/installapi.h
new file mode 100644 (file)
index 0000000..7f3fbb0
--- /dev/null
@@ -0,0 +1,13 @@
+#include <sys/cdefs.h>
+#include <mach/mach.h>
+#include <netdb.h>
+#include <resolv.h>
+
+// These are declared in Libinfo's headers.  These declarations should eventually move into headers provided by libresolv.
+
+typedef void (*dns_async_callback)(int32_t status, char *buf, uint32_t len, struct sockaddr *from, int fromlen, void *context);
+int32_t dns_async_start(mach_port_t *p, const char *name, uint16_t dnsclass, uint16_t dnstype, uint32_t do_search, dns_async_callback callback, void *context);
+int32_t dns_async_send(mach_port_t *p, const char *name, uint16_t dnsclass, uint16_t dnstype, uint32_t do_search);
+int32_t dns_async_receive(mach_port_t p, char **buf, uint32_t *len, struct sockaddr **from, uint32_t *fromlen);
+int32_t dns_async_handle_reply(void *msg);
+void dns_async_cancel(mach_port_t p);
index 096ccb2ebd899f9250063a24f74f2d8500615eb9..b4aa9f51dc76998852c5b1fd0c16ac6b5ffe04c7 100644 (file)
                        runOnlyForDeploymentPostprocessing = 1;
                        shellPath = /bin/sh;
                        shellScript = "sh \"$PROJECT_DIR\"/xcodescripts/headers.sh\nsh \"$PROJECT_DIR\"/xcodescripts/manpages.sh\nsh \"$PROJECT_DIR\"/xcodescripts/links.sh";
-                       showEnvVarsInLog = 0;
                };
 /* End PBXShellScriptBuildPhase section */
 
index 64af8f33e838a349ed83da495fea368446386ad4..d7de0d6b73a15b63caf185e24b0e72d14aa7ad7e 100644 (file)
@@ -47,6 +47,7 @@ struct __res_9_state _res_9;
 
 extern int __res_vinit(res_state, int);
 
+__attribute__((__visibility__("hidden")))
 const char *__res_opcodes[] = {
        "QUERY",
        "IQUERY",
index 0dbe115c5ccdf9ed46ae925ea78630829be8cc6c..ad74dff54e893d815fc7fdced4a23d0e8aa2e609 100644 (file)
@@ -364,6 +364,7 @@ p_fqname(const u_char *cp, const u_char *msg, FILE *file) {
  * that ns_c_any is a qclass but not a class.  (You can ask for records of class
  * ns_c_any, but you can't have any records of that class in the database.)
  */
+static
 const struct res_sym __res_p_class_syms[] = {
        {ns_c_in,               "IN",           (char *)0},
        {ns_c_chaos,    "CHAOS",        (char *)0},
@@ -399,24 +400,6 @@ const struct res_sym __res_p_update_section_syms[] = {
        {0,             (char *)0,      (char *)0}
 };
 
-const struct res_sym __res_p_key_syms[] = {
-       {NS_ALG_MD5RSA,         "RSA",          "RSA KEY with MD5 hash"},
-       {NS_ALG_DH,             "DH",           "Diffie Hellman"},
-       {NS_ALG_DSA,            "DSA",          "Digital Signature Algorithm"},
-       {NS_ALG_EXPIRE_ONLY,    "EXPIREONLY",   "No algorithm"},
-       {NS_ALG_PRIVATE_OID,    "PRIVATE",      "Algorithm obtained from OID"},
-       {0,                     NULL,           NULL}
-};
-
-const struct res_sym __res_p_cert_syms[] = {
-       {cert_t_pkix,   "PKIX",         "PKIX (X.509v3) Certificate"},
-       {cert_t_spki,   "SPKI",         "SPKI certificate"},
-       {cert_t_pgp,    "PGP",          "PGP certificate"},
-       {cert_t_url,    "URL",          "URL Private"},
-       {cert_t_oid,    "OID",          "OID Private"},
-       {0,             NULL,           NULL}
-};
-
 /*
  * Names of RR types and qtypes.  Types and qtypes are the same, except
  * that T_ANY is a qtype but not a type.  (You can ask for records of type
@@ -478,6 +461,7 @@ const struct res_sym __p_type_syms[] = {
 /*
  * Names of DNS rcodes.
  */
+static
 const struct res_sym __res_p_rcode_syms[] = {
        {ns_r_noerror,  "NOERROR",              "no error"},
        {ns_r_formerr,  "FORMERR",              "format error"},
index bdb3845ee156f471b52432210c6485e943662d8a..dc3b5e1fcbf3365308d5cdc15d352258dd93d29f 100644 (file)
@@ -130,6 +130,7 @@ static u_int32_t net_mask __P((struct in_addr));
  * Resolver state default settings.
  */
 
+__attribute__((__visibility__("hidden")))
 res_state 
 res_build_start(res_state x)
 {
@@ -172,6 +173,7 @@ res_build_start(res_state x)
        return res;
 }
 
+__attribute__((__visibility__("hidden")))
 int
 res_build_finish(res_state res, uint32_t timeout, uint16_t port)
 {
@@ -207,6 +209,7 @@ res_build_finish(res_state res, uint32_t timeout, uint16_t port)
        return 0;
 }
 
+__attribute__((__visibility__("hidden")))
 int
 res_build_sortlist(res_state res, struct in_addr addr, struct in_addr mask)
 {
@@ -225,6 +228,7 @@ res_build_sortlist(res_state res, struct in_addr addr, struct in_addr mask)
        return 0;
 }
 
+__attribute__((__visibility__("hidden")))
 char *
 res_next_word(char **p)
 {
@@ -256,6 +260,7 @@ res_next_word(char **p)
        return s;
 }
 
+__attribute__((__visibility__("hidden")))
 int
 res_build(res_state res, uint16_t port, uint32_t *nsrch, char *key, char *val)
 {
@@ -518,7 +523,7 @@ res_build(res_state res, uint16_t port, uint32_t *nsrch, char *key, char *val)
  *
  * Return 0 if completes successfully, -1 on error
  */
-
+static
 int
 res_vinit_from_file(res_state statp, int preinit, char *resconf_file)
 {
index 34bf952fa22e1c39b97522a2aba733ac8afd12c5..755163ebd63ae350122f95e22558d98dfc4af94c 100644 (file)
@@ -4,6 +4,8 @@
 #include <sys/time.h>
 #include <stdint.h>
 
+#pragma GCC visibility push(hidden)
+
 /*
  * status codes from dns_res_xxx SPIs
  * positive numbers are ns_rcode values.
@@ -107,4 +109,10 @@ void res_interrupt_request(void *token);
 void *res_init_interrupt_token(void);
 void res_delete_interrupt_token(void *token);
 
+extern void res_client_close(res_state res);
+extern int __res_nquery(res_state statp, const char *name, int class, int type, u_char *answer, int anslen);
+extern int dns_res_send(res_state statp, const u_char *buf, int buflen, u_char *ans, int *anssiz, struct sockaddr *from, int *fromlen);
+
+#pragma GCC visibility pop
+
 #endif
index be6a52fde9605b23520499b40025305f95b61797..93e80b0601b984ac3f211f54b5795e83ce5bfc86 100644 (file)
@@ -101,8 +101,8 @@ static const char rcsid[] = "$Id: res_query.c,v 1.1 2006/03/01 19:01:38 majka Ex
 #endif
 
 /* interrupt mechanism is implemented in res_send.c */
-__private_extern__ int interrupt_pipe_enabled;
-__private_extern__ pthread_key_t interrupt_pipe_key;
+extern int interrupt_pipe_enabled;
+extern pthread_key_t interrupt_pipe_key;
 
 /* Options.  Leave them on. */
 #define DEBUG
@@ -584,7 +584,7 @@ res_soa_minimum(const u_char *msg, int len)
  *
  * Caller must parse answer and determine whether it answers the question.
  */
-__private_extern__ int
+__attribute__((__visibility__("hidden"))) int
 res_nquery_soa_min(res_state statp, const char *name, int class, int type, u_char *answer, int anslen, struct sockaddr *from, int *fromlen, int *min)
 {
        u_char buf[MAXPACKET];
@@ -676,6 +676,7 @@ again:
        return (n);
 }
 
+__attribute__((__visibility__("hidden")))
 int
 res_nquery_2(res_state statp, const char *name, int class, int type, u_char *answer, int anslen, struct sockaddr *from, int *fromlen)
 {
@@ -699,6 +700,7 @@ res_nquery(res_state statp, const char *name, int class, int type, u_char *answe
  * Perform a call on res_query on the concatenation of name and domain,
  * removing a trailing dot from name if domain is NULL.
  */
+__attribute__((__visibility__("hidden")))
 int
 res_nquerydomain_2(res_state statp, const char *name, const char *domain, int class, int type, u_char *answer, int anslen, struct sockaddr *from, int *fromlen)
 {
@@ -766,6 +768,7 @@ res_nquerydomain(res_state statp, const char *name, const char *domain, int clas
  * If enabled, implement search rules until answer or unrecoverable failure
  * is detected.  Error code, if any, is left in H_ERRNO.
  */
+__attribute__((__visibility__("hidden")))
 int
 res_nsearch_2(res_state statp, const char *name, int class, int type, u_char *answer, int anslen, struct sockaddr *from, int *fromlen)
 {
@@ -897,6 +900,7 @@ res_nsearch_2(res_state statp, const char *name, int class, int type, u_char *an
        return (-1);
 }
 
+__attribute__((__visibility__("hidden")))
 int
 __res_nsearch_list_2(res_state statp, const char *name,        int class, int type, u_char *answer, int anslen, struct sockaddr *from, int *fromlen, int nsearch, char **search)
 {
index 7a0f6c45a9d73b0d5c745f68d0edc7a4f588f8e9..f391fb47f7dacecbe2c41ed47c30f58f3107a17a 100644 (file)
@@ -159,8 +159,8 @@ static int          dns_pselect(int, void *, void *, void *, struct timespec *, const si
 static const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
 
 /* interrupt mechanism is shared with res_query.c */
-int interrupt_pipe_enabled = 0;
-pthread_key_t interrupt_pipe_key;
+__attribute__((__visibility__("hidden"))) int interrupt_pipe_enabled = 0;
+__attribute__((__visibility__("hidden"))) pthread_key_t interrupt_pipe_key;
 
 static int
 bind_random(int sock, int family)
index 1dbaed084257003a75bd396ac08bdf2eeeb389e4..657bcdd0b1b9d7e73c68a74787dcc399f3a0d901 100644 (file)
@@ -79,6 +79,8 @@
 #endif
 #include <resolv.h>
 
+#pragma GCC visibility push(hidden)
+
 /*
  * This RR-like structure is particular to UPDATE.
  */
@@ -114,4 +116,6 @@ void                res_freeupdrec __P((ns_updrec *));
 int            res_nmkupdate __P((res_state, ns_updrec *, u_char *, int));
 int            res_nupdate __P((res_state, ns_updrec *, ns_tsig_key *));
 
+#pragma GCC visibility pop
+
 #endif /*_RES_UPDATE_H_*/
index d2dbd439c3b181e6018e4f25c8d8796ecbc783c2..a6d96caf7745e8bb083bdf26834c6355607c034a 100644 (file)
--- a/resolv.h
+++ b/resolv.h
@@ -303,7 +303,7 @@ union res_sockaddr_union {
 /*                     0x00010000      */
 
 /* Things involving an internal (static) resolver context. */
-#ifndef __BIND_NOSTATIC
+#if !defined(__BIND_NOSTATIC) && !defined(__BIND_INSTALLAPI)
 extern struct __res_state _res;
 #endif
 
@@ -351,17 +351,8 @@ __END_DECLS
  *
  */
 #define res_sym res_9_sym
-#define __p_key_syms __res_9_p_key_syms
-#define __p_cert_syms __res_9_p_cert_syms
-#define __p_class_syms __res_9_p_class_syms
 #define __p_type_syms __res_9_p_type_syms
-#define __p_rcode_syms __res_9_p_rcode_syms
-
-extern const struct res_sym __p_key_syms[];
-extern const struct res_sym __p_cert_syms[];
-extern const struct res_sym __p_class_syms[];
 extern const struct res_sym __p_type_syms[];
-extern const struct res_sym __p_rcode_syms[];
 #endif /* SHARED_LIBBIND */
 
 #define b64_ntop                                       res_9_b64_ntop
@@ -472,8 +463,6 @@ int         res_findzonecut __P((res_state, const char *, ns_class, int, char *, size_t
 int            res_findzonecut2 __P((res_state, const char *, ns_class, int, char *, size_t, union res_sockaddr_union *, int));
 void           res_nclose __P((res_state));
 int            res_nopt __P((res_state, int, u_char *, int, int));
-void           res_send_setqhook __P((res_send_qhook hook));
-void           res_send_setrhook __P((res_send_rhook hook));
 int            __res_vinit __P((res_state, int));
 void           res_destroyservicelist __P((void));
 const char *   res_servicename __P((u_int16_t port, const char *proto));
index 0ff1cce52ffc3c2716846baa4d9483c0db0a5e92..7ec25ea987be416fd8b06e8fb96e7d411986eb1a 100644 (file)
@@ -1,5 +1,6 @@
 #include "<DEVELOPER_DIR>/Makefiles/CoreOS/Xcode/BSD.xcconfig"
 
+VERSION_INFO_PREFIX=__attribute__((visibility("hidden")))
 PRODUCT_NAME = $(TARGET_NAME).$(FRAMEWORK_VERSION)
 DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
 CODE_SIGN_IDENTITY = -
@@ -21,3 +22,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES
 GCC_WARN_UNUSED_VARIABLE = YES
 GCC_ENABLE_OBJC_EXCEPTIONS = YES
 INSTALLHDRS_SCRIPT_PHASE = YES
+IS_ZIPPERED = YES
+SUPPORTS_TEXT_BASED_API = YES
+TAPI_VERIFY_MODE = Pedantic
+OTHER_TAPI_FLAGS = -D__BIND_INSTALLAPI -extra-public-header $(SRCROOT)/installapi.h
index 151c4e3a1b4a3fb3a058caf615a756c802bf3513..de0d2876dc9f55be1374f03512f702a74b263a1e 100644 (file)
@@ -4,6 +4,16 @@ set -e -x
 if [ "$ACTION" = installhdrs ]; then exit 0; fi
 
 LIBDIR="$DSTROOT"/usr/lib
+
+# installapi runs the script *before* calling tapi... sigh...
+mkdir -p "$LIBDIR"
+
+ln -s libresolv.9.tbd "$LIBDIR"/libresolv.tbd
+chown -h "$INSTALL_OWNER:$INSTALL_GROUP" "$LIBDIR"/libresolv.tbd
+
+# don't install man pages for installhdrs, installapi, or iOS builds
+if [ "$ACTION" = installapi ]; then exit 0; fi
+
 ln -s libresolv.9.dylib "$LIBDIR"/libresolv.dylib
 chown -h "$INSTALL_OWNER:$INSTALL_GROUP" "$LIBDIR"/libresolv.dylib
 chmod -h 0755 "$LIBDIR"/libresolv.dylib
index f0c907244aa6cca1f3036080829631c8654da9df..48715cac95725ecc0c69f74b5eea7bd9fe806376 100644 (file)
@@ -1,7 +1,8 @@
 #!/bin/bash
 set -e -x
 
-# don't install man pages for installhdrs or iOS builds
+# don't install man pages for installhdrs, installapi, or iOS builds
+if [ "$ACTION" = installapi ]; then exit 0; fi
 if [ "$ACTION" = installhdrs ]; then exit 0; fi
 if [ "${PLATFORM_NAME}" != "macosx" ]; then exit 0; fi