Add logd.ready

logd.ready is a system property that logd sets when it is ready to
serve incoming socket requests for reading and writing logs. Clients of
logd (e.g. logcat) can use this to synchronize with logd, otherwise they
may experience a crash due to the refused socket connection to logd when
they are started before logd is ready.

Bug: 206826522
Test: run microdroid. see logcat logs are shown immediately
Change-Id: Iee13485b0f4c2beda9bc8434f514c4e32e119492
diff --git a/microdroid/system/private/logcat.te b/microdroid/system/private/logcat.te
index be6e42a..a26cff3 100644
--- a/microdroid/system/private/logcat.te
+++ b/microdroid/system/private/logcat.te
@@ -12,4 +12,8 @@
 # logcat can get logs from logd
 read_logd(logcat)
 
+# Allow logcat to read ro.logd.ready so that it waits until logd is ready to
+# accept commands
+get_prop(logcat, logd_prop)
+
 allow logcat self:global_capability_class_set { sys_nice };
diff --git a/microdroid/system/private/property_contexts b/microdroid/system/private/property_contexts
index 9384a75..abd14fd 100644
--- a/microdroid/system/private/property_contexts
+++ b/microdroid/system/private/property_contexts
@@ -38,6 +38,7 @@
 service.adb.root u:object_r:shell_prop:s0 exact bool
 
 ro.logd.kernel u:object_r:logd_prop:s0 exact bool
+logd.ready     u:object_r:logd_prop:s0 exact bool
 
 ro.config.low_ram u:object_r:build_prop:s0 exact bool
 
diff --git a/private/logpersist.te b/private/logpersist.te
index ab2c9c6..e151810 100644
--- a/private/logpersist.te
+++ b/private/logpersist.te
@@ -15,6 +15,7 @@
 
   control_logd(logpersist)
   unix_socket_connect(logpersist, logdr, logd)
+  get_prop(logpersist, logd_prop)
   read_runtime_log_tags(logpersist)
 
 ')
diff --git a/public/shell.te b/public/shell.te
index 7751d63..60e3521 100644
--- a/public/shell.te
+++ b/public/shell.te
@@ -8,6 +8,7 @@
 # logcat
 read_logd(shell)
 control_logd(shell)
+get_prop(shell, logd_prop)
 # logcat -L (directly, or via dumpstate)
 allow shell pstorefs:dir search;
 allow shell pstorefs:file r_file_perms;