#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "lookup.h"

int __inet_aton(const char*, struct in_addr*);

int __lookup_ipliteral(struct address buf[static 1],
                       const char* name,
                       int family) {
  struct in_addr a4;
  struct in6_addr a6;
  if (__inet_aton(name, &a4) > 0) {
    if (family == AF_INET6) /* wrong family */
      return EAI_NONAME;
    memcpy(&buf[0].addr, &a4, sizeof a4);
    buf[0].family = AF_INET;
    buf[0].scopeid = 0;
    return 1;
  }

  char tmp[64];
  char *p = strchr(name, '%'), *z;
  unsigned long long scopeid = 0;
  if (p && p - name < 64) {
    memcpy(tmp, name, p - name);
    tmp[p - name] = 0;
    name = tmp;
  }

  if (inet_pton(AF_INET6, name, &a6) <= 0)
    return 0;
  if (family == AF_INET) /* wrong family */
    return EAI_NONAME;

  memcpy(&buf[0].addr, &a6, sizeof a6);
  buf[0].family = AF_INET6;
  if (p) {
    if (isdigit(*++p))
      scopeid = strtoull(p, &z, 10);
    else
      z = p - 1;
    if (*z) {
      if (!IN6_IS_ADDR_LINKLOCAL(&a6) && !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
        return EAI_NONAME;
      scopeid = if_nametoindex(p);
      if (!scopeid)
        return EAI_NONAME;
    }
    if (scopeid > UINT_MAX)
      return EAI_NONAME;
  }
  buf[0].scopeid = scopeid;
  return 1;
}
