Snap for 7529902 from 18acd4fc9e7ee4171353b297103c6f9ffe273b42 to sdk-release

Change-Id: Ie126d2cb6a929738fa19c76955fe3a5f5c43d3b6
diff --git a/Android.bp b/Android.bp
index bb2a55a..6dc214d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3,6 +3,23 @@
 
 
 
+package {
+    default_applicable_licenses: ["external_rust_crates_kernlog_license"],
+}
+
+// Added automatically by a large-scale-change
+// See: http://go/android-license-faq
+license {
+    name: "external_rust_crates_kernlog_license",
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-MIT",
+    ],
+    license_text: [
+        "LICENSE",
+    ],
+}
+
 rust_library {
     name: "libkernlog",
     // has rustc warnings
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
+
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 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 @@
         }
     }
 
+    #[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
         })
     }