From 707abf979a99dd603a6e6ae3c701734a44c716f7 Mon Sep 17 00:00:00 2001 From: Colin Godsey Date: Tue, 16 Apr 2019 07:25:52 -0600 Subject: [PATCH] OSX native zlib and crypto diff --git a/native/compile-native.sh b/native/compile-native.sh index 98baf0e2..bdd1cd6b 100755 --- a/native/compile-native.sh +++ b/native/compile-native.sh @@ -1,6 +1,17 @@ #!/bin/sh -CXX="g++ -shared -fPIC -O3 -Wall -Werror -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/" +# Waterfall - rewrite below to extend platform support -$CXX src/main/c/NativeCipherImpl.cpp -o src/main/resources/native-cipher.so -lcrypto -$CXX src/main/c/NativeCompressImpl.cpp -o src/main/resources/native-compress.so -lz +if [[ "$OSTYPE" == "darwin"* ]]; then + # brew install mbedtls zlib + PREFIX="osx-" + CXX_ARGS="/usr/local/lib/libmbedcrypto.a -lz -I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin/ -I/usr/local/include -L/usr/local/lib" +else + # apt-get install libmbedtls-dev zlib1g-dev + CXX_ARGS="-lcrypto -lz -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/" +fi + +CXX="g++ -shared -fPIC -O3 -Wall -Werror" + +$CXX src/main/c/NativeCipherImpl.cpp -o src/main/resources/${PREFIX}native-cipher.so $CXX_ARGS +$CXX src/main/c/NativeCompressImpl.cpp -o src/main/resources/${PREFIX}native-compress.so $CXX_ARGS diff --git a/native/src/main/c/NativeCipherImpl.cpp b/native/src/main/c/NativeCipherImpl.cpp index aa7a12b4..0cedd7e5 100644 --- a/native/src/main/c/NativeCipherImpl.cpp +++ b/native/src/main/c/NativeCipherImpl.cpp @@ -1,5 +1,7 @@ // Support for CentOS 6 +#if __linux__ // Waterfall __asm__(".symver memcpy,memcpy@GLIBC_2.2.5"); +#endif // Waterfall #include #include diff --git a/native/src/main/java/net/md_5/bungee/jni/NativeCode.java b/native/src/main/java/net/md_5/bungee/jni/NativeCode.java index 4e4130bc..a6d7cfb5 100644 --- a/native/src/main/java/net/md_5/bungee/jni/NativeCode.java +++ b/native/src/main/java/net/md_5/bungee/jni/NativeCode.java @@ -19,6 +19,7 @@ public final class NativeCode public NativeCode(String name, Class javaImpl, Class nativeImpl) { + if ("Mac OS X".equals( System.getProperty( "os.name" ))) name = "osx-" + name; // Waterfall this.name = name; this.javaImpl = javaImpl; this.nativeImpl = nativeImpl; @@ -80,6 +81,6 @@ public final class NativeCode public static boolean isSupported() { - return "Linux".equals( System.getProperty( "os.name" ) ) && "amd64".equals( System.getProperty( "os.arch" ) ); + return ("Linux".equals( System.getProperty( "os.name" ) ) || "Mac OS X".equals( System.getProperty( "os.name" ) )) && ("amd64".equals( System.getProperty( "os.arch" ) ) || "x86_64".equals( System.getProperty( "os.arch" )) ); // Waterfall } } diff --git a/native/src/main/resources/osx-native-cipher.so b/native/src/main/resources/osx-native-cipher.so new file mode 100755 index 0000000000000000000000000000000000000000..4d7916066e78333aa659cd4ba491d94f26890893 GIT binary patch literal 24164 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 WEa4_m=QdHGyC3tHuv9J&nfo+ literal 0 HcmV?d00001 diff --git a/native/src/main/resources/osx-native-compress.so b/native/src/main/resources/osx-native-compress.so new file mode 100755 index 0000000000000000000000000000000000000000..02c98d2c48097fdc3312534ee706b3905283eb45 GIT binary patch literal 9676 zcmeHNeQaA-6~AtiHT_7PbW4}O7}@ z&;7{MEv3oShiA!R8=9aJWda1#1erjhn?xIE=z<0`V~8>diGW7swnGd5wAIFHe&@dX z9Q&mOtrGwFCik9?d(XM&o_pTad*}Mxd;h$?f-%=}#@KDBZq#Gdj7^T$17qwi)IYlz zNX4}w zImT(<@1?%iWxq|^D$8_($$45k5Z9tSt_>yyU2flT+BlS`1sKsz9kNRR+Sg-ZU;Vxw zUrCR>pErTDuM{ix-f*rZxPEA4AerE!MhbS`Sf8zq;)CSvLjGTE6M&o#B}>9&iM~3i zNQMg|+NrO$OkX1W-|TCY`ud~{(WUxmy>hF>2+jxe#i%2D%hx+9^+_OPO7)e-Aa&9{ zD5#u=f}M{9{6YH}^MFakR^$;B`>lLF$gWadv}V%N=-}(Ah<79$*SslJPo`55RrePgm@SuAJ+hG0klhphp|}@H5(b50;CwDIcGty z2YmW&#yY^HJ?%oJLhGkWd%Y61bbmmWmCcYRpE%1$!Jv6gH~;)N`~HJHFaP+?3n%-k z&fO252i1kj)~*tjaGH-T|CQ@r0NaJcT7ydKBVASZ+A#k^@f*?IcDO^4?~X0{LAA#<_|KryolflT$gWJ(5p2wYRLldYmJu%KiEbztR{lXS?@ zVG3$q_;$y9A(tmcruL^ocBS&rj%(?a%8?nesQ*mC;DS?wJz*`e?s<5L4%iCa=i9fk3)kozDZn@{m~&oWSH2L${W&A4(ld$Pg=A zE5MDG@PZV%$r9>rzJ#LL&iFj%Gye#yPb2KusZlifHLy5no()XA?Vfm^_AcAt$Gopl zXUM$jH?Qa4$7rAV8nz>5t>s1W)L7dgWBW9*vb6#%jqPmvRVm_FixuD3^8OF3?GUkD zcr+F=7s@02jFN4C2|8YtcI78*qui52h|J5sb8qll@h|p=o=4^AJB-^@n8pT}YH^)37b9>|X;YQ}3c#hnGfT11A)60aca!-vmR~?nU!+nX_8xX0VpMto>nrwvjKBH|M`Cx z3c<_{8UzLK!sXALf<9rC2`G)4+$$c>hLg}os$Zcoma4fzPNAU5G(3Y&f3sdg17x4y z{8u3tL$|;AagX1;1_w7T9wBFPg-y3XsIaLXhp*NOHH(XJP5qi8>Z z7G`8W{xZz*br&{$7cdv27n_S0U~sIRu)h%YMZ*3-*lxmR345HdQ-pn;u%8ijoUj)O zn%n+R(|-fr;?_fW8DCwn-VPDDLg z((vGoSv5Rk_ySF-;gOP#!IY{N`44(nTg&||ZEYn3XoBJZ)~oH+k_WUR1B#7wO7lcu z6)lst^|>DjukKpyGjw z2Pz(@c%b5eiU%qlsCb~_frEAVh+FOS6b@}YD%6=jd^tIKuZ zCM+s0+xYt zwjG%tj(ibEzNoF8TL~kMgb^RZeIU29M%JxqaAY*WSwG*^_Gu%QN**X?lDZz)-Wd#N z`+3(RkvPMJVHG8Q*kO@4V$Zo$tod86(Nq%Gu{!&ni!J*?TunrEmT|G~;HMb#^+?l9 zuR}B5fM#kvn)y4?%oVRj=j-?6TvOt2fs#3w(0sx*&gSTX73D4@iPi$Q@1yUP^uao- zpK?fU$h6AK_pOqim-IfHMvjTfPf%(699?jtTtX#!e3c;C-N1?Nkn{V2<6k78Xv9tj z9e2?CEE=s<#vJrh4*FRK{endo=lh|fpOTW+zoq{d4*GQm{gy=+_0h7(HMD%Xzov8+ zeqtf+Z0VOW>rih;y#uuY6{Uk*^I_yXjDPs}qgc8HF%girC?|vU7NqTvzXeh2+2Q}| zVJkbu#936vvCcL7U@9I-HbUoyjaw&%O<8A!b@UVu9UBp1@+6XClCs2>9HCf7r+r3j z?NkqZX<%557=f+__;4f<*7dHoRz5tU8nI+F=pVz6Lw1GQTJ7X^&@UNwiW>}3{sW5e Bu)Y8Q literal 0 HcmV?d00001 -- 2.26.1