[vulkan] Fix service access for Fuchsia

Filesystem access via libc is deprecated.

Change-Id: I0049ca3d2006528e0f1c149378606cf6aa460064
diff --git a/BUILD.gn b/BUILD.gn
index ff337fc..874f128 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -133,6 +133,7 @@
       "//zircon/system/fidl/fuchsia-sysmem",
       "//zircon/public/lib/trace-with-static-engine",
       "//zircon/public/lib/zx",
+      "//zircon/public/lib/zxio",
     ]
 
     defines += [
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 414e1af..6d35ac2 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -19,6 +19,8 @@
 #include <string.h>
 #ifdef VK_USE_PLATFORM_FUCHSIA
 #include <lib/zx/channel.h>
+#include <lib/zxio/zxio.h>
+#include <lib/zxio/inception.h>
 #include <unistd.h>
 
 #include "services/service_connector.h"
@@ -665,10 +667,29 @@
 
 class VulkanDevice {
 public:
-    VulkanDevice() : mHostSupportsGoldfish(access(QEMU_PIPE_PATH, F_OK) != -1) {
+    VulkanDevice() : mHostSupportsGoldfish(IsAccessible(QEMU_PIPE_PATH)) {
         goldfish_vk::ResourceTracker::get();
     }
 
+    static bool IsAccessible(const char* name) {
+        zx_handle_t handle = GetConnectToServiceFunction()(name);
+        if (handle == ZX_HANDLE_INVALID)
+            return false;
+
+        zxio_storage_t io_storage;
+        zx_status_t status = zxio_remote_init(&io_storage, handle, ZX_HANDLE_INVALID);
+        if (status != ZX_OK)
+            return false;
+
+        zxio_node_attr_t attr;
+        status = zxio_attr_get(&io_storage.io, &attr);
+        zxio_close(&io_storage.io);
+        if (status != ZX_OK)
+            return false;
+
+        return true;
+    }
+
     static VulkanDevice& GetInstance() {
         static VulkanDevice g_instance;
         return g_instance;