Commit 7c31f5e5 authored by Max Lv's avatar Max Lv

refine IPC handling

parent 809f4c13
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks" package="com.github.shadowsocks"
android:versionCode="108" android:versionCode="109"
android:versionName="2.7.0"> android:versionName="2.7.1">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
......
...@@ -276,20 +276,21 @@ include $(BUILD_EXECUTABLE) ...@@ -276,20 +276,21 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS) include $(CLEAR_VARS)
SHADOWSOCKS_SOURCES := tunnel.c cache.c udprelay.c encrypt.c utils.c netutils.c json.c jconf.c SHADOWSOCKS_SOURCES := tunnel.c cache.c udprelay.c encrypt.c utils.c netutils.c json.c jconf.c android.c
LOCAL_MODULE := ss-tunnel LOCAL_MODULE := ss-tunnel
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES)) LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL -DUDPRELAY_TUNNEL \ LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL -DUDPRELAY_TUNNEL \
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \ -DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \
-I$(LOCAL_PATH)/libev/ \ -I$(LOCAL_PATH)/libev \
-I$(LOCAL_PATH)/libancillary \
-I$(LOCAL_PATH)/shadowsocks-libev/libudns \ -I$(LOCAL_PATH)/shadowsocks-libev/libudns \
-I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \ -I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include \ -I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include \
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include/sodium \ -I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include/sodium \
-I$(LOCAL_PATH)/openssl/include -I$(LOCAL_PATH)/openssl/include
LOCAL_STATIC_LIBRARIES := libev libcrypto libsodium libcork libudns LOCAL_STATIC_LIBRARIES := libev libcrypto libsodium libcork libudns libancillary
LOCAL_LDLIBS := -llog LOCAL_LDLIBS := -llog
......
Subproject commit 680007589c5aaafede801081e46b013b27c93939 Subproject commit 3d2b98016149ddf4c0c6912b16f56f2a56cb658b
...@@ -40,23 +40,33 @@ ...@@ -40,23 +40,33 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.{File, FileDescriptor, IOException} import java.io.{File, FileDescriptor, IOException}
import java.util.concurrent.Executors
import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress} import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress}
import android.util.Log import android.util.Log
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Runnable { class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
val TAG = "ShadowsocksVpnService" val TAG = "ShadowsocksVpnService"
val PATH = "/data/data/com.github.shadowsocks/protect_path" val PATH = "/data/data/com.github.shadowsocks/protect_path"
override def run(): Unit = { var isRunning: Boolean = true
var serverSocket: LocalServerSocket = null
def stopThread() {
isRunning = false
if (serverSocket != null) {
serverSocket.close()
serverSocket = null
}
}
var serverSocket: LocalServerSocket = null override def run(): Unit = {
try { try {
new File(PATH).delete() new File(PATH).delete()
} catch { } catch {
case _ => // ignore case _: Exception => // ignore
} }
try { try {
...@@ -71,42 +81,49 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Runnable { ...@@ -71,42 +81,49 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Runnable {
return return
} }
Log.d(TAG, "start to accept connections") val pool = Executors.newFixedThreadPool(4)
while (true) { while (isRunning) {
try { try {
val socket = serverSocket.accept() val socket = serverSocket.accept()
val input = socket.getInputStream pool.execute(new Runnable {
val output = socket.getOutputStream override def run(){
try {
val input = socket.getInputStream
val output = socket.getOutputStream
input.read() input.read()
Log.d(TAG, "test") val fds = socket.getAncillaryFileDescriptors
val fds = socket.getAncillaryFileDescriptors if (fds.length > 0) {
var ret = false
if (fds.length > 0) { val getInt = classOf[FileDescriptor].getDeclaredMethod("getInt$")
var ret = false val fd = getInt.invoke(fds(0)).asInstanceOf[Int]
ret = vpnService.protect(fd)
val getInt = classOf[FileDescriptor].getDeclaredMethod("getInt$") if (ret) {
val fd = getInt.invoke(fds(0)).asInstanceOf[Int] output.write(0)
ret = vpnService.protect(fd) } else {
output.write(1)
}
if (ret) { input.close()
socket.setFileDescriptorsForSend(fds) output.close()
output.write(0) }
}
input.close() socket.close()
output.close() } catch {
} case e: Exception =>
Log.e(TAG, "Error when protect socket", e)
}
}})
} catch { } catch {
case e: Exception => case e: IOException => Log.e(TAG, "Error when accept socket", e)
Log.e(TAG, "Error when protect socket", e)
} }
} }
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment