/*
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