[devmgr] Pass sysinfo job to Coordinator

Rather than indirectly go through a global variable, require the sysinfo
job be passed through the CoordinatorConfig.

Test: Ran Fuchsia and /system/test/ddk tests.
Change-Id: I29a026b30f65ae0bb6e46429253ee74ae25e2012
diff --git a/system/core/devmgr/devmgr/coordinator.cpp b/system/core/devmgr/devmgr/coordinator.cpp
index 55f6eca..3ea0ddf 100644
--- a/system/core/devmgr/devmgr/coordinator.cpp
+++ b/system/core/devmgr/devmgr/coordinator.cpp
@@ -488,7 +488,7 @@
 
 static zx_status_t dc_launch_devhost(Devhost* host, DevhostLoaderService* loader_service,
                                      const char* devhost_bin, const char* name, zx_handle_t hrpc,
-                                     const zx::resource& root_resource,
+                                     const zx::resource& root_resource, const zx::job& sysinfo_job,
                                      zx::unowned_job devhost_job) {
     launchpad_t* lp;
     launchpad_create_with_jobs(devhost_job->get(), 0, name, &lp);
@@ -509,7 +509,10 @@
     //TODO: limit root resource to root devhost only
     if (root_resource.is_valid()) {
         zx::resource resource;
-        root_resource.duplicate(ZX_RIGHT_SAME_RIGHTS, &resource);
+        zx_status_t status = root_resource.duplicate(ZX_RIGHT_SAME_RIGHTS, &resource);
+        if (status != ZX_OK) {
+            log(ERROR, "devcoord: failed to duplicate root resource: %d\n", status);
+        }
         launchpad_add_handle(lp, resource.release(), PA_HND(PA_RESOURCE, 0));
     }
 
@@ -531,27 +534,29 @@
 
     launchpad_set_nametable(lp, name_count, nametable);
 
-    //TODO: limit root job access to root devhost only
-    launchpad_add_handle(lp, get_sysinfo_job_root().release(),
-                         PA_HND(PA_USER0, kIdHJobRoot));
+    //TODO: limit sysinfo job access to root devhost only
+    zx::job sysinfo_job_duplicate;
+    zx_status_t status = sysinfo_job.duplicate(ZX_RIGHT_SAME_RIGHTS, &sysinfo_job_duplicate);
+    if (status != ZX_OK) {
+        log(ERROR, "devcoord: failed to duplicate sysinfo job: %d\n", status);
+    }
+    launchpad_add_handle(lp, sysinfo_job_duplicate.release(), PA_HND(PA_USER0, kIdHJobRoot));
 
     const char* errmsg;
     zx_handle_t proc;
-    zx_status_t status = launchpad_go(lp, &proc, &errmsg);
+    status = launchpad_go(lp, &proc, &errmsg);
     if (status < 0) {
-        log(ERROR, "devcoord: launch devhost '%s': failed: %d: %s\n",
-            name, status, errmsg);
+        log(ERROR, "devcoord: launch devhost '%s': failed: %d: %s\n", name, status, errmsg);
         return status;
     }
     host->set_proc(proc);
 
     zx_info_handle_basic_t info;
-    if (host->proc()->get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr) == ZX_OK) {
+    if (host->proc()->get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr) ==
+        ZX_OK) {
         host->set_koid(info.koid);
     }
-    log(INFO, "devcoord: launch devhost '%s': pid=%zu\n",
-        name, host->koid());
-
+    log(INFO, "devcoord: launch devhost '%s': pid=%zu\n", name, host->koid());
     return ZX_OK;
 }
 
@@ -569,7 +574,8 @@
     dh->set_hrpc(dh_hrpc);
 
     if ((r = dc_launch_devhost(dh.get(), loader_service_, get_devhost_bin(config_.asan_drivers),
-        name, hrpc, root_resource(), zx::unowned_job(config_.devhost_job))) < 0) {
+        name, hrpc, root_resource(), config_.sysinfo_job, zx::unowned_job(config_.devhost_job))) <
+        0) {
         zx_handle_close(dh->hrpc());
         return r;
     }
diff --git a/system/core/devmgr/devmgr/coordinator.h b/system/core/devmgr/devmgr/coordinator.h
index 372c732..958e44a 100644
--- a/system/core/devmgr/devmgr/coordinator.h
+++ b/system/core/devmgr/devmgr/coordinator.h
@@ -266,6 +266,8 @@
 struct CoordinatorConfig {
     // Initial root resource from the kernel.
     zx::resource root_resource;
+    // Job for sysinfo.
+    zx::job sysinfo_job;
     // Job for all devhosts.
     zx::job devhost_job;
     // Event that controls the fshost.
diff --git a/system/core/devmgr/devmgr/devmgr.h b/system/core/devmgr/devmgr/devmgr.h
index 6026150..9eb1ac4 100644
--- a/system/core/devmgr/devmgr/devmgr.h
+++ b/system/core/devmgr/devmgr/devmgr.h
@@ -28,6 +28,4 @@
 // Clones the channel connected to the root of devfs.
 zx::channel devfs_root_clone();
 
-zx::job get_sysinfo_job_root();
-
 } // namespace devmgr
diff --git a/system/core/devmgr/devmgr/main.cpp b/system/core/devmgr/devmgr/main.cpp
index 8035172..07d6b3b 100644
--- a/system/core/devmgr/devmgr/main.cpp
+++ b/system/core/devmgr/devmgr/main.cpp
@@ -744,16 +744,6 @@
 
 zx_handle_t virtcon_open;
 
-zx::job get_sysinfo_job_root() {
-    zx::job h;
-    //TODO: limit to enumerate rights
-    if (g_handles.root_job->duplicate(ZX_RIGHT_SAME_RIGHTS, &h) < 0) {
-        return zx::job();
-    } else {
-        return h;
-    }
-}
-
 zx::channel fs_clone(const char* path) {
     if (!strcmp(path, "dev")) {
         return devfs_root_clone();
@@ -793,6 +783,7 @@
     ParseArgs(argc, argv, &args);
 
     g_handles.root_job = zx::job::default_job();
+    g_handles.root_job->set_property(ZX_PROP_NAME, "root", 4);
     bool require_system = devmgr::getenv_bool("devmgr.require-system", false);
 
     async::Loop loop(&kAsyncLoopConfigNoAttachToThread);
@@ -805,14 +796,19 @@
         fprintf(stderr, "devmgr: did not receive root resource: %d\n", status);
         return 1;
     }
+    //TODO: limit to enumerate rights
+    status = g_handles.root_job->duplicate(ZX_RIGHT_SAME_RIGHTS, &config.sysinfo_job);
+    if (status != ZX_OK) {
+        fprintf(stderr, "devmgr: failed to duplicate root job for sysinfo: %d\n", status);
+    }
     status = CreateDevhostJob(*g_handles.root_job, &config.devhost_job);
     if (status != ZX_OK) {
-        fprintf(stderr, "devmgr: unable to create devhost job: %d\n", status);
+        fprintf(stderr, "devmgr: failed to create devhost job: %d\n", status);
         return 1;
     }
     status = zx::event::create(0, &config.fshost_event);
     if (status != ZX_OK) {
-        fprintf(stderr, "devmgr: unable to create fshost event: %d\n", status);
+        fprintf(stderr, "devmgr: failed to create fshost event: %d\n", status);
         return 1;
     }
 
@@ -826,11 +822,9 @@
         fdio_service_clone_to(devmgr::devfs_root_borrow()->get(), devfs_client.release());
     }
 
-    g_handles.root_job->set_property(ZX_PROP_NAME, "root", 4);
-
     status = zx::job::create(*g_handles.root_job, 0u, &g_handles.svc_job);
     if (status != ZX_OK) {
-        fprintf(stderr, "devmgr: unable to create service job: %d\n", status);
+        fprintf(stderr, "devmgr: failed to create service job: %d\n", status);
         return 1;
     }
     g_handles.svc_job.set_property(ZX_PROP_NAME, "zircon-services", 16);