Merge "minadbd: Support `adb rescue getprop`."
diff --git a/minadbd/minadbd_services.cpp b/minadbd/minadbd_services.cpp
index 5eda73e..d2b824c 100644
--- a/minadbd/minadbd_services.cpp
+++ b/minadbd/minadbd_services.cpp
@@ -25,10 +25,10 @@
 
 #include <functional>
 #include <memory>
+#include <set>
 #include <string>
 #include <string_view>
 #include <thread>
-#include <unordered_set>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -156,8 +156,11 @@
   }
 }
 
+// Answers the query on a given property. The result will be written to the given sfd. If given an
+// empty string, dumps all the supported properties (similar to `adb shell getprop`) in lines, e.g.
+// "[prop]: [value]".
 static void RescueGetpropHostService(unique_fd sfd, const std::string& prop) {
-  static const std::unordered_set<std::string> kGetpropAllowedProps = {
+  static const std::set<std::string> kGetpropAllowedProps = {
     "ro.build.date.utc",
     "ro.build.fingerprint",
     "ro.build.flavor",
@@ -168,12 +171,22 @@
     "ro.product.device",
     "ro.product.vendor.device",
   };
-  auto allowed = kGetpropAllowedProps.find(prop) != kGetpropAllowedProps.end();
-  if (!allowed) {
+  if (!prop.empty() && kGetpropAllowedProps.find(prop) == kGetpropAllowedProps.end()) {
     return;
   }
 
-  auto result = android::base::GetProperty(prop, "");
+  std::string result;
+  if (prop.empty()) {
+    for (const auto& key : kGetpropAllowedProps) {
+      auto value = android::base::GetProperty(key, "");
+      if (value.empty()) {
+        continue;
+      }
+      result += "[" + key + "]: [" + value + "]\n";
+    }
+  } else {
+    result = android::base::GetProperty(prop, "");
+  }
   if (result.empty()) {
     return;
   }