// 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 <errno.h>
#include <fidl/fuchsia.device/cpp/wire.h>
#include <string.h>
#include <sys/utsname.h>
#include <zircon/types.h>

#include <vector>

#include "fdio_unistd.h"
#include "internal.h"

extern "C" __EXPORT int uname(utsname* uts) {
  if (!uts) {
    return ERRNO(EFAULT);
  }

  // Avoid overwriting caller's memory until after all fallible operations have succeeded.
  auto& name_provider = get_client<fuchsia_device::NameProvider>();
  if (name_provider.is_error()) {
    return ERROR(name_provider.status_value());
  }

  auto response = name_provider->GetDeviceName();
  if (response.status() != ZX_OK) {
    return ERROR(response.status());
  }

  auto* result = response.Unwrap();
  if (result->is_error()) {
    return ERROR(result->error_value());
  }

  const fidl::StringView& nodename = result->value()->name;
  const auto size = std::min(nodename.size(), sizeof(uts->nodename) - 1);
  memcpy(uts->nodename, nodename.data(), size);
  uts->nodename[size] = '\0';

  strcpy(uts->sysname, "Fuchsia");
  strcpy(uts->release, "");
  strcpy(uts->version, "");
#if defined(__x86_64__)
  strcpy(uts->machine, "x86_64");
#elif defined(__aarch64__)
  strcpy(uts->machine, "aarch64");
#else
  strcpy(uts->machine, "");
#endif

#ifdef _GNU_SOURCE
  strcpy(uts->domainname, "");
#else
  strcpy(uts->__domainname, "");
#endif

  return 0;
}
