Mercurial > masqmail
annotate src/conf.c @ 221:8742d2cee364
added a note to the long vs. int question in md5.h
Solar Designer explained to me in privat conversation that the
int had performed much better on some systems and that 16bit
ints are very rare. Still I like using the long.
author | meillo@marmaro.de |
---|---|
date | Fri, 23 Jul 2010 10:53:04 +0200 |
parents | 0241aaccfcdb |
children | 8cddc65765bd |
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 | |
13 | 19 #include <pwd.h> |
20 #include <grp.h> | |
0 | 21 |
13 | 22 #include "masqmail.h" |
0 | 23 |
24 masqmail_conf conf; | |
25 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
26 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
27 init_conf() |
0 | 28 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
29 struct passwd *passwd; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
30 struct group *group; |
0 | 31 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
32 memset(&conf, 0, sizeof(masqmail_conf)); |
0 | 33 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
34 conf.orig_uid = getuid(); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
35 conf.orig_gid = getgid(); |
0 | 36 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
37 if ((passwd = getpwnam(DEF_MAIL_USER))) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
38 conf.mail_uid = passwd->pw_uid; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
39 else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
40 fprintf(stderr, "user %s not found! (terminating)\n", DEF_MAIL_USER); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
41 exit(EXIT_FAILURE); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
42 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
43 if ((group = getgrnam(DEF_MAIL_GROUP))) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
44 conf.mail_gid = group->gr_gid; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
45 else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
46 fprintf(stderr, "group %s not found! (terminating)\n", DEF_MAIL_GROUP); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
47 exit(EXIT_FAILURE); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
48 } |
0 | 49 } |
50 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
51 static gchar* true_strings[] = { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
52 "yes", "on", "true", NULL |
0 | 53 }; |
54 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
55 static gchar *false_strings[] = { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
56 "no", "off", "false", NULL |
0 | 57 }; |
58 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
59 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
60 parse_boolean(gchar * rval) |
0 | 61 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
62 gchar **str; |
0 | 63 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
64 DEBUG(6) fprintf(stderr, "parse_boolean: %s\n", rval); |
0 | 65 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
66 str = true_strings; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
67 while (*str) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
68 if (strncasecmp(*str, rval, strlen(*str)) == 0) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
69 return TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
70 str++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
71 } |
0 | 72 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
73 str = false_strings; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
74 while (*str) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
75 if (strncasecmp(*str, rval, strlen(*str)) == 0) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
76 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
77 str++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
78 } |
0 | 79 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
80 fprintf(stderr, "cannot parse value '%s'\n", rval); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
81 exit(EXIT_FAILURE); |
0 | 82 } |
83 | |
84 /* make a list from each line in a file */ | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
85 static GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
86 parse_list_file(gchar * fname) |
0 | 87 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
88 GList *list = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
89 FILE *fptr; |
0 | 90 |
28 | 91 if ((fptr = fopen(fname, "rt")) == NULL) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
92 logwrite(LOG_ALERT, "could not open %s for reading: %s\n", fname, strerror(errno)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
93 exit(EXIT_FAILURE); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
94 } |
0 | 95 |
28 | 96 gchar buf[256]; |
97 | |
98 while (!feof(fptr)) { | |
99 fgets(buf, 255, fptr); | |
100 if (buf[0] && (buf[0] != '#') && (buf[0] != '\n')) { | |
101 g_strchomp(buf); | |
114 | 102 DEBUG(6) fprintf(stderr,"parse_list_file: item = %s\n", buf); |
28 | 103 list = g_list_append(list, g_strdup(buf)); |
104 } | |
105 } | |
106 fclose(fptr); | |
107 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
108 return list; |
0 | 109 } |
110 | |
13 | 111 /* given a semicolon separated string, this function makes a GList out of it. */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
112 GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
113 parse_list(gchar * line, gboolean read_file) |
0 | 114 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
115 GList *list = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
116 gchar buf[256]; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
117 gchar *p, *q; |
0 | 118 |
114 | 119 DEBUG(6) fprintf(stderr, "parsing list %s, file?:%d\n", line, read_file); |
0 | 120 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
121 p = line; |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
122 while (*p != '\0') { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
123 q = buf; |
0 | 124 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
125 while (*p && (*p != ';') && (q < buf + 255)) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
126 *(q++) = *(p++); |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
127 *q = '\0'; |
0 | 128 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
129 if ((buf[0] == '/') && (read_file)) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
130 /* item is a filename, include its contents */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
131 list = g_list_concat(list, parse_list_file(buf)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
132 else |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
133 /* just a normal item */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
134 list = g_list_append(list, g_strdup(buf)); |
0 | 135 |
114 | 136 DEBUG(6) fprintf(stderr, "item = %s\n", buf); |
0 | 137 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
138 if (*p) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
139 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
140 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
141 return list; |
0 | 142 } |
143 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
144 static GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
145 parse_address_list(gchar * line, gboolean read_file) |
0 | 146 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
147 GList *plain_list = parse_list(line, read_file); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
148 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
149 GList *list = NULL; |
0 | 150 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
151 foreach(plain_list, node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
152 gchar *item = (gchar *) (node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
153 address *addr = create_address(item, TRUE); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
154 if (addr) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
155 list = g_list_append(list, addr); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
156 g_free(item); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
157 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
158 g_list_free(plain_list); |
0 | 159 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
160 return list; |
0 | 161 } |
162 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
163 static GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
164 parse_resolve_list(gchar * line) |
0 | 165 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
166 GList *list; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
167 GList *list_node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
168 GList *res_list = NULL; |
0 | 169 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
170 list = parse_list(line, FALSE); |
28 | 171 if (!list) { |
172 return NULL; | |
173 } | |
174 | |
175 foreach(list, list_node) { | |
176 gchar *item = (gchar *) (list_node->data); | |
177 if (strcmp(item, "byname") == 0) { | |
178 res_list = g_list_append(res_list, resolve_byname); | |
0 | 179 #ifdef ENABLE_RESOLVER |
28 | 180 } else if (strcmp(item, "dns_a") == 0) { |
181 res_list = g_list_append(res_list, resolve_dns_a); | |
182 } else if (strcmp(item, "dns_mx") == 0) { | |
183 res_list = g_list_append(res_list, resolve_dns_mx); | |
0 | 184 #endif |
28 | 185 } else { |
186 logwrite(LOG_ALERT, "unknown resolver %s\n", item); | |
187 exit(EXIT_FAILURE); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
188 } |
28 | 189 g_free(item); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
190 } |
28 | 191 g_list_free(list); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
192 return res_list; |
0 | 193 } |
194 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
195 static interface* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
196 parse_interface(gchar * line, gint def_port) |
0 | 197 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
198 gchar buf[256]; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
199 gchar *p, *q; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
200 interface *iface; |
0 | 201 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
202 DEBUG(6) fprintf(stderr, "parse_interface: %s\n", line); |
0 | 203 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
204 p = line; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
205 q = buf; |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
206 while ((*p != '\0') && (*p != ':') && (q < buf + 255)) |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
207 *(q++) = *(p++); |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
208 *q = '\0'; |
0 | 209 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
210 iface = g_malloc(sizeof(interface)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
211 iface->address = g_strdup(buf); |
0 | 212 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
213 if (*p) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
214 p++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
215 iface->port = atoi(p); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
216 } else |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
217 iface->port = def_port; |
114 | 218 DEBUG(6) fprintf(stderr,"rval=%s, address:port=%s:%i\n",line, iface->address, iface->port); |
0 | 219 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
220 return iface; |
0 | 221 } |
222 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
223 #ifdef ENABLE_IDENT /* so far used for that only */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
224 static struct in_addr* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
225 parse_network(gchar * line, gint def_port) |
0 | 226 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
227 gchar buf[256]; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
228 gchar *p, *q; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
229 struct in_addr addr, mask_addr, net_addr, *p_net_addr; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
230 guint n; |
0 | 231 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
232 DEBUG(6) fprintf(stderr, "parse_network: %s\n", line); |
0 | 233 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
234 p = line; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
235 q = buf; |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
236 while ((*p != '\0') && (*p != '/') && (q < buf + 255)) |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
237 *(q++) = *(p++); |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
238 *q = '\0'; |
0 | 239 |
28 | 240 if ((addr.s_addr = inet_addr(buf)) == INADDR_NONE) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
241 fprintf(stderr, "'%s' is not a valid address (must be ip)\n", buf); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
242 exit(EXIT_FAILURE); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
243 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
244 |
28 | 245 if (*p) { |
246 guint i; | |
247 p++; | |
248 i = atoi(p); | |
249 if ((i >= 0) && (i <= 32)) | |
250 n = i ? ~((1 << (32 - i)) - 1) : 0; | |
251 else { | |
252 fprintf(stderr, "'%d' is not a valid net mask (must be >= 0 and <= 32)\n", i); | |
253 exit(EXIT_FAILURE); | |
254 } | |
255 } else | |
256 n = 0; | |
257 | |
258 mask_addr.s_addr = htonl(n); | |
259 net_addr.s_addr = mask_addr.s_addr & addr.s_addr; | |
260 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
261 p_net_addr = g_malloc(sizeof(struct in_addr)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
262 p_net_addr->s_addr = net_addr.s_addr; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
263 return p_net_addr; |
0 | 264 } |
265 #endif | |
266 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
267 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
268 eat_comments(FILE * in) |
0 | 269 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
270 gint c; |
0 | 271 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
272 for (c = fgetc(in); (c == '#' || isspace(c)) && c != EOF; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
273 c = fgetc(in)) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
274 if (c == '#') { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
275 gint c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
276 for (c = fgetc(in); (c != '\n') && (c != EOF); c = fgetc(in)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
277 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
278 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
279 if (c == EOF) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
280 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
281 ungetc(c, in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
282 return TRUE; |
0 | 283 } |
284 | |
285 /* after parsing, eat trailing character until LF */ | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
286 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
287 eat_line_trailing(FILE * in) |
0 | 288 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
289 gint c; |
0 | 290 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
291 for (c = fgetc(in); c != EOF && c != '\n'; c = fgetc(in)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
292 if (c == EOF) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
293 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
294 return TRUE; |
0 | 295 } |
296 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
297 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
298 eat_spaces(FILE * in) |
0 | 299 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
300 gint c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
301 |
28 | 302 for (c = fgetc(in); c != EOF && isspace(c); c = fgetc(in)) { |
303 /* empty */ | |
304 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
305 if (c == EOF) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
306 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
307 ungetc(c, in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
308 return TRUE; |
0 | 309 } |
310 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
311 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
312 read_lval(FILE * in, gchar * buf, gint size) |
0 | 313 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
314 gint c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
315 gchar *ptr = buf; |
0 | 316 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
317 DEBUG(6) fprintf(stderr, "read_lval()\n"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
318 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
319 if (!eat_spaces(in)) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
320 return FALSE; |
0 | 321 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
322 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
323 DEBUG(6) fprintf(stderr, "read_lval() 2\n"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
324 while ((isalnum(c) || c == '_' || c == '-' || c == '.') |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
325 && (ptr < buf + size - 1) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
326 && (c != EOF)) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
327 *ptr = c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
328 ptr++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
329 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
330 } |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
331 *ptr = '\0'; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
332 ungetc(c, in); |
0 | 333 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
334 if (c == EOF) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
335 fprintf(stderr, "unexpected EOF after %s\n", buf); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
336 return FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
337 } else if (ptr >= buf + size - 1) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
338 fprintf(stderr, "lval too long\n"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
339 } |
0 | 340 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
341 eat_spaces(in); |
0 | 342 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
343 DEBUG(6) fprintf(stderr, "lval = %s\n", buf); |
0 | 344 |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
345 return buf[0] != '\0'; |
0 | 346 } |
347 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
348 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
349 read_rval(FILE * in, gchar * buf, gint size) |
0 | 350 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
351 gint c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
352 gchar *ptr = buf; |
0 | 353 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
354 DEBUG(6) fprintf(stderr, "read_rval()\n"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
355 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
356 if (!eat_spaces(in)) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
357 return FALSE; |
0 | 358 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
359 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
360 if (c != '\"') { |
115
315773f814f7
allow `:' unquoted too; updated masqmail.conf.5 (Thanks to Paolo)
meillo@marmaro.de
parents:
114
diff
changeset
|
361 while ((isalnum(c) || c == '_' || c == '-' || c == '.' |
315773f814f7
allow `:' unquoted too; updated masqmail.conf.5 (Thanks to Paolo)
meillo@marmaro.de
parents:
114
diff
changeset
|
362 || c == '/' || c == '@' || c == ';' || c == ':') |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
363 && (ptr < buf + size - 1) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
364 && (c != EOF)) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
365 *ptr = c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
366 ptr++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
367 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
368 } |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
369 *ptr = '\0'; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
370 ungetc(c, in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
371 } else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
372 gboolean escape = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
373 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
374 while (((c != '\"') || escape) && (ptr < buf + size - 1)) { |
13 | 375 if (c != '\n') { /* ignore line breaks */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
376 if ((c == '\\') && (!escape)) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
377 escape = TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
378 } else { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
379 *ptr = c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
380 ptr++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
381 escape = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
382 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
383 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
384 c = fgetc(in); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
385 } |
14
a8f3424347dc
replaced number 0 with character \0 where appropriate
meillo@marmaro.de
parents:
13
diff
changeset
|
386 *ptr = '\0'; |
0 | 387 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
388 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
389 eat_line_trailing(in); |
0 | 390 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
391 DEBUG(6) fprintf(stderr, "rval = %s\n", buf); |
0 | 392 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
393 return TRUE; |
0 | 394 } |
395 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
396 static gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
397 read_statement(FILE * in, gchar * lval, gint lsize, gchar * rval, gint rsize) |
0 | 398 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
399 gint c; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
400 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
401 DEBUG(6) fprintf(stderr, "read_statement()\n"); |
0 | 402 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
403 /* eat comments and empty lines: */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
404 if (!eat_comments(in)) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
405 return FALSE; |
0 | 406 |
28 | 407 if (!read_lval(in, lval, lsize)) { |
408 return FALSE; | |
409 } | |
410 | |
114 | 411 DEBUG(6) fprintf(stderr, " lval = %s\n", lval); |
28 | 412 if ((c = fgetc(in) == '=')) { |
413 if (read_rval(in, rval, rsize)) { | |
114 | 414 DEBUG(6) fprintf(stderr, " rval = %s\n", rval); |
28 | 415 return TRUE; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
416 } |
28 | 417 } else { |
114 | 418 DEBUG(6) fprintf(stderr," '=' expected after %s, char was '%c'\n", lval, c); |
28 | 419 fprintf(stderr, "'=' expected after %s, char was '%c'\n", lval, c); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
420 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
421 return FALSE; |
0 | 422 } |
423 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
424 gboolean |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
425 read_conf(gchar * filename) |
0 | 426 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
427 FILE *in; |
0 | 428 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
429 conf.log_max_pri = 7; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
430 conf.do_relay = TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
431 conf.alias_local_cmp = strcmp; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
432 conf.max_defer_time = 86400 * 4; /* 4 days */ |
120
cd59a5b4d3dd
added support for SMTP SIZE 0 (unlimited)
meillo@marmaro.de
parents:
117
diff
changeset
|
433 conf.max_msg_size = 0; /* no limit on msg size */ |
151 | 434 conf.spool_dir = SPOOL_DIR; |
152 | 435 conf.mail_dir = "/var/mail"; |
206
0241aaccfcdb
default listen_addresses: use 127.0.0.1 instead of `localhost'
meillo@marmaro.de
parents:
205
diff
changeset
|
436 /* we use 127.0.0.1 because `localhost' could be bound to some |
0241aaccfcdb
default listen_addresses: use 127.0.0.1 instead of `localhost'
meillo@marmaro.de
parents:
205
diff
changeset
|
437 other IP address. This is unlikely but could be. Using |
0241aaccfcdb
default listen_addresses: use 127.0.0.1 instead of `localhost'
meillo@marmaro.de
parents:
205
diff
changeset
|
438 127.0.0.1 is more safe. See mailing list for details */ |
0241aaccfcdb
default listen_addresses: use 127.0.0.1 instead of `localhost'
meillo@marmaro.de
parents:
205
diff
changeset
|
439 conf.listen_addresses = g_list_append(NULL, parse_interface("127.0.0.1", 25)); |
0 | 440 |
28 | 441 if ((in = fopen(filename, "r")) == NULL) { |
155 | 442 logwrite(LOG_ALERT, "could not open config file %s: %s\n", filename, strerror(errno)); |
28 | 443 return FALSE; |
444 } | |
0 | 445 |
28 | 446 gchar lval[256], rval[2048]; |
447 while (read_statement(in, lval, 256, rval, 2048)) { | |
114 | 448 DEBUG(6) fprintf(stderr,"read_conf(): lval=%s\n", lval); |
28 | 449 if (strcmp(lval, "debug_level") == 0) |
450 conf.debug_level = atoi(rval); | |
451 else if (strcmp(lval, "run_as_user") == 0) { | |
452 if (!conf.run_as_user) /* you should not be able to reset that flag */ | |
453 conf.run_as_user = parse_boolean(rval); | |
454 } else if (strcmp(lval, "use_syslog") == 0) | |
455 conf.use_syslog = parse_boolean(rval); | |
456 else if (strcmp(lval, "mail_dir") == 0) | |
457 conf.mail_dir = g_strdup(rval); | |
458 else if (strcmp(lval, "lock_dir") == 0) | |
459 conf.lock_dir = g_strdup(rval); | |
460 else if (strcmp(lval, "spool_dir") == 0) | |
461 conf.spool_dir = g_strdup(rval); | |
462 else if (strcmp(lval, "log_dir") == 0) | |
463 conf.log_dir = g_strdup(rval); | |
464 else if (strcmp(lval, "host_name") == 0) { | |
465 if (rval[0] != '/') | |
466 conf.host_name = g_strdup(rval); | |
467 else { | |
468 char buf[256]; | |
469 FILE *fptr = fopen(rval, "rt"); | |
470 if (fptr) { | |
155 | 471 logwrite(LOG_ALERT, "could not open %s: %s\n", rval, strerror(errno)); |
28 | 472 return FALSE; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
473 } |
28 | 474 fgets(buf, 255, fptr); |
475 g_strchomp(buf); | |
476 conf.host_name = g_strdup(buf); | |
477 fclose(fptr); | |
478 } | |
479 } else if (strcmp(lval, "local_hosts") == 0) | |
480 conf.local_hosts = parse_list(rval, FALSE); | |
481 else if (strcmp(lval, "local_addresses") == 0) | |
482 conf.local_addresses = parse_list(rval, TRUE); | |
483 else if (strcmp(lval, "not_local_addresses") == 0) | |
484 conf.not_local_addresses = parse_list(rval, TRUE); | |
485 else if (strcmp(lval, "local_nets") == 0) | |
486 conf.local_nets = parse_list(rval, FALSE); | |
487 else if (strcmp(lval, "do_save_envelope_to") == 0) | |
488 conf.do_save_envelope_to = parse_boolean(rval); | |
489 else if (strcmp(lval, "defer_all") == 0) | |
490 conf.defer_all = parse_boolean(rval); | |
491 else if (strcmp(lval, "do_relay") == 0) | |
492 conf.do_relay = parse_boolean(rval); | |
493 else if (strcmp(lval, "alias_file") == 0) { | |
494 conf.alias_file = g_strdup(rval); | |
495 } else if (strcmp(lval, "alias_local_caseless") == 0) { | |
496 conf.alias_local_cmp = parse_boolean(rval) ? strcasecmp : strcmp; | |
497 } else if (strcmp(lval, "mbox_default") == 0) { | |
498 conf.mbox_default = g_strdup(rval); | |
499 } else if (strcmp(lval, "mbox_users") == 0) { | |
500 conf.mbox_users = parse_list(rval, TRUE); | |
501 } else if (strcmp(lval, "mda_users") == 0) { | |
502 conf.mda_users = parse_list(rval, TRUE); | |
503 } else if (strcmp(lval, "mda") == 0) { | |
504 conf.mda = g_strdup(rval); | |
505 } else if (strcmp(lval, "mda_fromline") == 0) { | |
506 conf.mda_fromline = parse_boolean(rval); | |
507 } else if (strcmp(lval, "mda_fromhack") == 0) { | |
508 conf.mda_fromhack = parse_boolean(rval); | |
509 } else if (strcmp(lval, "pipe_fromline") == 0) { | |
510 conf.pipe_fromline = parse_boolean(rval); | |
511 } else if (strcmp(lval, "pipe_fromhack") == 0) { | |
512 conf.pipe_fromhack = parse_boolean(rval); | |
513 } else if (strcmp(lval, "listen_addresses") == 0) { | |
514 GList *node; | |
515 GList *tmp_list = parse_list(rval, FALSE); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
516 |
28 | 517 conf.listen_addresses = NULL; |
518 foreach(tmp_list, node) { | |
519 conf.listen_addresses = g_list_append(conf.listen_addresses, parse_interface((gchar *) (node-> data), 25)); | |
520 g_free(node->data); | |
521 } | |
522 g_list_free(tmp_list); | |
523 } else if (strcmp(lval, "ident_trusted_nets") == 0) { | |
524 #ifdef ENABLE_IDENT | |
525 GList *node; | |
526 GList *tmp_list = parse_list(rval, FALSE); | |
527 | |
528 conf.ident_trusted_nets = NULL; | |
529 foreach(tmp_list, node) { | |
530 conf.ident_trusted_nets = g_list_append(conf.ident_trusted_nets, parse_network((gchar *) (node->data), 25)); | |
531 g_free(node->data); | |
532 } | |
533 g_list_free(tmp_list); | |
0 | 534 #else |
155 | 535 logwrite(LOG_WARNING, "%s ignored: not compiled with ident support\n", lval); |
0 | 536 #endif |
28 | 537 } else if ((strncmp(lval, "connect_route.", 14) == 0) |
538 || (strncmp(lval, "online_routes.", 14) == 0)) { | |
539 GList *file_list = parse_list(rval, FALSE); | |
540 table_pair *pair = create_pair(&(lval[14]), file_list); | |
541 conf.connect_routes = g_list_append(conf.connect_routes, pair); | |
542 } else if (strcmp(lval, "local_net_route") == 0) { | |
543 conf.local_net_routes = parse_list(rval, FALSE); | |
544 } else if (strcmp(lval, "online_detect") == 0) | |
545 conf.online_detect = g_strdup(rval); | |
546 else if (strcmp(lval, "online_file") == 0) | |
547 conf.online_file = g_strdup(rval); | |
548 else if (strcmp(lval, "online_pipe") == 0) | |
549 conf.online_pipe = g_strdup(rval); | |
550 else if (strcmp(lval, "do_queue") == 0) | |
551 conf.do_queue = parse_boolean(rval); | |
192 | 552 else if (strcmp(lval, "errmsg_file") == 0) |
28 | 553 conf.errmsg_file = g_strdup(rval); |
554 else if (strcmp(lval, "warnmsg_file") == 0) | |
555 conf.warnmsg_file = g_strdup(rval); | |
556 else if (strcmp(lval, "warn_intervals") == 0) | |
557 conf.warn_intervals = parse_list(rval, FALSE); | |
558 else if (strcmp(lval, "max_defer_time") == 0) { | |
559 gint dummy; | |
560 gint ival = time_interval(rval, &dummy); | |
561 if (ival < 0) | |
155 | 562 logwrite(LOG_WARNING, "invalid time interval for 'max_defer_time': %s\n", rval); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
563 else |
28 | 564 conf.max_defer_time = ival; |
565 } else if (strcmp(lval, "log_user") == 0) | |
566 conf.log_user = g_strdup(rval); | |
117
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
567 else if(strcmp(lval, "max_msg_size") == 0) { |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
568 conf.max_msg_size = atol(rval); |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
569 DEBUG(6) fprintf(stderr,"rval=%s, conf.max_msg_size=%ld\n", |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
570 rval, conf.max_msg_size); |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
571 } |
28 | 572 else |
155 | 573 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); |
28 | 574 } |
575 fclose(in); | |
0 | 576 |
156
ee2afbf92428
require host_name to be set in config file
meillo@marmaro.de
parents:
155
diff
changeset
|
577 if (!conf.host_name) { |
ee2afbf92428
require host_name to be set in config file
meillo@marmaro.de
parents:
155
diff
changeset
|
578 logwrite(LOG_ALERT, "`host_name' MUST be set in masqmail.conf. See man page\n"); |
ee2afbf92428
require host_name to be set in config file
meillo@marmaro.de
parents:
155
diff
changeset
|
579 return FALSE; |
ee2afbf92428
require host_name to be set in config file
meillo@marmaro.de
parents:
155
diff
changeset
|
580 } |
ee2afbf92428
require host_name to be set in config file
meillo@marmaro.de
parents:
155
diff
changeset
|
581 |
28 | 582 if (conf.errmsg_file == NULL) |
583 conf.errmsg_file = g_strdup(DATA_DIR "/tpl/failmsg.tpl"); | |
584 if (conf.warnmsg_file == NULL) | |
585 conf.warnmsg_file = g_strdup(DATA_DIR "/tpl/warnmsg.tpl"); | |
0 | 586 |
28 | 587 if (conf.lock_dir == NULL) |
588 conf.lock_dir = g_strdup_printf("%s/lock/", conf.spool_dir); | |
0 | 589 |
28 | 590 if (conf.mbox_default == NULL) |
591 conf.mbox_default = g_strdup("mbox"); | |
0 | 592 |
28 | 593 if (conf.warn_intervals == NULL) |
594 conf.warn_intervals = parse_list("1h;4h;8h;1d;2d;3d", FALSE); | |
595 | |
157
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
596 if (!conf.local_hosts) { |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
597 char* shortname = strdup(conf.host_name); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
598 char* p = strchr(shortname, '.'); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
599 if (p) { |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
600 *p = '\0'; |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
601 } |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
602 /* we don't care if shortname and conf.host_name are the same */ |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
603 char* local_hosts_str = g_strdup_printf("localhost;%s;%s", shortname, conf.host_name); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
604 conf.local_hosts = parse_list(local_hosts_str, FALSE); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
605 free(shortname); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
606 free(local_hosts_str); |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
607 } |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
608 |
586f001f5bbd
local_hosts defaults to localhost;foo;foo.example.org now
meillo@marmaro.de
parents:
156
diff
changeset
|
609 |
28 | 610 return TRUE; |
0 | 611 } |
612 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
613 connect_route* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
614 read_route(gchar * filename, gboolean is_local_net) |
0 | 615 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
616 gboolean ok = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
617 FILE *in; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
618 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
619 connect_route *route = g_malloc(sizeof(connect_route)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
620 memset(route, 0, sizeof(connect_route)); |
0 | 621 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
622 DEBUG(5) debugf("read_route, filename = %s\n", filename); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
623 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
624 route->filename = g_strdup(filename); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
625 route->name = g_strdup(filename); /* quick hack */ |
0 | 626 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
627 route->protocol = g_strdup("smtp"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
628 route->expand_h_sender_address = TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
629 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
630 route->is_local_net = is_local_net; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
631 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
632 route->do_pipelining = TRUE; |
0 | 633 |
28 | 634 if ((in = fopen(route->filename, "r")) == NULL) { |
635 logwrite(LOG_ALERT, "could not open route file %s: %s\n", route->filename, strerror(errno)); | |
636 g_free(route); | |
637 return NULL; | |
638 } | |
0 | 639 |
28 | 640 gchar lval[256], rval[2048]; |
641 while (read_statement(in, lval, 256, rval, 2048)) { | |
642 if (strcmp(lval, "protocol") == 0) | |
643 route->protocol = g_strdup(rval); | |
644 else if (strcmp(lval, "mail_host") == 0) | |
178 | 645 route->mail_host = parse_interface(rval, 25); |
28 | 646 else if (strcmp(lval, "helo_name") == 0) |
647 route->helo_name = g_strdup(rval); | |
648 else if (strcmp(lval, "wrapper") == 0) | |
649 route->wrapper = g_strdup(rval); | |
650 else if (strcmp(lval, "connect_error_fail") == 0) | |
651 route->connect_error_fail = parse_boolean(rval); | |
652 else if (strcmp(lval, "do_correct_helo") == 0) | |
653 route->do_correct_helo = parse_boolean(rval); | |
654 else if (strcmp(lval, "do_pipelining") == 0) | |
655 route->do_pipelining = parse_boolean(rval); | |
656 else if (strcmp(lval, "allowed_return_paths") == 0) | |
657 route->allowed_return_paths = parse_address_list(rval, TRUE); | |
658 else if (strcmp(lval, "allowed_mail_locals") == 0) | |
659 route->allowed_mail_locals = parse_list(rval, TRUE); | |
660 else if (strcmp(lval, "not_allowed_return_paths") == 0) | |
661 route->not_allowed_return_paths = parse_address_list(rval, TRUE); | |
662 else if (strcmp(lval, "not_allowed_mail_locals") == 0) | |
663 route->not_allowed_mail_locals = parse_list(rval, TRUE); | |
664 else if (strcmp(lval, "allowed_rcpt_domains") == 0) | |
665 route->allowed_rcpt_domains = parse_list(rval, TRUE); | |
666 else if (strcmp(lval, "not_allowed_rcpt_domains") == 0) | |
667 route->not_allowed_rcpt_domains = parse_list(rval, TRUE); | |
668 else if (strcmp(lval, "set_h_from_domain") == 0) | |
669 route->set_h_from_domain = g_strdup(rval); | |
670 else if (strcmp(lval, "set_h_reply_to_domain") == 0) | |
671 route->set_h_reply_to_domain = g_strdup(rval); | |
672 else if (strcmp(lval, "set_return_path_domain") == 0) | |
673 route->set_return_path_domain = g_strdup(rval); | |
674 else if (strcmp(lval, "map_return_path_addresses") == 0) { | |
675 GList *node, *list; | |
0 | 676 |
28 | 677 list = parse_list(rval, TRUE); |
678 foreach(list, node) { | |
679 gchar *item = (gchar *) (node->data); | |
680 table_pair *pair = parse_table_pair(item, ':'); | |
681 address *addr = create_address((gchar *) (pair->value), TRUE); | |
682 g_free(pair->value); | |
683 pair->value = (gpointer *) addr; | |
684 route->map_return_path_addresses = g_list_append(route->map_return_path_addresses, pair); | |
685 g_free(item); | |
686 } | |
687 g_list_free(list); | |
688 } else if (strcmp(lval, "map_h_from_addresses") == 0) { | |
689 GList *list, *node; | |
0 | 690 |
28 | 691 list = parse_list(rval, TRUE); |
692 foreach(list, node) { | |
693 gchar *item = (gchar *) (node->data); | |
694 table_pair *pair = parse_table_pair(item, ':'); | |
695 route->map_h_from_addresses = g_list_append(route->map_h_from_addresses, pair); | |
696 g_free(item); | |
697 } | |
698 g_list_free(list); | |
699 } else if (strcmp(lval, "map_h_reply_to_addresses") == 0) { | |
700 GList *list, *node; | |
0 | 701 |
28 | 702 list = parse_list(rval, TRUE); |
703 foreach(list, node) { | |
704 gchar *item = (gchar *) (node->data); | |
705 table_pair *pair = parse_table_pair(item, ':'); | |
706 route->map_h_reply_to_addresses = g_list_append(route->map_h_reply_to_addresses, pair); | |
707 g_free(item); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
708 } |
28 | 709 g_list_free(list); |
710 } else if (strcmp(lval, "map_h_mail_followup_to_addresses") == 0) { | |
711 GList *list, *node; | |
712 | |
713 list = parse_list(rval, TRUE); | |
714 foreach(list, node) { | |
715 gchar *item = (gchar *) (node->data); | |
716 table_pair *pair = parse_table_pair(item, ':'); | |
717 route->map_h_mail_followup_to_addresses = g_list_append(route->map_h_mail_followup_to_addresses, pair); | |
718 g_free(item); | |
719 } | |
720 g_list_free(list); | |
721 } else if (strcmp(lval, "expand_h_sender_domain") == 0) { | |
722 route->expand_h_sender_domain = parse_boolean(rval); | |
723 } else if (strcmp(lval, "expand_h_sender_address") == 0) { | |
724 route->expand_h_sender_address = parse_boolean(rval); | |
725 } else if (strcmp(lval, "resolve_list") == 0) | |
726 route->resolve_list = parse_resolve_list(rval); | |
727 else if (strcmp(lval, "do_ssl") == 0) { | |
728 /* we ignore this. This option is used by sqilconf */ | |
729 ; | |
730 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
731 #ifdef ENABLE_AUTH |
28 | 732 else if (strcmp(lval, "auth_name") == 0) { |
733 route->auth_name = g_strdup(rval); | |
734 } else if (strcmp(lval, "auth_login") == 0) { | |
735 route->auth_login = g_strdup(rval); | |
736 } else if (strcmp(lval, "auth_secret") == 0) { | |
737 route->auth_secret = g_strdup(rval); | |
738 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
739 #else |
28 | 740 else if ((strcmp(lval, "auth_name") == 0) |
741 || (strcmp(lval, "auth_login") == 0) | |
742 || (strcmp(lval, "auth_secret") == 0)) { | |
743 logwrite(LOG_WARNING, "%s ignored: not compiled with auth support.\n", lval); | |
744 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
745 #endif |
190
6b4a101a2455
forgot to remove the pop3_login option in conf.c in the last commit
meillo@marmaro.de
parents:
178
diff
changeset
|
746 else if (strcmp(lval, "pipe") == 0) { |
28 | 747 route->pipe = g_strdup(rval); |
748 } else if (strcmp(lval, "pipe_fromline") == 0) { | |
749 route->pipe_fromline = parse_boolean(rval); | |
750 } else if (strcmp(lval, "pipe_fromhack") == 0) { | |
751 route->pipe_fromhack = parse_boolean(rval); | |
752 } else if (strcmp(lval, "last_route") == 0) { | |
753 route->last_route = parse_boolean(rval); | |
754 } else | |
755 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); | |
756 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
757 |
28 | 758 if (route->resolve_list == NULL) { |
759 if (is_local_net) { | |
760 route->resolve_list = g_list_append(NULL, resolve_byname); | |
761 } else { | |
762 #ifdef ENABLE_RESOLVER | |
763 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_mx); | |
764 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_a); | |
765 #endif | |
766 route->resolve_list = g_list_append(route->resolve_list, resolve_byname); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
767 } |
28 | 768 } |
769 fclose(in); | |
770 ok = TRUE; | |
771 | |
772 /* warn user about misconfigurations: */ | |
773 if ((route->map_h_from_addresses != NULL) && (route->set_h_from_domain != NULL)) { | |
774 logwrite(LOG_WARNING, "'map_h_from_addresses' overrides 'set_h_from_domain'\n"); | |
775 g_free(route->set_h_from_domain); | |
776 route->set_h_from_domain = NULL; | |
777 } | |
778 if ((route->map_h_reply_to_addresses != NULL) && (route->set_h_reply_to_domain != NULL)) { | |
779 logwrite(LOG_WARNING, "'map_h_reply_to_addresses' overrides 'set_h_reply_to_domain'\n"); | |
780 g_free(route->set_h_reply_to_domain); | |
781 route->set_h_reply_to_domain = NULL; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
782 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
783 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
784 if (!ok) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
785 g_free(route); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
786 route = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
787 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
788 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
789 return route; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
790 } |
0 | 791 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
792 static void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
793 _g_list_free_all(GList * list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
794 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
795 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
796 if (list) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
797 foreach(list, node) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
798 g_free(node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
799 g_list_free(list); |
0 | 800 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
801 } |
0 | 802 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
803 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
804 destroy_route(connect_route * r) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
805 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
806 if (r->filename) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
807 g_free(r->filename); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
808 if (r->protocol) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
809 g_free(r->protocol); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
810 if (r->mail_host) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
811 g_free(r->mail_host->address); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
812 g_free(r->mail_host); |
0 | 813 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
814 if (r->wrapper) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
815 g_free(r->wrapper); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
816 if (r->helo_name) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
817 g_free(r->helo_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
818 _g_list_free_all(r->allowed_mail_locals); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
819 _g_list_free_all(r->not_allowed_mail_locals); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
820 _g_list_free_all(r->allowed_rcpt_domains); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
821 _g_list_free_all(r->not_allowed_rcpt_domains); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
822 if (r->set_h_from_domain) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
823 g_free(r->set_h_from_domain); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
824 if (r->set_h_reply_to_domain) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
825 g_free(r->set_h_reply_to_domain); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
826 if (r->set_return_path_domain) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
827 g_free(r->set_return_path_domain); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
828 if (r->map_h_reply_to_addresses) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
829 destroy_table(r->map_h_reply_to_addresses); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
830 if (r->resolve_list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
831 g_list_free(r->resolve_list); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
832 #ifdef ENABLE_AUTH |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
833 if (r->auth_name) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
834 g_free(r->auth_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
835 if (r->auth_login) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
836 g_free(r->auth_login); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
837 if (r->auth_secret) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
838 g_free(r->auth_secret); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
839 #endif |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
840 if (r->pipe) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
841 g_free(r->pipe); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
842 g_free(r); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
843 } |
0 | 844 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
845 GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
846 read_route_list(GList * rf_list, gboolean is_local_net) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
847 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
848 GList *list = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
849 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
850 uid_t saved_uid, saved_gid; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
851 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
852 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
853 set_euidgid(0, 0, &saved_uid, &saved_gid); |
0 | 854 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
855 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
856 foreach(rf_list, node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
857 gchar *fname = (gchar *) (node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
858 connect_route *route = read_route(fname, is_local_net); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
859 if (route) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
860 list = g_list_append(list, route); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
861 else |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
862 logwrite(LOG_ALERT, "could not read route configuration %s\n", fname); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
863 } |
0 | 864 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
865 /* set uid and gid back */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
866 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
867 set_euidgid(saved_uid, saved_gid, NULL, NULL); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
868 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
869 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
870 return list; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
871 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
872 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
873 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
874 destroy_route_list(GList * list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
875 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
876 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
877 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
878 foreach(list, node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
879 connect_route *route = (connect_route *) (node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
880 destroy_route(route); |
0 | 881 } |
882 g_list_free(list); | |
883 } | |
884 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
885 connect_route* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
886 create_local_route() |
0 | 887 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
888 connect_route *route; |
0 | 889 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
890 route = g_malloc(sizeof(connect_route)); |
28 | 891 if (!route) { |
892 return NULL; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
893 } |
28 | 894 memset(route, 0, sizeof(connect_route)); |
895 route->protocol = g_strdup("smtp"); | |
896 route->is_local_net = TRUE; | |
897 route->name = g_strdup("local_net (default)"); | |
898 route->expand_h_sender_address = TRUE; | |
899 route->resolve_list = g_list_append(NULL, resolve_byname); | |
900 route->connect_error_fail = TRUE; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
901 return route; |
0 | 902 } |