Jiyong Park | 39bcfd9 | 2021-06-26 00:31:25 +0900 | [diff] [blame] | 1 | From 8d6bfc60f38d2b0c2d5f1cca55cef64b6f9b3f42 Mon Sep 17 00:00:00 2001 |
| 2 | From: Jiyong Park <jiyong@google.com> |
| 3 | Date: Sat, 26 Jun 2021 00:31:25 +0900 |
| 4 | Subject: [PATCH] Open /dev/kmsg in Android |
| 5 | |
| 6 | In Android, ordinary processes don't have privilege to open /dev/kmsg. |
| 7 | That has been done by letting init open it (via `file /dev/kmsg w`) and |
| 8 | share the file descriptor with the forked process. The file descriptor |
| 9 | number is passed via an environment variable. |
| 10 | |
| 11 | Implement the procedure. |
| 12 | |
| 13 | Bug: 189805435 |
| 14 | Test: m |
| 15 | Change-Id: I8e39c9bd506fdc9d37a7fb5cd2b14e7d4a5074b7 |
| 16 | --- |
| 17 | src/lib.rs | 22 ++++++++++++++++++++-- |
| 18 | 1 file changed, 20 insertions(+), 2 deletions(-) |
| 19 | |
| 20 | diff --git a/src/lib.rs b/src/lib.rs |
| 21 | index 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 | -- |
| 64 | 2.32.0.93.g670b81a890-goog |
| 65 | |