[driver-registrar] Basic commandline tool for calling DriverRegistrar.

Also update cml files with DriverRegistrar protocol.

This is for short term use in testing loading out-of-tree drivers,
and should be replaced with something better in future.

Bug: 66669

Change-Id: I8d9ba452a57c98862dc9851da1f571fcda7a2fec
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/464998
Commit-Queue: Jocelyn Dang <jocelyndang@google.com>
Reviewed-by: Abdulla Kamar <abdulla@google.com>
Reviewed-by: Suraj Malhotra <surajmalhotra@google.com>
diff --git a/src/devices/bin/driver-registrar/BUILD.gn b/src/devices/bin/driver-registrar/BUILD.gn
new file mode 100644
index 0000000..d108f813
--- /dev/null
+++ b/src/devices/bin/driver-registrar/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2021 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+executable("driver-registrar") {
+  sources = [ "driver-registrar.cc" ]
+  configs += [ "//build/unification/config:zircon-migrated" ]
+  deps = [
+    "//sdk/fidl/fuchsia.driver.registrar:fuchsia.driver.registrar_llcpp",
+    "//sdk/fidl/fuchsia.pkg",
+    "//sdk/lib/fdio",
+    "//sdk/lib/fidl/cpp",
+    "//zircon/public/lib/zx",
+  ]
+}
diff --git a/src/devices/bin/driver-registrar/driver-registrar.cc b/src/devices/bin/driver-registrar/driver-registrar.cc
new file mode 100644
index 0000000..677d2fb
--- /dev/null
+++ b/src/devices/bin/driver-registrar/driver-registrar.cc
@@ -0,0 +1,48 @@
+// Copyright 2021 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <fuchsia/driver/registrar/llcpp/fidl.h>
+#include <fuchsia/pkg/cpp/fidl.h>
+#include <lib/fdio/directory.h>
+#include <lib/zx/channel.h>
+#include <stdio.h>
+
+#include <fbl/string_printf.h>
+
+int main(int argc, char* argv[]) {
+  if (argc != 2) {
+    fprintf(stderr, "usage: %s <driver package url>\n", argv[0]);
+    return -1;
+  }
+
+  zx::channel local, remote;
+  zx_status_t status = zx::channel::create(0u, &local, &remote);
+  if (status != ZX_OK) {
+    fprintf(stderr, "Failed to create channel, status %d\n", status);
+    return status;
+  }
+
+  const auto svc_path =
+      fbl::StringPrintf("/svc/%s", llcpp::fuchsia::driver::registrar::DriverRegistrar::Name);
+  status = fdio_service_connect(svc_path.c_str(), remote.release());
+  if (status != ZX_OK) {
+    fprintf(stderr, "fdio_service_connect failed, pathc %s, status %d\n", svc_path.c_str(), status);
+    return status;
+  }
+  llcpp::fuchsia::driver::registrar::DriverRegistrar::SyncClient client(std::move(local));
+
+  auto resp =
+      client.Register(llcpp::fuchsia::pkg::PackageUrl{fidl::unowned_str(argv[1], strlen(argv[1]))});
+  if (!resp.ok()) {
+    fprintf(stderr, "Failed to call DriverRegistrar::Register for driver package %s\n", argv[1]);
+    return -1;
+  }
+  if (resp->result.is_err()) {
+    fprintf(stderr, "DriverRegistrar::Register returned err %d for driver package %s\n",
+            resp->result.err(), argv[1]);
+    return -1;
+  }
+  printf("DriverRegistrar::Register successfully registered driver package %s\n", argv[1]);
+  return 0;
+}
diff --git a/src/devices/bin/driver_manager/meta/driver_manager.cml b/src/devices/bin/driver_manager/meta/driver_manager.cml
index e04cbc4..8a9e107 100644
--- a/src/devices/bin/driver_manager/meta/driver_manager.cml
+++ b/src/devices/bin/driver_manager/meta/driver_manager.cml
@@ -1,4 +1,5 @@
 {
+    include: [ "sdk/lib/diagnostics/syslog/client.shard.cml" ],
     program: {
         binary: "bin/driver_manager",
         lifecycle: { stop_event: "notify" },
@@ -24,6 +25,7 @@
                 "fuchsia.device.manager.BindDebugger",
                 "fuchsia.device.manager.DebugDumper",
                 "fuchsia.device.manager.SystemStateTransition",
+                "fuchsia.driver.registrar.DriverRegistrar",
             ],
         },
     ],
@@ -77,9 +79,9 @@
                 "fuchsia.device.manager.BindDebugger",
                 "fuchsia.device.manager.DebugDumper",
                 "fuchsia.device.manager.SystemStateTransition",
+                "fuchsia.driver.registrar.DriverRegistrar",
             ],
             from: "self",
         },
     ],
-    include: [ "sdk/lib/diagnostics/syslog/client.shard.cml" ],
 }
diff --git a/src/devices/bundles/BUILD.gn b/src/devices/bundles/BUILD.gn
index f42015c..fb95870 100644
--- a/src/devices/bundles/BUILD.gn
+++ b/src/devices/bundles/BUILD.gn
@@ -118,6 +118,7 @@
 
 group("utils") {
   deps = [
+    "//src/devices/bin/driver-registrar",
     "//src/devices/bin/driverctl",
     "//src/devices/bin/lsdev",
     "//src/devices/bin/unbind",
diff --git a/src/sys/appmgr/meta/appmgr.cml b/src/sys/appmgr/meta/appmgr.cml
index c5af15d..af894bd 100644
--- a/src/sys/appmgr/meta/appmgr.cml
+++ b/src/sys/appmgr/meta/appmgr.cml
@@ -232,6 +232,10 @@
             path: "/svc_for_sys/fuchsia.device.manager.BindDebugger",
         },
         {
+            protocol: "fuchsia.driver.registrar.DriverRegistrar",
+            path: "/svc_for_sys/fuchsia.driver.registrar.DriverRegistrar",
+        },
+        {
             protocol: "fuchsia.hardware.pci.Bus",
             path: "/svc_for_sys/fuchsia.hardware.pci.Bus",
         },
diff --git a/src/sys/bootstrap/meta/bootstrap.cml b/src/sys/bootstrap/meta/bootstrap.cml
index 418b2ac..0c8a099 100644
--- a/src/sys/bootstrap/meta/bootstrap.cml
+++ b/src/sys/bootstrap/meta/bootstrap.cml
@@ -749,6 +749,7 @@
                 "fuchsia.device.manager.BindDebugger",
                 "fuchsia.device.manager.DebugDumper",
                 "fuchsia.device.manager.SystemStateTransition",
+                "fuchsia.driver.registrar.DriverRegistrar",
             ],
             from: "#driver_manager",
         },
diff --git a/src/sys/bootstrap/meta/root.cml b/src/sys/bootstrap/meta/root.cml
index 692b9df..bab8263 100644
--- a/src/sys/bootstrap/meta/root.cml
+++ b/src/sys/bootstrap/meta/root.cml
@@ -133,6 +133,7 @@
                 "fuchsia.diagnostics.ArchiveAccessor",
                 "fuchsia.diagnostics.FeedbackArchiveAccessor",
                 "fuchsia.diagnostics.LegacyMetricsArchiveAccessor",
+                "fuchsia.driver.registrar.DriverRegistrar",
                 "fuchsia.hardware.power.statecontrol.Admin",
                 "fuchsia.hardware.power.statecontrol.RebootMethodsWatcherRegister",
                 "fuchsia.hardware.pty.Device",
diff --git a/src/sys/core/meta/core.cml b/src/sys/core/meta/core.cml
index a10544d..b85c287 100644
--- a/src/sys/core/meta/core.cml
+++ b/src/sys/core/meta/core.cml
@@ -169,6 +169,7 @@
                 "fuchsia.device.manager.Administrator",
                 "fuchsia.device.manager.DebugDumper",
                 "fuchsia.device.NameProvider",
+                "fuchsia.driver.registrar.DriverRegistrar",
                 "fuchsia.hardware.power.statecontrol.Admin",
                 "fuchsia.hardware.power.statecontrol.RebootMethodsWatcherRegister",
                 "fuchsia.hardware.pty.Device",