meillo@367: /* meillo@367: ** MasqMail meillo@367: ** Copyright (C) 1999-2001 Oliver Kurth meillo@367: ** meillo@367: ** This program is free software; you can redistribute it and/or modify meillo@367: ** it under the terms of the GNU General Public License as published by meillo@367: ** the Free Software Foundation; either version 2 of the License, or meillo@367: ** (at your option) any later version. meillo@367: ** meillo@367: ** This program is distributed in the hope that it will be useful, meillo@367: ** but WITHOUT ANY WARRANTY; without even the implied warranty of meillo@367: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the meillo@367: ** GNU General Public License for more details. meillo@367: ** meillo@367: ** You should have received a copy of the GNU General Public License meillo@367: ** along with this program; if not, write to the Free Software meillo@367: ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. meillo@0: */ meillo@0: meillo@0: #include "masqmail.h" meillo@0: meillo@10: address* meillo@366: create_address(gchar *path, gboolean is_rfc821) meillo@0: { meillo@10: address *addr; meillo@10: addr = _create_address(path, NULL, is_rfc821); meillo@10: meillo@389: if (addr) { meillo@10: addr_unmark_delivered(addr); meillo@10: } meillo@10: return addr; meillo@0: } meillo@0: meillo@10: address* meillo@366: create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain) meillo@0: { meillo@10: address *addr = create_address(path, is_rfc821); meillo@23: meillo@389: if (addr && !addr->domain) { meillo@389: addr->domain = g_strdup(domain); meillo@10: } meillo@10: return addr; meillo@0: } meillo@0: meillo@13: /* nothing special about pipes here, but its only called for that purpose */ meillo@10: address* meillo@366: create_address_pipe(gchar *path) meillo@0: { meillo@10: address *addr = g_malloc(sizeof(address)); meillo@0: meillo@10: if (addr) { meillo@10: memset(addr, 0, sizeof(address)); meillo@10: addr->address = g_strchomp(g_strdup(path)); meillo@10: addr->local_part = g_strdup(addr->address); meillo@10: addr->domain = g_strdup("localhost"); /* quick hack */ meillo@10: } meillo@10: return addr; meillo@0: } meillo@0: meillo@10: void meillo@366: destroy_address(address *addr) meillo@0: { meillo@10: DEBUG(6) debugf("destroy_address entered\n"); meillo@10: g_free(addr->address); meillo@10: g_free(addr->local_part); meillo@10: g_free(addr->domain); meillo@10: g_free(addr); meillo@0: } meillo@0: meillo@10: address* meillo@366: copy_modify_address(const address *orig, gchar *l_part, gchar *dom) meillo@0: { meillo@10: address *addr = NULL; meillo@0: meillo@23: if (!orig) { meillo@23: return NULL; meillo@23: } meillo@389: if (!(addr = g_malloc(sizeof(address)))) { meillo@23: return NULL; meillo@23: } meillo@23: addr->address = g_strdup(orig->address); meillo@389: addr->local_part = l_part ? g_strdup(l_part) : meillo@389: g_strdup(orig->local_part); meillo@389: addr->domain = dom ? g_strdup(dom) : g_strdup(orig->domain); meillo@23: addr->flags = 0; meillo@23: addr->children = NULL; meillo@23: addr->parent = NULL; meillo@10: return addr; meillo@0: } meillo@0: meillo@10: gboolean meillo@389: addr_isequal(address *addr1, address *addr2, meillo@389: int (*cmpfunc) (const char*, const char*)) meillo@0: { meillo@389: return (cmpfunc(addr1->local_part, addr2->local_part)==0) && meillo@389: (strcasecmp(addr1->domain, addr2->domain)==0); meillo@0: } meillo@0: meillo@0: /* searches in ancestors of addr1 */ meillo@10: gboolean meillo@389: addr_isequal_parent(address *addr1, address *addr2, meillo@389: int (*cmpfunc) (const char*, const char*)) meillo@0: { meillo@10: address *addr; meillo@0: meillo@389: for (addr = addr1; addr; addr = addr->parent) { meillo@389: if (addr_isequal(addr, addr2, cmpfunc)) { meillo@10: return TRUE; meillo@389: } meillo@389: } meillo@10: return FALSE; meillo@0: } meillo@0: meillo@0: /* careful, this is recursive */ meillo@0: /* returns TRUE if ALL children have been delivered */ meillo@10: gboolean meillo@366: addr_is_delivered_children(address *addr) meillo@0: { meillo@10: GList *addr_node; meillo@0: meillo@389: if (!addr->children) { meillo@10: return addr_is_delivered(addr); meillo@389: } meillo@10: foreach(addr->children, addr_node) { meillo@10: address *addr = (address *) (addr_node->data); meillo@389: if (!addr_is_delivered_children(addr)) { meillo@10: return FALSE; meillo@389: } meillo@10: } meillo@10: return TRUE; meillo@0: } meillo@0: meillo@0: /* careful, this is recursive */ meillo@0: /* returns TRUE if ALL children have been either delivered or have failed */ meillo@10: gboolean meillo@366: addr_is_finished_children(address *addr) meillo@0: { meillo@10: GList *addr_node; meillo@0: meillo@389: if (!addr->children) { meillo@10: return (addr_is_failed(addr) || addr_is_delivered(addr)); meillo@389: } meillo@10: foreach(addr->children, addr_node) { meillo@10: address *addr = (address *) (addr_node->data); meillo@389: if (!addr_is_finished_children(addr)) { meillo@10: return FALSE; meillo@389: } meillo@10: } meillo@10: return TRUE; meillo@0: } meillo@0: meillo@0: /* find original address */ meillo@10: address* meillo@366: addr_find_ancestor(address *addr) meillo@0: { meillo@389: while (addr->parent) { meillo@10: addr = addr->parent; meillo@389: } meillo@10: return addr; meillo@0: } meillo@0: meillo@10: gchar* meillo@366: addr_string(address *addr) meillo@0: { meillo@10: static gchar *buffer = NULL; meillo@0: meillo@389: if (!addr) { meillo@10: g_free(buffer); meillo@10: buffer = NULL; meillo@10: return NULL; meillo@10: } meillo@389: if (buffer) { meillo@10: g_free(buffer); meillo@389: } meillo@389: if (!*addr->local_part) { meillo@10: buffer = g_strdup("<>"); meillo@10: } else { meillo@389: buffer = g_strdup_printf("<%s@%s>", meillo@389: addr->local_part ? addr->local_part : "", meillo@389: addr->domain ? addr->domain : ""); meillo@10: } meillo@10: return buffer; meillo@0: }