From 8d6bfc60f38d2b0c2d5f1cca55cef64b6f9b3f42 Mon Sep 17 00:00:00 2001 From: Jiyong Park 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 { + OpenOptions::new().write(true).open("/dev/kmsg") + } + + #[cfg(target_os = "android")] + fn open_kmsg() -> io::Result { + // 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_" where 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 { 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