// Copyright 2017 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/device/llcpp/fidl.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <stdio.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>

int main(int argc, char* argv[]) {
  if (argc < 2) {
    fprintf(stderr, "usage: %s <device path>\n", argv[0]);
    return -1;
  }

  zx_handle_t local, remote;
  zx_status_t status = zx_channel_create(0, &local, &remote);
  if (status != ZX_OK) {
    fprintf(stderr, "could not create channel\n");
    return -1;
  }
  status = fdio_service_connect(argv[1], remote);
  if (status != ZX_OK) {
    zx_handle_close(local);
    fprintf(stderr, "could not open %s: %s\n", argv[1], zx_status_get_string(status));
    return -1;
  }

  char path[1025];
  size_t actual_len;

  auto resp =
      ::llcpp::fuchsia::device::Controller::Call::GetTopologicalPath(zx::unowned_channel(local));
  status = resp.status();

  if (status == ZX_OK) {
    if (resp->result.is_err()) {
      status = resp->result.err();
    } else {
      actual_len = resp->result.response().path.size();
      auto& r = resp->result.response();
      memcpy(path, r.path.data(), r.path.size());
    }
  }

  if (status != ZX_OK) {
    fprintf(stderr, "could not get topological path for %s: %s\n", argv[1],
            zx_status_get_string(status));
    return -1;
  }
  path[actual_len] = 0;

  printf("topological path for %s: %s\n", argv[1], path);
  return 0;
}
