Merge "Add backup/reserved files in new permission subsystem"
This commit is contained in:
committed by
Android (Google) Code Review
commit
9e88c44105
@@ -30,9 +30,9 @@ import com.android.modules.utils.BinaryXmlSerializer
|
||||
import com.android.server.permission.access.collection.* // ktlint-disable no-wildcard-imports
|
||||
import com.android.server.permission.access.util.PermissionApex
|
||||
import com.android.server.permission.access.util.parseBinaryXml
|
||||
import com.android.server.permission.access.util.read
|
||||
import com.android.server.permission.access.util.readWithReserveCopy
|
||||
import com.android.server.permission.access.util.serializeBinaryXml
|
||||
import com.android.server.permission.access.util.writeInlined
|
||||
import com.android.server.permission.access.util.writeWithReserveCopy
|
||||
import java.io.File
|
||||
import java.io.FileNotFoundException
|
||||
|
||||
@@ -100,7 +100,7 @@ class AccessPersistence(
|
||||
*/
|
||||
private inline fun File.parse(block: BinaryXmlPullParser.() -> Unit): Boolean =
|
||||
try {
|
||||
AtomicFile(this).read { it.parseBinaryXml(block) }
|
||||
AtomicFile(this).readWithReserveCopy { it.parseBinaryXml(block) }
|
||||
true
|
||||
} catch (e: FileNotFoundException) {
|
||||
Log.i(LOG_TAG, "$this not found")
|
||||
@@ -179,7 +179,7 @@ class AccessPersistence(
|
||||
|
||||
private inline fun File.serialize(block: BinaryXmlSerializer.() -> Unit) {
|
||||
try {
|
||||
AtomicFile(this).writeInlined { it.serializeBinaryXml(block) }
|
||||
AtomicFile(this).writeWithReserveCopy { it.serializeBinaryXml(block) }
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "Failed to serialize $this", e)
|
||||
}
|
||||
|
||||
@@ -16,17 +16,54 @@
|
||||
|
||||
package com.android.server.permission.access.util
|
||||
|
||||
import android.os.FileUtils
|
||||
import android.util.AtomicFile
|
||||
import android.util.Log
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileNotFoundException
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
|
||||
/**
|
||||
* Read from an [AtomicFile] and close everything safely when done.
|
||||
* Read from an [AtomicFile], fallback to reserve file to read the data.
|
||||
*/
|
||||
@Throws(Exception::class)
|
||||
inline fun AtomicFile.readWithReserveCopy(block: (FileInputStream) -> Unit) {
|
||||
try {
|
||||
openRead().use(block)
|
||||
} catch (e: FileNotFoundException) {
|
||||
throw e
|
||||
} catch (e: Exception) {
|
||||
Log.wtf("AccessPersistence", "Failed to read $this", e)
|
||||
val reserveFile = File(baseFile.parentFile, baseFile.name + ".reservecopy")
|
||||
try {
|
||||
AtomicFile(reserveFile).openRead().use(block)
|
||||
} catch (e2: Exception) {
|
||||
Log.e("AccessPersistence", "Failed to read $reserveFile", e2)
|
||||
throw e
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write to actual file and reserve file.
|
||||
*/
|
||||
@Throws(IOException::class)
|
||||
inline fun AtomicFile.read(block: (FileInputStream) -> Unit) {
|
||||
openRead().use(block)
|
||||
inline fun AtomicFile.writeWithReserveCopy(block: (FileOutputStream) -> Unit) {
|
||||
val reserveFile = File(baseFile.parentFile, baseFile.name + ".reservecopy")
|
||||
reserveFile.delete()
|
||||
writeInlined(block)
|
||||
try {
|
||||
FileInputStream(baseFile).use { inputStream ->
|
||||
FileOutputStream(reserveFile).use { outputStream ->
|
||||
FileUtils.copy(inputStream, outputStream)
|
||||
outputStream.fd.sync()
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("AccessPersistence", "Failed to write $reserveFile", e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user