Mercurial > masqmail
comparison src/address.c @ 389:bc9a7845b53a
Refactoring and code layouting.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Sat, 18 Feb 2012 13:43:30 +0100 |
parents | b27f66555ba8 |
children | 9b93c0a3bd8c |
comparison
equal
deleted
inserted
replaced
388:aa40710f09fe | 389:bc9a7845b53a |
---|---|
23 create_address(gchar *path, gboolean is_rfc821) | 23 create_address(gchar *path, gboolean is_rfc821) |
24 { | 24 { |
25 address *addr; | 25 address *addr; |
26 addr = _create_address(path, NULL, is_rfc821); | 26 addr = _create_address(path, NULL, is_rfc821); |
27 | 27 |
28 if (addr != NULL) { | 28 if (addr) { |
29 addr_unmark_delivered(addr); | 29 addr_unmark_delivered(addr); |
30 } | 30 } |
31 return addr; | 31 return addr; |
32 } | 32 } |
33 | 33 |
34 address* | 34 address* |
35 create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain) | 35 create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain) |
36 { | 36 { |
37 address *addr = create_address(path, is_rfc821); | 37 address *addr = create_address(path, is_rfc821); |
38 | 38 |
39 if (addr != NULL && addr->domain == NULL) { | 39 if (addr && !addr->domain) { |
40 addr->domain = g_strdup(domain); | 40 addr->domain = g_strdup(domain); |
41 } | 41 } |
42 return addr; | 42 return addr; |
43 } | 43 } |
44 | 44 |
45 /* nothing special about pipes here, but its only called for that purpose */ | 45 /* nothing special about pipes here, but its only called for that purpose */ |
50 | 50 |
51 if (addr) { | 51 if (addr) { |
52 memset(addr, 0, sizeof(address)); | 52 memset(addr, 0, sizeof(address)); |
53 addr->address = g_strchomp(g_strdup(path)); | 53 addr->address = g_strchomp(g_strdup(path)); |
54 addr->local_part = g_strdup(addr->address); | 54 addr->local_part = g_strdup(addr->address); |
55 | |
56 addr->domain = g_strdup("localhost"); /* quick hack */ | 55 addr->domain = g_strdup("localhost"); /* quick hack */ |
57 } | 56 } |
58 return addr; | 57 return addr; |
59 } | 58 } |
60 | 59 |
61 void | 60 void |
62 destroy_address(address *addr) | 61 destroy_address(address *addr) |
63 { | 62 { |
64 DEBUG(6) debugf("destroy_address entered\n"); | 63 DEBUG(6) debugf("destroy_address entered\n"); |
65 | |
66 g_free(addr->address); | 64 g_free(addr->address); |
67 g_free(addr->local_part); | 65 g_free(addr->local_part); |
68 g_free(addr->domain); | 66 g_free(addr->domain); |
69 | |
70 g_free(addr); | 67 g_free(addr); |
71 } | 68 } |
72 | 69 |
73 address* | 70 address* |
74 copy_modify_address(const address *orig, gchar *l_part, gchar *dom) | 71 copy_modify_address(const address *orig, gchar *l_part, gchar *dom) |
76 address *addr = NULL; | 73 address *addr = NULL; |
77 | 74 |
78 if (!orig) { | 75 if (!orig) { |
79 return NULL; | 76 return NULL; |
80 } | 77 } |
81 | 78 if (!(addr = g_malloc(sizeof(address)))) { |
82 if ((addr = g_malloc(sizeof(address))) == NULL) { | |
83 return NULL; | 79 return NULL; |
84 } | 80 } |
85 | |
86 addr->address = g_strdup(orig->address); | 81 addr->address = g_strdup(orig->address); |
87 | 82 addr->local_part = l_part ? g_strdup(l_part) : |
88 if (l_part == NULL) | 83 g_strdup(orig->local_part); |
89 addr->local_part = g_strdup(orig->local_part); | 84 addr->domain = dom ? g_strdup(dom) : g_strdup(orig->domain); |
90 else | |
91 addr->local_part = g_strdup(l_part); | |
92 | |
93 if (dom == NULL) | |
94 addr->domain = g_strdup(orig->domain); | |
95 else | |
96 addr->domain = g_strdup(dom); | |
97 | |
98 addr->flags = 0; | 85 addr->flags = 0; |
99 addr->children = NULL; | 86 addr->children = NULL; |
100 addr->parent = NULL; | 87 addr->parent = NULL; |
101 return addr; | 88 return addr; |
102 } | 89 } |
103 | 90 |
104 gboolean | 91 gboolean |
105 addr_isequal(address *addr1, address *addr2, int (*cmpfunc) (const char*, const char*)) | 92 addr_isequal(address *addr1, address *addr2, |
93 int (*cmpfunc) (const char*, const char*)) | |
106 { | 94 { |
107 return (cmpfunc(addr1->local_part, addr2->local_part) == 0) | 95 return (cmpfunc(addr1->local_part, addr2->local_part)==0) && |
108 && (strcasecmp(addr1->domain, addr2->domain) == 0); | 96 (strcasecmp(addr1->domain, addr2->domain)==0); |
109 } | 97 } |
110 | 98 |
111 /* searches in ancestors of addr1 */ | 99 /* searches in ancestors of addr1 */ |
112 gboolean | 100 gboolean |
113 addr_isequal_parent(address *addr1, address *addr2, int (*cmpfunc) (const char*, const char*)) | 101 addr_isequal_parent(address *addr1, address *addr2, |
102 int (*cmpfunc) (const char*, const char*)) | |
114 { | 103 { |
115 address *addr; | 104 address *addr; |
116 | 105 |
117 for (addr = addr1; addr; addr = addr->parent) | 106 for (addr = addr1; addr; addr = addr->parent) { |
118 if (addr_isequal(addr, addr2, cmpfunc)) | 107 if (addr_isequal(addr, addr2, cmpfunc)) { |
119 return TRUE; | 108 return TRUE; |
120 | 109 } |
110 } | |
121 return FALSE; | 111 return FALSE; |
122 } | 112 } |
123 | 113 |
124 /* careful, this is recursive */ | 114 /* careful, this is recursive */ |
125 /* returns TRUE if ALL children have been delivered */ | 115 /* returns TRUE if ALL children have been delivered */ |
126 gboolean | 116 gboolean |
127 addr_is_delivered_children(address *addr) | 117 addr_is_delivered_children(address *addr) |
128 { | 118 { |
129 GList *addr_node; | 119 GList *addr_node; |
130 | 120 |
131 if (addr->children == NULL) | 121 if (!addr->children) { |
132 return addr_is_delivered(addr); | 122 return addr_is_delivered(addr); |
133 | 123 } |
134 foreach(addr->children, addr_node) { | 124 foreach(addr->children, addr_node) { |
135 address *addr = (address *) (addr_node->data); | 125 address *addr = (address *) (addr_node->data); |
136 if (!addr_is_delivered_children(addr)) | 126 if (!addr_is_delivered_children(addr)) { |
137 return FALSE; | 127 return FALSE; |
128 } | |
138 } | 129 } |
139 return TRUE; | 130 return TRUE; |
140 } | 131 } |
141 | 132 |
142 /* careful, this is recursive */ | 133 /* careful, this is recursive */ |
144 gboolean | 135 gboolean |
145 addr_is_finished_children(address *addr) | 136 addr_is_finished_children(address *addr) |
146 { | 137 { |
147 GList *addr_node; | 138 GList *addr_node; |
148 | 139 |
149 if (addr->children == NULL) | 140 if (!addr->children) { |
150 return (addr_is_failed(addr) || addr_is_delivered(addr)); | 141 return (addr_is_failed(addr) || addr_is_delivered(addr)); |
151 | 142 } |
152 foreach(addr->children, addr_node) { | 143 foreach(addr->children, addr_node) { |
153 address *addr = (address *) (addr_node->data); | 144 address *addr = (address *) (addr_node->data); |
154 if (!addr_is_finished_children(addr)) | 145 if (!addr_is_finished_children(addr)) { |
155 return FALSE; | 146 return FALSE; |
147 } | |
156 } | 148 } |
157 return TRUE; | 149 return TRUE; |
158 } | 150 } |
159 | 151 |
160 /* find original address */ | 152 /* find original address */ |
161 address* | 153 address* |
162 addr_find_ancestor(address *addr) | 154 addr_find_ancestor(address *addr) |
163 { | 155 { |
164 while (addr->parent) | 156 while (addr->parent) { |
165 addr = addr->parent; | 157 addr = addr->parent; |
158 } | |
166 return addr; | 159 return addr; |
167 } | 160 } |
168 | 161 |
169 gchar* | 162 gchar* |
170 addr_string(address *addr) | 163 addr_string(address *addr) |
171 { | 164 { |
172 static gchar *buffer = NULL; | 165 static gchar *buffer = NULL; |
173 | 166 |
174 if (addr == NULL) { | 167 if (!addr) { |
175 g_free(buffer); | 168 g_free(buffer); |
176 buffer = NULL; | 169 buffer = NULL; |
177 return NULL; | 170 return NULL; |
178 } | 171 } |
179 if (buffer) | 172 if (buffer) { |
180 g_free(buffer); | 173 g_free(buffer); |
181 | 174 } |
182 if (addr->local_part[0] == '\0') { | 175 if (!*addr->local_part) { |
183 buffer = g_strdup("<>"); | 176 buffer = g_strdup("<>"); |
184 } else { | 177 } else { |
185 buffer = g_strdup_printf("<%s@%s>", addr->local_part ? addr->local_part : "", addr->domain ? addr->domain : ""); | 178 buffer = g_strdup_printf("<%s@%s>", |
179 addr->local_part ? addr->local_part : "", | |
180 addr->domain ? addr->domain : ""); | |
186 } | 181 } |
187 return buffer; | 182 return buffer; |
188 } | 183 } |