Commit 5b1432e4 authored by Max Lv's avatar Max Lv

Handle stdout/stderr of GuardedProcess properly

parent 7ca4e4ec
Subproject commit e613b5ad610cd1f51dd40fe378daaba224df5009 Subproject commit c4054b07a6b493f48d4e9c35c6c1a4a047462325
Subproject commit b51fd4f65cfe2d9765a6599c9ea509c767b652bf Subproject commit 7a769627959ab2e27f0eadafcc89aed14d364ffd
...@@ -39,18 +39,33 @@ ...@@ -39,18 +39,33 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.{IOException, InputStream, OutputStream} import java.io._
import java.lang.System.currentTimeMillis import java.lang.System.currentTimeMillis
import java.util.concurrent.Semaphore import java.util.concurrent.Semaphore
import android.util.Log import android.util.Log
import scala.collection.JavaConversions._ 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 * @author ayanamist@gmail.com
*/ */
class GuardedProcess(cmd: Seq[String]) extends Process { class GuardedProcess(cmd: Seq[String]) {
private val TAG = classOf[GuardedProcess].getSimpleName private val TAG = classOf[GuardedProcess].getSimpleName
@volatile private var guardThread: Thread = _ @volatile private var guardThread: Thread = _
...@@ -72,6 +87,9 @@ class GuardedProcess(cmd: Seq[String]) extends Process { ...@@ -72,6 +87,9 @@ class GuardedProcess(cmd: Seq[String]) extends Process {
process = new ProcessBuilder(cmd).redirectErrorStream(true).start process = new ProcessBuilder(cmd).redirectErrorStream(true).start
val is = process.getInputStream
new StreamLogger(is, TAG).start
if (callback == null) callback = onRestartCallback else callback() if (callback == null) callback = onRestartCallback else callback()
semaphore.release semaphore.release
...@@ -118,11 +136,6 @@ class GuardedProcess(cmd: Seq[String]) extends Process { ...@@ -118,11 +136,6 @@ class GuardedProcess(cmd: Seq[String]) extends Process {
process.destroy() 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]) @throws(classOf[InterruptedException])
def waitFor = { def waitFor = {
guardThread.join() guardThread.join()
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.File import java.io.File
import java.lang.Process
import java.net.{Inet6Address, InetAddress} import java.net.{Inet6Address, InetAddress}
import java.util.Locale import java.util.Locale
...@@ -65,10 +64,10 @@ class ShadowsocksNatService extends BaseService { ...@@ -65,10 +64,10 @@ class ShadowsocksNatService extends BaseService {
private var notification: ShadowsocksNotification = _ private var notification: ShadowsocksNotification = _
val myUid = android.os.Process.myUid() val myUid = android.os.Process.myUid()
var sslocalProcess: Process = _ var sslocalProcess: GuardedProcess = _
var sstunnelProcess: Process = _ var sstunnelProcess: GuardedProcess = _
var redsocksProcess: Process = _ var redsocksProcess: GuardedProcess = _
var pdnsdProcess: Process = _ var pdnsdProcess: GuardedProcess = _
var su: Shell.Interactive = _ var su: Shell.Interactive = _
def startShadowsocksDaemon() { def startShadowsocksDaemon() {
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.File import java.io.File
import java.lang.Process
import java.util.Locale import java.util.Locale
import android.content._ import android.content._
...@@ -63,10 +62,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -63,10 +62,10 @@ class ShadowsocksVpnService extends VpnService with BaseService {
var vpnThread: ShadowsocksVpnThread = _ var vpnThread: ShadowsocksVpnThread = _
private var notification: ShadowsocksNotification = _ private var notification: ShadowsocksNotification = _
var sslocalProcess: Process = _ var sslocalProcess: GuardedProcess = _
var sstunnelProcess: Process = _ var sstunnelProcess: GuardedProcess = _
var pdnsdProcess: Process = _ var pdnsdProcess: GuardedProcess = _
var tun2socksProcess: Process = _ var tun2socksProcess: GuardedProcess = _
override def onBind(intent: Intent): IBinder = { override def onBind(intent: Intent): IBinder = {
val action = intent.getAction val action = intent.getAction
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment