masqmail

annotate src/address.c @ 432:ddc05e12e307

Added tag 0.3.5 for changeset 34c919a8d74e
author markus schnalke <meillo@marmaro.de>
date Sat, 07 Feb 2015 11:36:09 +0100
parents bc9a7845b53a
children
rev   line source
meillo@367 1 /*
meillo@367 2 ** MasqMail
meillo@367 3 ** Copyright (C) 1999-2001 Oliver Kurth
meillo@367 4 **
meillo@367 5 ** This program is free software; you can redistribute it and/or modify
meillo@367 6 ** it under the terms of the GNU General Public License as published by
meillo@367 7 ** the Free Software Foundation; either version 2 of the License, or
meillo@367 8 ** (at your option) any later version.
meillo@367 9 **
meillo@367 10 ** This program is distributed in the hope that it will be useful,
meillo@367 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
meillo@367 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
meillo@367 13 ** GNU General Public License for more details.
meillo@367 14 **
meillo@367 15 ** You should have received a copy of the GNU General Public License
meillo@367 16 ** along with this program; if not, write to the Free Software
meillo@367 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
meillo@0 18 */
meillo@0 19
meillo@0 20 #include "masqmail.h"
meillo@0 21
meillo@10 22 address*
meillo@366 23 create_address(gchar *path, gboolean is_rfc821)
meillo@0 24 {
meillo@10 25 address *addr;
meillo@10 26 addr = _create_address(path, NULL, is_rfc821);
meillo@10 27
meillo@389 28 if (addr) {
meillo@10 29 addr_unmark_delivered(addr);
meillo@10 30 }
meillo@10 31 return addr;
meillo@0 32 }
meillo@0 33
meillo@10 34 address*
meillo@366 35 create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain)
meillo@0 36 {
meillo@10 37 address *addr = create_address(path, is_rfc821);
meillo@23 38
meillo@389 39 if (addr && !addr->domain) {
meillo@411 40 addr->domain = g_strstrip(g_strdup(domain));
meillo@10 41 }
meillo@10 42 return addr;
meillo@0 43 }
meillo@0 44
meillo@13 45 /* nothing special about pipes here, but its only called for that purpose */
meillo@10 46 address*
meillo@366 47 create_address_pipe(gchar *path)
meillo@0 48 {
meillo@10 49 address *addr = g_malloc(sizeof(address));
meillo@0 50
meillo@10 51 if (addr) {
meillo@10 52 memset(addr, 0, sizeof(address));
meillo@411 53 addr->address = g_strstrip(g_strdup(path));
meillo@411 54 addr->local_part = g_strstrip(g_strdup(addr->address));
meillo@10 55 addr->domain = g_strdup("localhost"); /* quick hack */
meillo@10 56 }
meillo@10 57 return addr;
meillo@0 58 }
meillo@0 59
meillo@10 60 void
meillo@366 61 destroy_address(address *addr)
meillo@0 62 {
meillo@10 63 DEBUG(6) debugf("destroy_address entered\n");
meillo@10 64 g_free(addr->address);
meillo@10 65 g_free(addr->local_part);
meillo@10 66 g_free(addr->domain);
meillo@10 67 g_free(addr);
meillo@0 68 }
meillo@0 69
meillo@10 70 address*
meillo@366 71 copy_modify_address(const address *orig, gchar *l_part, gchar *dom)
meillo@0 72 {
meillo@10 73 address *addr = NULL;
meillo@0 74
meillo@23 75 if (!orig) {
meillo@23 76 return NULL;
meillo@23 77 }
meillo@389 78 if (!(addr = g_malloc(sizeof(address)))) {
meillo@23 79 return NULL;
meillo@23 80 }
meillo@411 81 addr->address = g_strstrip(g_strdup(orig->address));
meillo@411 82 addr->local_part = g_strstrip(l_part ? g_strdup(l_part) :
meillo@411 83 g_strdup(orig->local_part));
meillo@411 84 addr->domain = g_strstrip(dom ? g_strdup(dom) :
meillo@411 85 g_strdup(orig->domain));
meillo@23 86 addr->flags = 0;
meillo@23 87 addr->children = NULL;
meillo@23 88 addr->parent = NULL;
meillo@10 89 return addr;
meillo@0 90 }
meillo@0 91
meillo@10 92 gboolean
meillo@389 93 addr_isequal(address *addr1, address *addr2,
meillo@389 94 int (*cmpfunc) (const char*, const char*))
meillo@0 95 {
meillo@389 96 return (cmpfunc(addr1->local_part, addr2->local_part)==0) &&
meillo@389 97 (strcasecmp(addr1->domain, addr2->domain)==0);
meillo@0 98 }
meillo@0 99
meillo@0 100 /* searches in ancestors of addr1 */
meillo@10 101 gboolean
meillo@389 102 addr_isequal_parent(address *addr1, address *addr2,
meillo@389 103 int (*cmpfunc) (const char*, const char*))
meillo@0 104 {
meillo@10 105 address *addr;
meillo@0 106
meillo@389 107 for (addr = addr1; addr; addr = addr->parent) {
meillo@389 108 if (addr_isequal(addr, addr2, cmpfunc)) {
meillo@10 109 return TRUE;
meillo@389 110 }
meillo@389 111 }
meillo@10 112 return FALSE;
meillo@0 113 }
meillo@0 114
meillo@0 115 /* careful, this is recursive */
meillo@0 116 /* returns TRUE if ALL children have been delivered */
meillo@10 117 gboolean
meillo@366 118 addr_is_delivered_children(address *addr)
meillo@0 119 {
meillo@10 120 GList *addr_node;
meillo@0 121
meillo@389 122 if (!addr->children) {
meillo@10 123 return addr_is_delivered(addr);
meillo@389 124 }
meillo@10 125 foreach(addr->children, addr_node) {
meillo@10 126 address *addr = (address *) (addr_node->data);
meillo@389 127 if (!addr_is_delivered_children(addr)) {
meillo@10 128 return FALSE;
meillo@389 129 }
meillo@10 130 }
meillo@10 131 return TRUE;
meillo@0 132 }
meillo@0 133
meillo@0 134 /* careful, this is recursive */
meillo@0 135 /* returns TRUE if ALL children have been either delivered or have failed */
meillo@10 136 gboolean
meillo@366 137 addr_is_finished_children(address *addr)
meillo@0 138 {
meillo@10 139 GList *addr_node;
meillo@0 140
meillo@389 141 if (!addr->children) {
meillo@10 142 return (addr_is_failed(addr) || addr_is_delivered(addr));
meillo@389 143 }
meillo@10 144 foreach(addr->children, addr_node) {
meillo@10 145 address *addr = (address *) (addr_node->data);
meillo@389 146 if (!addr_is_finished_children(addr)) {
meillo@10 147 return FALSE;
meillo@389 148 }
meillo@10 149 }
meillo@10 150 return TRUE;
meillo@0 151 }
meillo@0 152
meillo@0 153 /* find original address */
meillo@10 154 address*
meillo@366 155 addr_find_ancestor(address *addr)
meillo@0 156 {
meillo@389 157 while (addr->parent) {
meillo@10 158 addr = addr->parent;
meillo@389 159 }
meillo@10 160 return addr;
meillo@0 161 }
meillo@0 162
meillo@10 163 gchar*
meillo@366 164 addr_string(address *addr)
meillo@0 165 {
meillo@10 166 static gchar *buffer = NULL;
meillo@0 167
meillo@389 168 if (buffer) {
meillo@10 169 g_free(buffer);
meillo@389 170 }
meillo@411 171 if (!addr) {
meillo@411 172 return NULL;
meillo@411 173 }
meillo@389 174 if (!*addr->local_part) {
meillo@10 175 buffer = g_strdup("<>");
meillo@10 176 } else {
meillo@389 177 buffer = g_strdup_printf("<%s@%s>",
meillo@389 178 addr->local_part ? addr->local_part : "",
meillo@389 179 addr->domain ? addr->domain : "");
meillo@10 180 }
meillo@10 181 return buffer;
meillo@0 182 }