/*
   Reads To, From, Delivered-To, and Reply-To addresses
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <eps.h>

char *i_headers[] = {
  "To",
  "Return-Path",
  "Delivered-To",
  "Cc",
  "Bcc",
  "Reply-To",
  "From",
  NULL
};

void do_address(header_t *);

int main(int argc, char *argv[])
{
  int ret = 0, i = 0, fd = 0;
  eps_t *eps = NULL;
  header_t *h = NULL;

  fd = 0;

  if (argc > 1) {
     fd = open(argv[1], O_RDONLY);
     if (fd == -1)
        return 1;
  }

  eps = eps_begin(INTERFACE_STREAM, &fd);
  if (!eps) {
     printf("eps failed to init\n");
     return 1; 
  }

  for (h = eps_next_header(eps); h; h = eps_next_header(eps)) {
      if ((h->name) && (h->data)) {
         for (i = 0; i_headers[i]; i++) {
             if (!(strcasecmp(i_headers[i], h->name)))
                do_address(h);
         }
      }
  }

  eps_end(eps);  
  return 0;
}

void do_address(header_t *h)
{
  group_t *g = NULL;
  atom_t *aa = NULL;
  address_t *a = NULL;

  if (!(h->atoms)) {
     printf("no atoms\n");
     return;
  }

  if (!(h->atoms->next)) {
     printf("no atoms\n");
     return;
  }

  g = address_evaluate(h->data);
  if (!g) {
     printf("%s: no valid addresses\n", h->name);
     return;
  }
  
  printf("%s: %s%s%s\n", h->name, g->group ? "(of group " : "", g->group ? g->group : "",
	 g->group ? ")" : "");

  for (a = g->members; a->next; a = a->next) {
      if ((a->next->user) && (a->next->domain)) {
         if (a->next->name)
            printf("  (%s) { [%s] @ [%s] }\n", a->next->name ? a->next->name : "",
                   a->next->user ? a->next->user : "N/A",
                   a->next->domain ? a->next->domain : "N/A");
         else
            printf("  { [%s] @ [%s] }\n", a->next->user ? a->next->user : "N/A",
                   a->next->domain ? a->next->domain : "N/A");
      }
  }

  address_kill(g);
}


syntax highlighted by Code2HTML, v. 0.9.1