summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/crosstool.sh61
1 files changed, 52 insertions, 9 deletions
diff --git a/scripts/crosstool.sh b/scripts/crosstool.sh
index b5f1373..ec1c2b5 100755
--- a/scripts/crosstool.sh
+++ b/scripts/crosstool.sh
@@ -226,19 +226,62 @@ case "${CT_PROXY_TYPE}" in
;;
sockssys)
CT_HasOrAbort tsocks
+ # Force not using HTTP proxy
+ unset http_proxy ftp_proxy https_proxy
. tsocks -on
;;
socks*)
CT_HasOrAbort tsocks
+ # Force not using HTTP proxy
+ unset http_proxy ftp_proxy https_proxy
# Remove any lingering config file from any previous run
rm -f "${CT_BUILD_DIR}/tsocks.conf"
# Find all interfaces and build locally accessible networks
- /sbin/ifconfig |egrep 'inet addr' |while read inet addr bcast mask; do
- ip="${addr/*:}"
- mask="${mask/*:}"
- [ -n "${mask}" -a "${ip}" != "127.0.0.1" ] && echo "local = ${ip}/${mask}"
- done >"${CT_BUILD_DIR}/tsocks.conf"
- ( echo "server = ${CT_PROXY_HOST}";
+ server_ip=$(ping -c 1 -W 2 "${CT_PROXY_HOST}" |head -n 1 |sed -r -e 's/^[^\(]+\(([^\)]+)\).*$/\1/;' || true)
+ CT_TestOrAbort "SOCKS proxy '${CT_PROXY_HOST}' has no IP." -n "${server_ip}"
+ /sbin/ifconfig |gawk -v server_ip="${server_ip}" '
+ BEGIN {
+ split( server_ip, tmp, "\\." );
+ server_ip_num = tmp[1] * 2^24 + tmp[2] * 2^16 + tmp[3] * 2^8 + tmp[4] * 2^0;
+ pairs = 0;
+ }
+
+ $0 ~ /^[[:space:]]*inet addr:/ {
+ split( $2, tmp, ":|\\." );
+ if( ( tmp[2] == 127 ) && ( tmp[3] == 0 ) && ( tmp[4] == 0 ) && ( tmp[5] == 1 ) ) {
+ /* Skip 127.0.0.1, it'\''s taken care of by tsocks itself */
+ next;
+ }
+ ip_num = tmp[2] * 2^24 + tmp[3] * 2^16 + tmp[4] * 2 ^8 + tmp[5] * 2^0;
+ i = 32;
+ do {
+ i--;
+ mask = 2^32 - 2^i;
+ } while( (i!=0) && ( and( server_ip_num, mask ) == and( ip_num, mask ) ) );
+ mask = and( 0xFFFFFFFF, lshift( mask, 1 ) );
+ if( (i!=0) && (mask!=0) ) {
+ masked_ip = and( ip_num, mask );
+ for( i=0; i<pairs; i++ ) {
+ if( ( masked_ip == ips[i] ) && ( mask == masks[i] ) ) {
+ next;
+ }
+ }
+ ips[pairs] = masked_ip;
+ masks[pairs] = mask;
+ pairs++;
+ printf( "local = %d.%d.%d.%d/%d.%d.%d.%d\n",
+ and( 0xFF, masked_ip / 2^24 ),
+ and( 0xFF, masked_ip / 2^16 ),
+ and( 0xFF, masked_ip / 2^8 ),
+ and( 0xFF, masked_ip / 2^0 ),
+ and( 0xFF, mask / 2^24 ),
+ and( 0xFF, mask / 2^16 ),
+ and( 0xFF, mask / 2^8 ),
+ and( 0xFF, mask / 2^0 ) );
+ }
+ }
+ ' >"${CT_BUILD_DIR}/tsocks.conf"
+ ( echo "server = ${server_ip}";
echo "server_port = ${CT_PROXY_PORT}";
[ -n "${CT_PROXY_USER}" ] && echo "default_user=${CT_PROXY_USER}";
[ -n "${CT_PROXY_PASS}" ] && echo "default_pass=${CT_PROXY_PASS}";
@@ -246,10 +289,10 @@ case "${CT_PROXY_TYPE}" in
case "${CT_PROXY_TYPE/socks}" in
4|5) proxy_type="${CT_PROXY_TYPE/socks}";;
auto)
- reply=$(inspectsocks "${CT_PROXY_HOST}" "${CT_PROXY_PORT}" 2>&1 || true)
+ reply=$(inspectsocks "${server_ip}" "${CT_PROXY_PORT}" 2>&1 || true)
case "${reply}" in
- *"server is a version 4 socks server"*) proxy_type=4;;
- *"server is a version 5 socks server"*) proxy_type=5;;
+ *"server is a version 4 socks server") proxy_type=4;;
+ *"server is a version 5 socks server") proxy_type=5;;
*) CT_Abort "Unable to determine SOCKS proxy type for '${CT_PROXY_HOST}:${CT_PROXY_PORT}'"
esac
;;