in core/src/main/java/com/github/shadowsocks/bg/VpnService.kt [74:95]
override fun acceptInternal(socket: LocalSocket) {
if (socket.inputStream.read() == -1) return
val success = socket.ancillaryFileDescriptors!!.single()!!.use { fd ->
underlyingNetwork.let { network ->
if (network != null) try {
network.bindSocket(fd)
return@let true
} catch (e: IOException) {
when ((e.cause as? ErrnoException)?.errno) {
// also suppress ENONET (Machine is not on the network)
OsConstants.EPERM, OsConstants.EACCES, 64 -> Timber.d(e)
else -> Timber.w(e)
}
return@let false
}
protect(fd.int)
}
}
try {
socket.outputStream.write(if (success) 0 else 1)
} catch (_: IOException) { } // ignore connection early close
}