diff --git a/mobile/src/main/java/com/github/shadowsocks/bg/LocalSocketListener.kt b/mobile/src/main/java/com/github/shadowsocks/bg/LocalSocketListener.kt index d64c2d33..7ebf04a6 100644 --- a/mobile/src/main/java/com/github/shadowsocks/bg/LocalSocketListener.kt +++ b/mobile/src/main/java/com/github/shadowsocks/bg/LocalSocketListener.kt @@ -42,24 +42,28 @@ abstract class LocalSocketListener(protected val tag: String) : Thread() { */ protected abstract fun accept(socket: LocalSocket) override fun run() { - while (!socketFile.delete()) Thread.sleep(100) try { - val localSocket = LocalSocket() - localSocket.bind(LocalSocketAddress(socketFile.absolutePath, LocalSocketAddress.Namespace.FILESYSTEM)) - serverSocket.set(LocalServerSocket(localSocket.fileDescriptor)) - } catch (e: IOException) { - Log.e(tag, "unable to bind", e) - return - } - while (true) { - val serverSocket = serverSocket.get() ?: return + while (!socketFile.delete()) Thread.sleep(100) try { - serverSocket.accept() + val localSocket = LocalSocket() + localSocket.bind(LocalSocketAddress(socketFile.absolutePath, LocalSocketAddress.Namespace.FILESYSTEM)) + serverSocket.set(LocalServerSocket(localSocket.fileDescriptor)) } catch (e: IOException) { - Log.e(tag, "Error when accept socket", e) - app.track(e) - null - }?.use(this::accept) + Log.e(tag, "unable to bind", e) + return + } + while (true) { + val serverSocket = serverSocket.get() ?: return + try { + serverSocket.accept() + } catch (e: IOException) { + Log.e(tag, "Error when accept socket", e) + app.track(e) + null + }?.use(this::accept) + } + } finally { + stopThread() } } @@ -67,6 +71,7 @@ abstract class LocalSocketListener(protected val tag: String) : Thread() { val old = serverSocket.getAndSet(null) ?: return try { old.close() + if (!socketFile.delete()) socketFile.deleteOnExit() } catch (_: Exception) { } // ignore } }