aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiyong Park <jiyong@google.com>2021-06-26 01:57:32 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-06-26 01:57:32 +0000
commit25ee619c5de33e29ac21a0ebc91cfcf7cefd401d (patch)
treefceed0bba090b63f5735ecf91ac474c30841d9ea
parent77a9705cbac3e62813730fa79d0283eea407af84 (diff)
parentb4a3b70f23a4784281ef86b5668ee5fcf6ab97b2 (diff)
downloadkernlog-25ee619c5de33e29ac21a0ebc91cfcf7cefd401d.tar.gz
Open /dev/kmsg in Android am: 39bcfd940e am: 07eb49bf51 am: b4a3b70f23
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/kernlog/+/1747976 Change-Id: Ifcd8f06cc2b2364464c8fd75a879073ec835f30d
-rw-r--r--patches/0001-Open-dev-kmsg-in-Android.patch65
-rw-r--r--src/lib.rs22
2 files changed, 85 insertions, 2 deletions
diff --git a/patches/0001-Open-dev-kmsg-in-Android.patch b/patches/0001-Open-dev-kmsg-in-Android.patch
new file mode 100644
index 0000000..ca09366
--- /dev/null
+++ b/patches/0001-Open-dev-kmsg-in-Android.patch
@@ -0,0 +1,65 @@
+From 8d6bfc60f38d2b0c2d5f1cca55cef64b6f9b3f42 Mon Sep 17 00:00:00 2001
+From: Jiyong Park <jiyong@google.com>
+Date: Sat, 26 Jun 2021 00:31:25 +0900
+Subject: [PATCH] Open /dev/kmsg in Android
+
+In Android, ordinary processes don't have privilege to open /dev/kmsg.
+That has been done by letting init open it (via `file /dev/kmsg w`) and
+share the file descriptor with the forked process. The file descriptor
+number is passed via an environment variable.
+
+Implement the procedure.
+
+Bug: 189805435
+Test: m
+Change-Id: I8e39c9bd506fdc9d37a7fb5cd2b14e7d4a5074b7
+---
+ src/lib.rs | 22 ++++++++++++++++++++--
+ 1 file changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/src/lib.rs b/src/lib.rs
+index 157c43d..d87df22 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -46,7 +46,7 @@ extern crate log;
+ extern crate libc;
+
+ use std::fs::{OpenOptions, File};
+-use std::io::{Write, self};
++use std::io::{Error, ErrorKind, Write, self};
+ use std::sync::Mutex;
+ use std::env;
+
+@@ -75,10 +75,28 @@ impl KernelLog {
+ }
+ }
+
++ #[cfg(not(target_os = "android"))]
++ fn open_kmsg() -> io::Result<File> {
++ OpenOptions::new().write(true).open("/dev/kmsg")
++ }
++
++ #[cfg(target_os = "android")]
++ fn open_kmsg() -> io::Result<File> {
++ // In Android, a process normally doesn't have the permission to open /dev/kmsg. Instead it
++ // is opened by init (via `file /dev/kmsg w` in the rc file) and the file descriptor is
++ // shared when executing the process. The file descriptor number is passed via an
++ // environment variable "ANDROID_FILE_<file_name>" where <file_name> is the path to the
++ // file where non alpha-numeric characters are replaced with '_'.
++ match env::var("ANDROID_FILE__dev_kmsg") {
++ Ok(val) => OpenOptions::new().write(true).open(format!("/proc/self/fd/{}", val)),
++ Err(e) => Err(Error::new(ErrorKind::Other, "ANDROID_FILE__dev_kmsg doesn't exist")),
++ }
++ }
++
+ /// Create new kernel logger with error level filter
+ pub fn with_level(filter: LevelFilter) -> io::Result<KernelLog> {
+ Ok(KernelLog {
+- kmsg: Mutex::new(OpenOptions::new().write(true).open("/dev/kmsg")?),
++ kmsg: Mutex::new(Self::open_kmsg()?),
+ maxlevel: filter
+ })
+ }
+--
+2.32.0.93.g670b81a890-goog
+
diff --git a/src/lib.rs b/src/lib.rs
index 157c43d..d87df22 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -46,7 +46,7 @@ extern crate log;
extern crate libc;
use std::fs::{OpenOptions, File};
-use std::io::{Write, self};
+use std::io::{Error, ErrorKind, Write, self};
use std::sync::Mutex;
use std::env;
@@ -75,10 +75,28 @@ impl KernelLog {
}
}
+ #[cfg(not(target_os = "android"))]
+ fn open_kmsg() -> io::Result<File> {
+ OpenOptions::new().write(true).open("/dev/kmsg")
+ }
+
+ #[cfg(target_os = "android")]
+ fn open_kmsg() -> io::Result<File> {
+ // In Android, a process normally doesn't have the permission to open /dev/kmsg. Instead it
+ // is opened by init (via `file /dev/kmsg w` in the rc file) and the file descriptor is
+ // shared when executing the process. The file descriptor number is passed via an
+ // environment variable "ANDROID_FILE_<file_name>" where <file_name> is the path to the
+ // file where non alpha-numeric characters are replaced with '_'.
+ match env::var("ANDROID_FILE__dev_kmsg") {
+ Ok(val) => OpenOptions::new().write(true).open(format!("/proc/self/fd/{}", val)),
+ Err(e) => Err(Error::new(ErrorKind::Other, "ANDROID_FILE__dev_kmsg doesn't exist")),
+ }
+ }
+
/// Create new kernel logger with error level filter
pub fn with_level(filter: LevelFilter) -> io::Result<KernelLog> {
Ok(KernelLog {
- kmsg: Mutex::new(OpenOptions::new().write(true).open("/dev/kmsg")?),
+ kmsg: Mutex::new(Self::open_kmsg()?),
maxlevel: filter
})
}