1From 8d6bfc60f38d2b0c2d5f1cca55cef64b6f9b3f42 Mon Sep 17 00:00:00 2001 2From: Jiyong Park <jiyong@google.com> 3Date: Sat, 26 Jun 2021 00:31:25 +0900 4Subject: [PATCH] Open /dev/kmsg in Android 5 6In Android, ordinary processes don't have privilege to open /dev/kmsg. 7That has been done by letting init open it (via `file /dev/kmsg w`) and 8share the file descriptor with the forked process. The file descriptor 9number is passed via an environment variable. 10 11Implement the procedure. 12 13Bug: 189805435 14Test: m 15Change-Id: I8e39c9bd506fdc9d37a7fb5cd2b14e7d4a5074b7 16--- 17 src/lib.rs | 22 ++++++++++++++++++++-- 18 1 file changed, 20 insertions(+), 2 deletions(-) 19 20diff --git a/src/lib.rs b/src/lib.rs 21index 157c43d..d87df22 100644 22--- a/src/lib.rs 23+++ b/src/lib.rs 24@@ -46,7 +46,7 @@ extern crate log; 25 extern crate libc; 26 27 use std::fs::{OpenOptions, File}; 28-use std::io::{Write, self}; 29+use std::io::{Error, ErrorKind, Write, self}; 30 use std::sync::Mutex; 31 use std::env; 32 33@@ -75,10 +75,28 @@ impl KernelLog { 34 } 35 } 36 37+ #[cfg(not(target_os = "android"))] 38+ fn open_kmsg() -> io::Result<File> { 39+ OpenOptions::new().write(true).open("/dev/kmsg") 40+ } 41+ 42+ #[cfg(target_os = "android")] 43+ fn open_kmsg() -> io::Result<File> { 44+ // In Android, a process normally doesn't have the permission to open /dev/kmsg. Instead it 45+ // is opened by init (via `file /dev/kmsg w` in the rc file) and the file descriptor is 46+ // shared when executing the process. The file descriptor number is passed via an 47+ // environment variable "ANDROID_FILE_<file_name>" where <file_name> is the path to the 48+ // file where non alpha-numeric characters are replaced with '_'. 49+ match env::var("ANDROID_FILE__dev_kmsg") { 50+ Ok(val) => OpenOptions::new().write(true).open(format!("/proc/self/fd/{}", val)), 51+ Err(e) => Err(Error::new(ErrorKind::Other, "ANDROID_FILE__dev_kmsg doesn't exist")), 52+ } 53+ } 54+ 55 /// Create new kernel logger with error level filter 56 pub fn with_level(filter: LevelFilter) -> io::Result<KernelLog> { 57 Ok(KernelLog { 58- kmsg: Mutex::new(OpenOptions::new().write(true).open("/dev/kmsg")?), 59+ kmsg: Mutex::new(Self::open_kmsg()?), 60 maxlevel: filter 61 }) 62 } 63-- 642.32.0.93.g670b81a890-goog 65 66