/* Reads To, From, Delivered-To, and Reply-To addresses */ #include #include #include #include #include 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); }