66 lines
2.3 KiB
Diff
66 lines
2.3 KiB
Diff
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
|
|
|