diff options
author | Jiyong Park <jiyong@google.com> | 2021-06-26 01:57:32 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-06-26 01:57:32 +0000 |
commit | 25ee619c5de33e29ac21a0ebc91cfcf7cefd401d (patch) | |
tree | fceed0bba090b63f5735ecf91ac474c30841d9ea | |
parent | 77a9705cbac3e62813730fa79d0283eea407af84 (diff) | |
parent | b4a3b70f23a4784281ef86b5668ee5fcf6ab97b2 (diff) | |
download | kernlog-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.patch | 65 | ||||
-rw-r--r-- | src/lib.rs | 22 |
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 + @@ -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 }) } |