Mercurial > masqmail
annotate src/rewrite.c @ 301:55c530a83d51
refactoring
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 09 Dec 2010 15:42:02 -0300 |
parents | 681863fdafbb |
children | 41958685480d |
rev | line source |
---|---|
0 | 1 /* MasqMail |
2 Copyright (C) 1999-2001 Oliver Kurth | |
3 | |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2 of the License, or | |
7 (at your option) any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
17 */ | |
18 | |
19 #ifndef REWRITE_TEST | |
20 #include "masqmail.h" | |
21 #endif | |
22 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
23 gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
24 set_address_header_domain(header * hdr, gchar * domain) |
0 | 25 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
26 gchar *p = hdr->value; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
27 gchar *new_hdr = g_strndup(hdr->header, hdr->value - hdr->header); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
28 gint tmp; |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
29 gchar *loc_beg, *loc_end; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
30 gchar *dom_beg, *dom_end; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
31 gchar *addr_end; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
32 gchar *rewr_string; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
33 gchar *left, *right; |
0 | 34 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
35 while (*p) { |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
36 if (!parse_address_rfc822(p, &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end)) { |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
37 return FALSE; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
38 } |
0 | 39 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
40 if (dom_beg) { |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
41 left = g_strndup(p, dom_beg - p); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
42 right = g_strndup(dom_end, addr_end - dom_end); |
0 | 43 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
44 rewr_string = g_strconcat(left, domain, right, NULL); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
45 } else { |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
46 left = g_strndup(p, loc_end - p); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
47 right = g_strndup(loc_end, addr_end - loc_end); |
0 | 48 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
49 rewr_string = g_strconcat(left, "@", domain, right, NULL); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
50 } |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
51 g_free(left); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
52 g_free(right); |
0 | 53 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
54 p = addr_end; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
55 if (*p == ',') { |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
56 p++; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
57 } |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
58 new_hdr = g_strconcat(new_hdr, rewr_string, *p != '\0' ? "," : NULL, NULL); |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
59 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
60 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
61 tmp = (hdr->value - hdr->header); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
62 g_free(hdr->header); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
63 hdr->header = new_hdr; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
64 hdr->value = hdr->header + tmp; |
0 | 65 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
66 return TRUE; |
0 | 67 } |
68 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
69 gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
70 map_address_header(header * hdr, GList * table) |
0 | 71 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
72 GList *addr_list = addr_list_append_rfc822(NULL, hdr->value, conf.host_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
73 GList *addr_node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
74 gchar *new_hdr = g_strndup(hdr->header, hdr->value - hdr->header); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
75 gboolean did_change = FALSE; |
0 | 76 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
77 foreach(addr_list, addr_node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
78 address *addr = (address *) (addr_node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
79 gchar *rewr_string = (gchar *) table_find_fnmatch(table, addr->local_part); |
0 | 80 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
81 if (rewr_string) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
82 did_change = TRUE; |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
83 } else { |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
84 rewr_string = addr->address; |
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
85 } |
0 | 86 |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
87 if (rewr_string) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
88 new_hdr = g_strconcat(new_hdr, rewr_string, g_list_next(addr_node) ? "," : "\n", NULL); |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
89 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
90 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
91 if (did_change) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
92 g_free(hdr->header); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
93 hdr->header = new_hdr; |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
94 } else { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
95 g_free(new_hdr); |
272
681863fdafbb
refactoring in the small
markus schnalke <meillo@marmaro.de>
parents:
15
diff
changeset
|
96 } |
0 | 97 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
98 return did_change; |
0 | 99 } |