From 97bd714beb14ed3032b0f34d46be7a89a5b72da9 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Fri, 7 Aug 2015 22:30:09 +0800 Subject: [PATCH] drop abstract domain socket --- src/main/AndroidManifest.xml | 4 +- src/main/jni/badvpn/tun2socks/tun2socks.c | 4 +- src/main/jni/shadowsocks-libev | 2 +- src/main/jni/system.cpp | 3 +- .../com/github/shadowsocks/Shadowsocks.scala | 10 ++--- .../shadowsocks/ShadowsocksVpnService.scala | 7 +-- .../shadowsocks/ShadowsocksVpnThread.scala | 43 +++++++++++-------- 7 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 17ac37ec..d01b463c 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="115" + android:versionName="2.7.7"> diff --git a/src/main/jni/badvpn/tun2socks/tun2socks.c b/src/main/jni/badvpn/tun2socks/tun2socks.c index ea2e0680..7396cc49 100644 --- a/src/main/jni/badvpn/tun2socks/tun2socks.c +++ b/src/main/jni/badvpn/tun2socks/tun2socks.c @@ -502,11 +502,11 @@ int main (int argc, char **argv) goto fail2; } - char *path = "#shadowsocks_tunfd"; + char *path = "/data/data/com.github.shadowsocks/sock_path"; + unlink(path); memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1); - addr.sun_path[0] = 0; if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) { BLog(BLOG_ERROR, "bind() failed: %s (sock = %d)\n", strerror(errno), sock); diff --git a/src/main/jni/shadowsocks-libev b/src/main/jni/shadowsocks-libev index 5d4db4f0..e3ed2223 160000 --- a/src/main/jni/shadowsocks-libev +++ b/src/main/jni/shadowsocks-libev @@ -1 +1 @@ -Subproject commit 5d4db4f093de1256bcb25e1958a76a03102dc77d +Subproject commit e3ed22236012728d0cf7304ef27eb1c96cc063bb diff --git a/src/main/jni/system.cpp b/src/main/jni/system.cpp index 807bab4a..39cfc1e4 100644 --- a/src/main/jni/system.cpp +++ b/src/main/jni/system.cpp @@ -58,8 +58,7 @@ jint Java_com_github_shadowsocks_system_sendfd(JNIEnv *env, jobject thiz, jint t memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, "#shadowsocks_tunfd", sizeof(addr.sun_path)-1); - addr.sun_path[0] = 0; + strncpy(addr.sun_path, "/data/data/com.github.shadowsocks/sock_path", sizeof(addr.sun_path)-1); if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { LOGE("connect() failed: %s (fd = %d)\n", strerror(errno), fd); diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index e0d00a1e..8b514577 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -219,6 +219,11 @@ class Shadowsocks state = bgService.getState // set the listener switchButton.setOnCheckedChangeListener(Shadowsocks.this) + + if (!status.getBoolean(getVersionName, false)) { + status.edit.putBoolean(getVersionName, true).commit() + recovery(); + } } override def onServiceDisconnected(name: ComponentName) { @@ -401,11 +406,6 @@ class Shadowsocks def prepareStartService() { showProgress(R.string.connecting) spawn { - if (!status.getBoolean(getVersionName, false)) { - status.edit.putBoolean(getVersionName, true).commit() - install() - } - if (isVpnEnabled) { val intent = VpnService.prepare(this) if (intent != null) { diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index d444fdc5..6e8b3984 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -104,12 +104,14 @@ class ShadowsocksVpnService extends VpnService with BaseService { } override def onCreate() { + super.onCreate() ConfigUtils.refresh(this) notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) .asInstanceOf[NotificationManager] + } override def onRevoke() { @@ -182,11 +184,6 @@ class ShadowsocksVpnService extends VpnService with BaseService { override def startRunner(c: Config) { - if (vpnThread != null) { - vpnThread.stopThread() - vpnThread = null - } - vpnThread = new ShadowsocksVpnThread(this) vpnThread.start() diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala index 0cf95947..5b819884 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala @@ -45,27 +45,42 @@ import java.util.concurrent.Executors import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress} import android.util.Log -object ShadowsocksVpn { - @volatile var serverSocket: LocalServerSocket = null -} - class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { val TAG = "ShadowsocksVpnService" - val PATH = "shadowsocks_protect" + val PATH = "/data/data/com.github.shadowsocks/protect_path" - var isRunning: Boolean = true + @volatile var isRunning: Boolean = true + @volatile var serverSocket: LocalServerSocket = null + + def closeServerSocket() { + if (serverSocket != null) { + try { + serverSocket.close() + } catch { + case _: Exception => // ignore + } + serverSocket = null + } + } def stopThread() { isRunning = false + closeServerSocket() } override def run(): Unit = { try { - if (ShadowsocksVpn.serverSocket == null) { - ShadowsocksVpn.serverSocket = new LocalServerSocket(PATH) - } + new File(PATH).delete() + } catch { + case _: Exception => // ignore + } + + try { + val localSocket = new LocalSocket + localSocket.bind(new LocalSocketAddress(PATH, LocalSocketAddress.Namespace.FILESYSTEM)) + serverSocket = new LocalServerSocket(localSocket.getFileDescriptor) } catch { case e: IOException => Log.e(TAG, "unable to bind", e) @@ -76,7 +91,7 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { while (isRunning) { try { - val socket = ShadowsocksVpn.serverSocket.accept() + val socket = serverSocket.accept() pool.execute(new Runnable { override def run() { @@ -123,14 +138,6 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { } catch { case e: IOException => { Log.e(TAG, "Error when accept socket", e) - if (ShadowsocksVpn.serverSocket != null) { - try { - ShadowsocksVpn.serverSocket.close() - } catch { - case _: Exception => // ignore - } - ShadowsocksVpn.serverSocket = null - } return } }