// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/socket.h"

#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>

#include "starboard/log.h"
#include "starboard/shared/posix/socket_internal.h"

namespace sbposix = starboard::shared::posix;

SbSocketResolution* SbSocketResolve(const char* hostname, int filters) {
  struct addrinfo* ai = NULL;
  struct addrinfo hints = {0};

  if (filters & kSbSocketResolveFilterIpv4) {
    if (filters & kSbSocketResolveFilterIpv6) {
      hints.ai_family = AF_UNSPEC;
    } else {
      hints.ai_family = AF_INET;
    }
  } else if (filters & kSbSocketResolveFilterIpv6) {
      hints.ai_family = AF_INET6;
  } else {
    hints.ai_family = AF_UNSPEC;
  }

  hints.ai_flags = AI_ADDRCONFIG;
  hints.ai_socktype = SOCK_STREAM;

  // Actually make the call to get the data.
  int err = getaddrinfo(hostname, NULL, &hints, &ai);
  if (err != 0 || ai == NULL) {
    return NULL;
  }

  int address_count = 0;
  for (const struct addrinfo* i = ai; i != NULL; i = i->ai_next) {
    ++address_count;
  }

  SbSocketResolution* result = new SbSocketResolution();

  // Translate all the sockaddrs.
  sbposix::SockAddr* sock_addrs = new sbposix::SockAddr[address_count];
  int index = 0;
  int skip = 0;
  for (const struct addrinfo *i = ai; i != NULL; i = i->ai_next, ++index) {
    // Skip over any addresses we can't parse.
    if (!sock_addrs[index].FromSockaddr(i->ai_addr)) {
      ++skip;
    }
  }

  result->address_count = address_count - skip;
  result->addresses = new SbSocketAddress[result->address_count];

  int result_index = 0;
  for (int i = 0; i < address_count; ++i) {
    if (sock_addrs[i].ToSbSocketAddress(&result->addresses[result_index])) {
      ++result_index;
    }
  }

  delete[] sock_addrs;
  freeaddrinfo(ai);
  return result;
}
