Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97bd714beb | ||
|
|
9a841e901c |
@@ -1,7 +1,7 @@
|
|||||||
<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="114"
|
android:versionCode="115"
|
||||||
android:versionName="2.7.6">
|
android:versionName="2.7.7">
|
||||||
|
|
||||||
<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"/>
|
||||||
|
|||||||
@@ -502,11 +502,11 @@ int main (int argc, char **argv)
|
|||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *path = "#shadowsocks_tunfd";
|
char *path = "/data/data/com.github.shadowsocks/sock_path";
|
||||||
|
unlink(path);
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
addr.sun_family = AF_UNIX;
|
addr.sun_family = AF_UNIX;
|
||||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
|
strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
|
||||||
addr.sun_path[0] = 0;
|
|
||||||
|
|
||||||
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||||
BLog(BLOG_ERROR, "bind() failed: %s (sock = %d)\n", strerror(errno), sock);
|
BLog(BLOG_ERROR, "bind() failed: %s (sock = %d)\n", strerror(errno), sock);
|
||||||
|
|||||||
Submodule src/main/jni/shadowsocks-libev updated: 5d4db4f093...e3ed222360
@@ -58,8 +58,7 @@ jint Java_com_github_shadowsocks_system_sendfd(JNIEnv *env, jobject thiz, jint t
|
|||||||
|
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
addr.sun_family = AF_UNIX;
|
addr.sun_family = AF_UNIX;
|
||||||
strncpy(addr.sun_path, "#shadowsocks_tunfd", sizeof(addr.sun_path)-1);
|
strncpy(addr.sun_path, "/data/data/com.github.shadowsocks/sock_path", sizeof(addr.sun_path)-1);
|
||||||
addr.sun_path[0] = 0;
|
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||||
LOGE("connect() failed: %s (fd = %d)\n", strerror(errno), fd);
|
LOGE("connect() failed: %s (fd = %d)\n", strerror(errno), fd);
|
||||||
|
|||||||
@@ -219,6 +219,11 @@ class Shadowsocks
|
|||||||
state = bgService.getState
|
state = bgService.getState
|
||||||
// set the listener
|
// set the listener
|
||||||
switchButton.setOnCheckedChangeListener(Shadowsocks.this)
|
switchButton.setOnCheckedChangeListener(Shadowsocks.this)
|
||||||
|
|
||||||
|
if (!status.getBoolean(getVersionName, false)) {
|
||||||
|
status.edit.putBoolean(getVersionName, true).commit()
|
||||||
|
recovery();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def onServiceDisconnected(name: ComponentName) {
|
override def onServiceDisconnected(name: ComponentName) {
|
||||||
@@ -401,11 +406,6 @@ class Shadowsocks
|
|||||||
def prepareStartService() {
|
def prepareStartService() {
|
||||||
showProgress(R.string.connecting)
|
showProgress(R.string.connecting)
|
||||||
spawn {
|
spawn {
|
||||||
if (!status.getBoolean(getVersionName, false)) {
|
|
||||||
status.edit.putBoolean(getVersionName, true).commit()
|
|
||||||
install()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isVpnEnabled) {
|
if (isVpnEnabled) {
|
||||||
val intent = VpnService.prepare(this)
|
val intent = VpnService.prepare(this)
|
||||||
if (intent != null) {
|
if (intent != null) {
|
||||||
|
|||||||
@@ -104,12 +104,14 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def onCreate() {
|
override def onCreate() {
|
||||||
|
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
ConfigUtils.refresh(this)
|
ConfigUtils.refresh(this)
|
||||||
|
|
||||||
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
|
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
|
||||||
.asInstanceOf[NotificationManager]
|
.asInstanceOf[NotificationManager]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def onRevoke() {
|
override def onRevoke() {
|
||||||
@@ -182,11 +184,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
override def startRunner(c: Config) {
|
override def startRunner(c: Config) {
|
||||||
|
|
||||||
if (vpnThread != null) {
|
|
||||||
vpnThread.stopThread()
|
|
||||||
vpnThread = null
|
|
||||||
}
|
|
||||||
|
|
||||||
vpnThread = new ShadowsocksVpnThread(this)
|
vpnThread = new ShadowsocksVpnThread(this)
|
||||||
vpnThread.start()
|
vpnThread.start()
|
||||||
|
|
||||||
|
|||||||
@@ -45,27 +45,42 @@ 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
|
||||||
|
|
||||||
object ShadowsocksVpn {
|
|
||||||
@volatile var serverSocket: LocalServerSocket = null
|
|
||||||
}
|
|
||||||
|
|
||||||
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
||||||
|
|
||||||
val TAG = "ShadowsocksVpnService"
|
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() {
|
def stopThread() {
|
||||||
isRunning = false
|
isRunning = false
|
||||||
|
closeServerSocket()
|
||||||
}
|
}
|
||||||
|
|
||||||
override def run(): Unit = {
|
override def run(): Unit = {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (ShadowsocksVpn.serverSocket == null) {
|
new File(PATH).delete()
|
||||||
ShadowsocksVpn.serverSocket = new LocalServerSocket(PATH)
|
} catch {
|
||||||
}
|
case _: Exception => // ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
val localSocket = new LocalSocket
|
||||||
|
localSocket.bind(new LocalSocketAddress(PATH, LocalSocketAddress.Namespace.FILESYSTEM))
|
||||||
|
serverSocket = new LocalServerSocket(localSocket.getFileDescriptor)
|
||||||
} catch {
|
} catch {
|
||||||
case e: IOException =>
|
case e: IOException =>
|
||||||
Log.e(TAG, "unable to bind", e)
|
Log.e(TAG, "unable to bind", e)
|
||||||
@@ -76,7 +91,7 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
|||||||
|
|
||||||
while (isRunning) {
|
while (isRunning) {
|
||||||
try {
|
try {
|
||||||
val socket = ShadowsocksVpn.serverSocket.accept()
|
val socket = serverSocket.accept()
|
||||||
|
|
||||||
pool.execute(new Runnable {
|
pool.execute(new Runnable {
|
||||||
override def run() {
|
override def run() {
|
||||||
|
|||||||
Reference in New Issue
Block a user