#include <stdlib.h>
#include <netinet/ether.h>
#include <stdio.h>

struct ether_addr* ether_aton_r(const char* x, struct ether_addr* p_a) {
  struct ether_addr a;
  char* y;
  for (int ii = 0; ii < 6; ii++) {
    unsigned long int n;
    if (ii != 0) {
      if (x[0] != ':')
        return 0; /* bad format */
      else
        x++;
    }
    n = strtoul(x, &y, 16);
    x = y;
    if (n > 0xFF)
      return 0; /* bad byte */
    a.ether_addr_octet[ii] = n;
  }
  if (x[0] != 0)
    return 0; /* bad format */
  *p_a = a;
  return p_a;
}

struct ether_addr* ether_aton(const char* x) {
  static struct ether_addr a;
  return ether_aton_r(x, &a);
}

char* ether_ntoa_r(const struct ether_addr* p_a, char* x) {
  char* y;
  y = x;
  for (int ii = 0; ii < 6; ii++) {
    x += sprintf(x, ii == 0 ? "%.2X" : ":%.2X", p_a->ether_addr_octet[ii]);
  }
  return y;
}

char* ether_ntoa(const struct ether_addr* p_a) {
  static char x[18];
  return ether_ntoa_r(p_a, x);
}

int ether_line(const char* l, struct ether_addr* e, char* hostname) {
  return -1;
}

int ether_ntohost(char* hostname, const struct ether_addr* e) {
  return -1;
}

int ether_hostton(const char* hostname, struct ether_addr* e) {
  return -1;
}
