#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>
#include <arpa/inet.h>

char *ether(uint8_t addr[], char *buf)
{
  sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
	  addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
  return buf;
}

uint8_t *ip(int fd, uint16_t *len)
{
}

uint8_t *arp(int fd, uint16_t *len)
{
}

uint8_t *readetherhdr(int fd, uint8_t *src, uint8_t *dst, uint16_t *etype, uint16_t *len)
{
  struct ether {
    uint8_t dst[6];
    uint8_t src[6];
    uint16_t et;
  } e;
  struct qtag {
    uint16_t tci;
    uint16_t et;
  } q;
  uint8_t *pkt = NULL;
  uint32_t crc;
  
  if (read(fd, &e, sizeof(e)) < 0) return NULL;
  memcpy(dst, e.dst, sizeof(e.dst));
  memcpy(src, e.src, sizeof(e.src));
  *etype = ntohs(e.et);
  if (*etype == 0x8100) {
    fprintf(stderr,"VLan tag encountered.\n");
    if (read(fd, &q, sizeof(struct qtag)) < 0) return NULL;
    *etype = ntohs(q.et);
  }
  switch(*etype) {
    case 0x0800:
      pkt = ip(fd, len);
      break;
    case 0x0806:
      pkt = arp(fd, len);
      break;
    default:
      fprintf(stderr,"Unknown packet type: %04X\n", e.et);
      break;
  }
  if (pkt)
    if (read(fd, &crc, sizeof(crc)) < 0) return NULL;
  return pkt;
}

int main(int argc, char *argv[])
{
  int fd;
  char *pkt, bufa[20], bufb[20];
  uint8_t src[8], dst[8];
  uint16_t etype, len=0;

  if (argc < 2) {
    fprintf(stderr,"Usage: h8 <packetdump>\n");
    exit(0);
  }
  fd = open(argv[1], O_RDONLY);
  if (fd < 0) {
    fprintf(stderr,"Unable to open packetdump for reading.\n");
    exit(1);
  }
  
  while((pkt = readetherhdr(fd, src, dst, &etype, &len)) != NULL) {
    printf(" ether: %s -> %s (%d)\n", ether(src,bufa), ether(dst,bufb), len);
    switch(r) {
      case 1:
	break;
      case 2:
	break;
    }
  }
}