Compare commits

..
3 Commits
Author SHA1 Message Date
Max Lv 97bd714beb drop abstract domain socket 2015-08-07 22:30:09 +08:00
Max Lv 9a841e901c refine the exception handling 2015-08-05 12:22:49 +08:00
Max Lv de7e516204 fix MTU 2015-08-05 10:22:45 +08:00
7 changed files with 49 additions and 35 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks"
android:versionCode="113"
android:versionName="2.7.5">
android:versionCode="115"
android:versionName="2.7.7">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+2 -2
View File
@@ -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);
+1 -2
View File
@@ -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);
@@ -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) {
@@ -63,7 +63,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication]
val TAG = "ShadowsocksVpnService"
val VPN_MTU = 1400
val VPN_MTU = 1500
val PRIVATE_VLAN = "26.26.26.%s"
var conn: ParcelFileDescriptor = null
var notificationManager: NotificationManager = null
@@ -103,12 +103,8 @@ class ShadowsocksVpnService extends VpnService with BaseService {
null
}
override def onDestroy() {
super.onDestroy()
if (vpnThread != null) vpnThread.stopThread()
}
override def onCreate() {
super.onCreate()
ConfigUtils.refresh(this)
@@ -116,8 +112,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
.asInstanceOf[NotificationManager]
vpnThread = new ShadowsocksVpnThread(this)
vpnThread.start()
}
override def onRevoke() {
@@ -126,6 +120,11 @@ class ShadowsocksVpnService extends VpnService with BaseService {
override def stopRunner() {
if (vpnThread != null) {
vpnThread.stopThread()
vpnThread = null
}
// channge the state
changeState(State.STOPPING)
@@ -185,6 +184,9 @@ class ShadowsocksVpnService extends VpnService with BaseService {
override def startRunner(c: Config) {
vpnThread = new ShadowsocksVpnThread(this)
vpnThread.start()
config = c
// ensure the VPNService is prepared
@@ -48,38 +48,48 @@ import android.util.Log
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
var serverSocket: LocalServerSocket = null
@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
if (serverSocket != null) {
serverSocket.close()
serverSocket = null
}
closeServerSocket()
}
override def run(): Unit = {
try {
if (serverSocket != null) {
serverSocket.close()
serverSocket = null
}
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)
vpnService.stopBackgroundService()
return
}
val pool = Executors.newFixedThreadPool(4)
while (isRunning) {
try {
val socket = serverSocket.accept()
@@ -126,7 +136,10 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
}})
} catch {
case e: IOException => Log.e(TAG, "Error when accept socket", e)
case e: IOException => {
Log.e(TAG, "Error when accept socket", e)
return
}
}
}
}