From 5b1432e4e8eeb473e388eabbe4009d28b9a4f478 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 28 Aug 2016 17:42:19 +0800 Subject: [PATCH] Handle stdout/stderr of GuardedProcess properly --- kcptun/kcptun | 2 +- src/main/jni/pdnsd | 2 +- .../github/shadowsocks/GuardedProcess.scala | 27 ++++++++++++++----- .../shadowsocks/ShadowsocksNatService.scala | 9 +++---- .../shadowsocks/ShadowsocksVpnService.scala | 9 +++---- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/kcptun/kcptun b/kcptun/kcptun index e613b5ad..c4054b07 160000 --- a/kcptun/kcptun +++ b/kcptun/kcptun @@ -1 +1 @@ -Subproject commit e613b5ad610cd1f51dd40fe378daaba224df5009 +Subproject commit c4054b07a6b493f48d4e9c35c6c1a4a047462325 diff --git a/src/main/jni/pdnsd b/src/main/jni/pdnsd index b51fd4f6..7a769627 160000 --- a/src/main/jni/pdnsd +++ b/src/main/jni/pdnsd @@ -1 +1 @@ -Subproject commit b51fd4f65cfe2d9765a6599c9ea509c767b652bf +Subproject commit 7a769627959ab2e27f0eadafcc89aed14d364ffd diff --git a/src/main/scala/com/github/shadowsocks/GuardedProcess.scala b/src/main/scala/com/github/shadowsocks/GuardedProcess.scala index c3eec7dc..7a4c7ef1 100644 --- a/src/main/scala/com/github/shadowsocks/GuardedProcess.scala +++ b/src/main/scala/com/github/shadowsocks/GuardedProcess.scala @@ -39,18 +39,33 @@ package com.github.shadowsocks -import java.io.{IOException, InputStream, OutputStream} +import java.io._ import java.lang.System.currentTimeMillis import java.util.concurrent.Semaphore import android.util.Log import scala.collection.JavaConversions._ +import scala.collection.immutable.Stream +import scala.util.control.Exception._ + +class StreamLogger(is: InputStream, tag: String) extends Thread { + + def withCloseable[T <: Closeable, R](t: T)(f: T => R): R = { + allCatch.andFinally{t.close} apply { f(t) } + } + + override def run() { + withCloseable(new BufferedReader(new InputStreamReader(is))) { + br => Stream.continually(br.readLine()).takeWhile(_ != null).foreach(Log.i(tag, _)) + } + } +} /** * @author ayanamist@gmail.com */ -class GuardedProcess(cmd: Seq[String]) extends Process { +class GuardedProcess(cmd: Seq[String]) { private val TAG = classOf[GuardedProcess].getSimpleName @volatile private var guardThread: Thread = _ @@ -72,6 +87,9 @@ class GuardedProcess(cmd: Seq[String]) extends Process { process = new ProcessBuilder(cmd).redirectErrorStream(true).start + val is = process.getInputStream + new StreamLogger(is, TAG).start + if (callback == null) callback = onRestartCallback else callback() semaphore.release @@ -118,11 +136,6 @@ class GuardedProcess(cmd: Seq[String]) extends Process { process.destroy() } - def exitValue: Int = throw new UnsupportedOperationException - def getErrorStream: InputStream = throw new UnsupportedOperationException - def getInputStream: InputStream = throw new UnsupportedOperationException - def getOutputStream: OutputStream = throw new UnsupportedOperationException - @throws(classOf[InterruptedException]) def waitFor = { guardThread.join() diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index b2d1b5c8..0a34cb37 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -40,7 +40,6 @@ package com.github.shadowsocks import java.io.File -import java.lang.Process import java.net.{Inet6Address, InetAddress} import java.util.Locale @@ -65,10 +64,10 @@ class ShadowsocksNatService extends BaseService { private var notification: ShadowsocksNotification = _ val myUid = android.os.Process.myUid() - var sslocalProcess: Process = _ - var sstunnelProcess: Process = _ - var redsocksProcess: Process = _ - var pdnsdProcess: Process = _ + var sslocalProcess: GuardedProcess = _ + var sstunnelProcess: GuardedProcess = _ + var redsocksProcess: GuardedProcess = _ + var pdnsdProcess: GuardedProcess = _ var su: Shell.Interactive = _ def startShadowsocksDaemon() { diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 65765bd9..eabd0ca7 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -40,7 +40,6 @@ package com.github.shadowsocks import java.io.File -import java.lang.Process import java.util.Locale import android.content._ @@ -63,10 +62,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { var vpnThread: ShadowsocksVpnThread = _ private var notification: ShadowsocksNotification = _ - var sslocalProcess: Process = _ - var sstunnelProcess: Process = _ - var pdnsdProcess: Process = _ - var tun2socksProcess: Process = _ + var sslocalProcess: GuardedProcess = _ + var sstunnelProcess: GuardedProcess = _ + var pdnsdProcess: GuardedProcess = _ + var tun2socksProcess: GuardedProcess = _ override def onBind(intent: Intent): IBinder = { val action = intent.getAction