masqmail

annotate src/address.c @ 421:f37384470855

Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup. Moved the lockdir out of the spool dir. (When /var/lock is a ramdisk we do well to have the lock files there.) Added the new configure option --with-lockdir to change that location. Nontheless, if we run_as_user, then lock files are always stored in the spool dir directly. Instead of installing the lockdir and piddir at installation time, we create them on startup time now if they are missing. This is necessary if lockdir or piddir are a tmpfs.
author markus schnalke <meillo@marmaro.de>
date Wed, 30 May 2012 09:38:38 +0200
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 }