Mercurial > masqmail-0.2
annotate src/conf.c @ 162:52c82d755215
replaced the MD5 implementation with the one of Solar Designer
Until now, the sample code of RFC 1321 was used. It had an ugly license.
Now we use the implementation of Solar Designer, which is in the Public Domain.
http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
author | meillo@marmaro.de |
---|---|
date | Sun, 18 Jul 2010 22:01:04 +0200 |
parents | d68f0cab0be5 |
children | 349518b940db |
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.remote_port = 25; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
431 conf.do_relay = TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
432 conf.alias_local_cmp = strcmp; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
433 conf.max_defer_time = 86400 * 4; /* 4 days */ |
120
cd59a5b4d3dd
added support for SMTP SIZE 0 (unlimited)
meillo@marmaro.de
parents:
117
diff
changeset
|
434 conf.max_msg_size = 0; /* no limit on msg size */ |
0 | 435 |
28 | 436 if ((in = fopen(filename, "r")) == NULL) { |
437 fprintf(stderr, "could not open config file %s: %s\n", filename, strerror(errno)); | |
438 return FALSE; | |
439 } | |
0 | 440 |
28 | 441 gchar lval[256], rval[2048]; |
442 while (read_statement(in, lval, 256, rval, 2048)) { | |
114 | 443 DEBUG(6) fprintf(stderr,"read_conf(): lval=%s\n", lval); |
28 | 444 if (strcmp(lval, "debug_level") == 0) |
445 conf.debug_level = atoi(rval); | |
446 else if (strcmp(lval, "run_as_user") == 0) { | |
447 if (!conf.run_as_user) /* you should not be able to reset that flag */ | |
448 conf.run_as_user = parse_boolean(rval); | |
449 } else if (strcmp(lval, "use_syslog") == 0) | |
450 conf.use_syslog = parse_boolean(rval); | |
451 else if (strcmp(lval, "mail_dir") == 0) | |
452 conf.mail_dir = g_strdup(rval); | |
453 else if (strcmp(lval, "lock_dir") == 0) | |
454 conf.lock_dir = g_strdup(rval); | |
455 else if (strcmp(lval, "spool_dir") == 0) | |
456 conf.spool_dir = g_strdup(rval); | |
457 else if (strcmp(lval, "log_dir") == 0) | |
458 conf.log_dir = g_strdup(rval); | |
459 else if (strcmp(lval, "host_name") == 0) { | |
460 if (rval[0] != '/') | |
461 conf.host_name = g_strdup(rval); | |
462 else { | |
463 char buf[256]; | |
464 FILE *fptr = fopen(rval, "rt"); | |
465 if (fptr) { | |
466 fprintf(stderr, "could not open %s: %s\n", rval, strerror(errno)); | |
467 return FALSE; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
468 } |
28 | 469 fgets(buf, 255, fptr); |
470 g_strchomp(buf); | |
471 conf.host_name = g_strdup(buf); | |
472 fclose(fptr); | |
473 } | |
474 } else if (strcmp(lval, "remote_port") == 0) { | |
475 fprintf(stderr, "the remote_port option is now deprecated. Use 'mail_host' in the\n" | |
476 "route configuration instead. See man masqmail.route\n"); | |
477 conf.remote_port = atoi(rval); | |
478 } else if (strcmp(lval, "local_hosts") == 0) | |
479 conf.local_hosts = parse_list(rval, FALSE); | |
480 else if (strcmp(lval, "local_addresses") == 0) | |
481 conf.local_addresses = parse_list(rval, TRUE); | |
482 else if (strcmp(lval, "not_local_addresses") == 0) | |
483 conf.not_local_addresses = parse_list(rval, TRUE); | |
484 else if (strcmp(lval, "local_nets") == 0) | |
485 conf.local_nets = parse_list(rval, FALSE); | |
486 else if (strcmp(lval, "do_save_envelope_to") == 0) | |
487 conf.do_save_envelope_to = parse_boolean(rval); | |
488 else if (strcmp(lval, "defer_all") == 0) | |
489 conf.defer_all = parse_boolean(rval); | |
490 else if (strcmp(lval, "do_relay") == 0) | |
491 conf.do_relay = parse_boolean(rval); | |
492 else if (strcmp(lval, "alias_file") == 0) { | |
493 conf.alias_file = g_strdup(rval); | |
494 } else if (strcmp(lval, "alias_local_caseless") == 0) { | |
495 conf.alias_local_cmp = parse_boolean(rval) ? strcasecmp : strcmp; | |
496 } else if (strcmp(lval, "mbox_default") == 0) { | |
497 conf.mbox_default = g_strdup(rval); | |
498 } else if (strcmp(lval, "mbox_users") == 0) { | |
499 conf.mbox_users = parse_list(rval, TRUE); | |
500 } else if (strcmp(lval, "mda_users") == 0) { | |
501 conf.mda_users = parse_list(rval, TRUE); | |
502 } else if (strcmp(lval, "maildir_users") == 0) { | |
503 conf.maildir_users = parse_list(rval, TRUE); | |
504 } else if (strcmp(lval, "mda") == 0) { | |
505 conf.mda = g_strdup(rval); | |
506 } else if (strcmp(lval, "mda_fromline") == 0) { | |
507 conf.mda_fromline = parse_boolean(rval); | |
508 } else if (strcmp(lval, "mda_fromhack") == 0) { | |
509 conf.mda_fromhack = parse_boolean(rval); | |
510 } else if (strcmp(lval, "pipe_fromline") == 0) { | |
511 conf.pipe_fromline = parse_boolean(rval); | |
512 } else if (strcmp(lval, "pipe_fromhack") == 0) { | |
513 conf.pipe_fromhack = parse_boolean(rval); | |
514 } else if (strcmp(lval, "listen_addresses") == 0) { | |
515 GList *node; | |
516 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
|
517 |
28 | 518 conf.listen_addresses = NULL; |
519 foreach(tmp_list, node) { | |
520 conf.listen_addresses = g_list_append(conf.listen_addresses, parse_interface((gchar *) (node-> data), 25)); | |
521 g_free(node->data); | |
522 } | |
523 g_list_free(tmp_list); | |
524 } else if (strcmp(lval, "ident_trusted_nets") == 0) { | |
525 #ifdef ENABLE_IDENT | |
526 GList *node; | |
527 GList *tmp_list = parse_list(rval, FALSE); | |
528 | |
529 conf.ident_trusted_nets = NULL; | |
530 foreach(tmp_list, node) { | |
531 conf.ident_trusted_nets = g_list_append(conf.ident_trusted_nets, parse_network((gchar *) (node->data), 25)); | |
532 g_free(node->data); | |
533 } | |
534 g_list_free(tmp_list); | |
0 | 535 #else |
28 | 536 fprintf(stderr, "%s ignored: not compiled with ident support\n", lval); |
0 | 537 #endif |
28 | 538 } else if ((strncmp(lval, "connect_route.", 14) == 0) |
539 || (strncmp(lval, "online_routes.", 14) == 0)) { | |
540 GList *file_list = parse_list(rval, FALSE); | |
541 table_pair *pair = create_pair(&(lval[14]), file_list); | |
542 conf.connect_routes = g_list_append(conf.connect_routes, pair); | |
543 } else if (strcmp(lval, "local_net_route") == 0) { | |
544 conf.local_net_routes = parse_list(rval, FALSE); | |
545 } else if (strcmp(lval, "online_detect") == 0) | |
546 conf.online_detect = g_strdup(rval); | |
547 else if (strcmp(lval, "online_file") == 0) | |
548 conf.online_file = g_strdup(rval); | |
549 else if (strcmp(lval, "online_pipe") == 0) | |
550 conf.online_pipe = g_strdup(rval); | |
551 else if (strcmp(lval, "mserver_iface") == 0) | |
552 conf.mserver_iface = parse_interface(rval, 224); | |
553 else if (strcmp(lval, "do_queue") == 0) | |
554 conf.do_queue = parse_boolean(rval); | |
555 else if (strncmp(lval, "get.", 4) == 0) { | |
0 | 556 #ifdef ENABLE_POP3 |
28 | 557 table_pair *pair = create_pair_string(&(lval[4]), rval); |
558 conf.get_names = g_list_append(conf.get_names, pair); | |
0 | 559 #else |
28 | 560 fprintf(stderr, "get.<name> ignored: not compiled with pop support\n"); |
0 | 561 #endif |
28 | 562 } else if (strncmp(lval, "online_gets.", 12) == 0) { |
563 #ifdef ENABLE_POP3 | |
564 GList *file_list = parse_list(rval, FALSE); | |
565 table_pair *pair = create_pair(&(lval[12]), file_list); | |
566 conf.online_gets = g_list_append(conf.online_gets, pair); | |
567 #else | |
568 fprintf(stderr, "online_gets.<name> ignored: not compiled with pop support\n"); | |
569 #endif | |
570 } else if (strcmp(lval, "errmsg_file") == 0) | |
571 conf.errmsg_file = g_strdup(rval); | |
572 else if (strcmp(lval, "warnmsg_file") == 0) | |
573 conf.warnmsg_file = g_strdup(rval); | |
574 else if (strcmp(lval, "warn_intervals") == 0) | |
575 conf.warn_intervals = parse_list(rval, FALSE); | |
576 else if (strcmp(lval, "max_defer_time") == 0) { | |
577 gint dummy; | |
578 gint ival = time_interval(rval, &dummy); | |
579 if (ival < 0) | |
580 fprintf(stderr, "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
|
581 else |
28 | 582 conf.max_defer_time = ival; |
583 } else if (strcmp(lval, "log_user") == 0) | |
584 conf.log_user = g_strdup(rval); | |
117
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
585 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
|
586 conf.max_msg_size = atol(rval); |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
587 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
|
588 rval, conf.max_msg_size); |
5ec5e6637049
added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents:
115
diff
changeset
|
589 } |
28 | 590 else |
591 fprintf(stderr, "var '%s' not (yet) known, ignored\n", lval); | |
592 } | |
593 fclose(in); | |
0 | 594 |
28 | 595 if (conf.errmsg_file == NULL) |
596 conf.errmsg_file = g_strdup(DATA_DIR "/tpl/failmsg.tpl"); | |
597 if (conf.warnmsg_file == NULL) | |
598 conf.warnmsg_file = g_strdup(DATA_DIR "/tpl/warnmsg.tpl"); | |
0 | 599 |
28 | 600 if (conf.lock_dir == NULL) |
601 conf.lock_dir = g_strdup_printf("%s/lock/", conf.spool_dir); | |
0 | 602 |
28 | 603 if (conf.mbox_default == NULL) |
604 conf.mbox_default = g_strdup("mbox"); | |
0 | 605 |
28 | 606 if (conf.warn_intervals == NULL) |
607 conf.warn_intervals = parse_list("1h;4h;8h;1d;2d;3d", FALSE); | |
608 | |
609 return TRUE; | |
0 | 610 } |
611 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
612 connect_route* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
613 read_route(gchar * filename, gboolean is_local_net) |
0 | 614 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
615 gboolean ok = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
616 FILE *in; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
617 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
618 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
|
619 memset(route, 0, sizeof(connect_route)); |
0 | 620 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
621 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
|
622 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
623 route->filename = g_strdup(filename); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
624 route->name = g_strdup(filename); /* quick hack */ |
0 | 625 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
626 route->protocol = g_strdup("smtp"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
627 route->expand_h_sender_address = TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
628 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
629 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
|
630 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
631 route->do_pipelining = TRUE; |
0 | 632 |
28 | 633 if ((in = fopen(route->filename, "r")) == NULL) { |
634 logwrite(LOG_ALERT, "could not open route file %s: %s\n", route->filename, strerror(errno)); | |
635 g_free(route); | |
636 return NULL; | |
637 } | |
0 | 638 |
28 | 639 gchar lval[256], rval[2048]; |
640 while (read_statement(in, lval, 256, rval, 2048)) { | |
641 if (strcmp(lval, "protocol") == 0) | |
642 route->protocol = g_strdup(rval); | |
643 else if (strcmp(lval, "mail_host") == 0) | |
644 route->mail_host = parse_interface(rval, conf.remote_port); | |
645 else if (strcmp(lval, "helo_name") == 0) | |
646 route->helo_name = g_strdup(rval); | |
647 else if (strcmp(lval, "wrapper") == 0) | |
648 route->wrapper = g_strdup(rval); | |
649 else if (strcmp(lval, "connect_error_fail") == 0) | |
650 route->connect_error_fail = parse_boolean(rval); | |
651 else if (strcmp(lval, "do_correct_helo") == 0) | |
652 route->do_correct_helo = parse_boolean(rval); | |
653 else if (strcmp(lval, "do_pipelining") == 0) | |
654 route->do_pipelining = parse_boolean(rval); | |
655 else if (strcmp(lval, "allowed_return_paths") == 0) | |
656 route->allowed_return_paths = parse_address_list(rval, TRUE); | |
657 else if (strcmp(lval, "allowed_mail_locals") == 0) | |
658 route->allowed_mail_locals = parse_list(rval, TRUE); | |
659 else if (strcmp(lval, "not_allowed_return_paths") == 0) | |
660 route->not_allowed_return_paths = parse_address_list(rval, TRUE); | |
661 else if (strcmp(lval, "not_allowed_mail_locals") == 0) | |
662 route->not_allowed_mail_locals = parse_list(rval, TRUE); | |
663 else if (strcmp(lval, "allowed_rcpt_domains") == 0) | |
664 route->allowed_rcpt_domains = parse_list(rval, TRUE); | |
665 else if (strcmp(lval, "not_allowed_rcpt_domains") == 0) | |
666 route->not_allowed_rcpt_domains = parse_list(rval, TRUE); | |
667 else if (strcmp(lval, "set_h_from_domain") == 0) | |
668 route->set_h_from_domain = g_strdup(rval); | |
669 else if (strcmp(lval, "set_h_reply_to_domain") == 0) | |
670 route->set_h_reply_to_domain = g_strdup(rval); | |
671 else if (strcmp(lval, "set_return_path_domain") == 0) | |
672 route->set_return_path_domain = g_strdup(rval); | |
673 else if (strcmp(lval, "map_return_path_addresses") == 0) { | |
674 GList *node, *list; | |
0 | 675 |
28 | 676 list = parse_list(rval, TRUE); |
677 foreach(list, node) { | |
678 gchar *item = (gchar *) (node->data); | |
679 table_pair *pair = parse_table_pair(item, ':'); | |
680 address *addr = create_address((gchar *) (pair->value), TRUE); | |
681 g_free(pair->value); | |
682 pair->value = (gpointer *) addr; | |
683 route->map_return_path_addresses = g_list_append(route->map_return_path_addresses, pair); | |
684 g_free(item); | |
685 } | |
686 g_list_free(list); | |
687 } else if (strcmp(lval, "map_h_from_addresses") == 0) { | |
688 GList *list, *node; | |
0 | 689 |
28 | 690 list = parse_list(rval, TRUE); |
691 foreach(list, node) { | |
692 gchar *item = (gchar *) (node->data); | |
693 table_pair *pair = parse_table_pair(item, ':'); | |
694 route->map_h_from_addresses = g_list_append(route->map_h_from_addresses, pair); | |
695 g_free(item); | |
696 } | |
697 g_list_free(list); | |
698 } else if (strcmp(lval, "map_h_reply_to_addresses") == 0) { | |
699 GList *list, *node; | |
0 | 700 |
28 | 701 list = parse_list(rval, TRUE); |
702 foreach(list, node) { | |
703 gchar *item = (gchar *) (node->data); | |
704 table_pair *pair = parse_table_pair(item, ':'); | |
705 route->map_h_reply_to_addresses = g_list_append(route->map_h_reply_to_addresses, pair); | |
706 g_free(item); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
707 } |
28 | 708 g_list_free(list); |
709 } else if (strcmp(lval, "map_h_mail_followup_to_addresses") == 0) { | |
710 GList *list, *node; | |
711 | |
712 list = parse_list(rval, TRUE); | |
713 foreach(list, node) { | |
714 gchar *item = (gchar *) (node->data); | |
715 table_pair *pair = parse_table_pair(item, ':'); | |
716 route->map_h_mail_followup_to_addresses = g_list_append(route->map_h_mail_followup_to_addresses, pair); | |
717 g_free(item); | |
718 } | |
719 g_list_free(list); | |
720 } else if (strcmp(lval, "expand_h_sender_domain") == 0) { | |
721 route->expand_h_sender_domain = parse_boolean(rval); | |
722 } else if (strcmp(lval, "expand_h_sender_address") == 0) { | |
723 route->expand_h_sender_address = parse_boolean(rval); | |
724 } else if (strcmp(lval, "resolve_list") == 0) | |
725 route->resolve_list = parse_resolve_list(rval); | |
726 else if (strcmp(lval, "do_ssl") == 0) { | |
727 /* we ignore this. This option is used by sqilconf */ | |
728 ; | |
729 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
730 #ifdef ENABLE_AUTH |
28 | 731 else if (strcmp(lval, "auth_name") == 0) { |
732 route->auth_name = g_strdup(rval); | |
733 } else if (strcmp(lval, "auth_login") == 0) { | |
734 route->auth_login = g_strdup(rval); | |
735 } else if (strcmp(lval, "auth_secret") == 0) { | |
736 route->auth_secret = g_strdup(rval); | |
737 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
738 #else |
28 | 739 else if ((strcmp(lval, "auth_name") == 0) |
740 || (strcmp(lval, "auth_login") == 0) | |
741 || (strcmp(lval, "auth_secret") == 0)) { | |
742 logwrite(LOG_WARNING, "%s ignored: not compiled with auth support.\n", lval); | |
743 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
744 #endif |
28 | 745 else if (strcmp(lval, "pop3_login") == 0) { |
746 #ifdef ENABLE_POP3 | |
747 route->pop3_login = g_strdup(rval); | |
748 #else | |
749 logwrite(LOG_WARNING, "pop3_login ignored: not compiled with pop support.\n"); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
750 #endif |
28 | 751 } else if (strcmp(lval, "pipe") == 0) { |
752 route->pipe = g_strdup(rval); | |
753 } else if (strcmp(lval, "pipe_fromline") == 0) { | |
754 route->pipe_fromline = parse_boolean(rval); | |
755 } else if (strcmp(lval, "pipe_fromhack") == 0) { | |
756 route->pipe_fromhack = parse_boolean(rval); | |
757 } else if (strcmp(lval, "last_route") == 0) { | |
758 route->last_route = parse_boolean(rval); | |
759 } else | |
760 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); | |
761 } | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
762 |
28 | 763 if (route->resolve_list == NULL) { |
764 if (is_local_net) { | |
765 route->resolve_list = g_list_append(NULL, resolve_byname); | |
766 } else { | |
767 #ifdef ENABLE_RESOLVER | |
768 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_mx); | |
769 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_a); | |
770 #endif | |
771 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
|
772 } |
28 | 773 } |
774 fclose(in); | |
775 ok = TRUE; | |
776 | |
777 /* warn user about misconfigurations: */ | |
778 if ((route->map_h_from_addresses != NULL) && (route->set_h_from_domain != NULL)) { | |
779 logwrite(LOG_WARNING, "'map_h_from_addresses' overrides 'set_h_from_domain'\n"); | |
780 g_free(route->set_h_from_domain); | |
781 route->set_h_from_domain = NULL; | |
782 } | |
783 if ((route->map_h_reply_to_addresses != NULL) && (route->set_h_reply_to_domain != NULL)) { | |
784 logwrite(LOG_WARNING, "'map_h_reply_to_addresses' overrides 'set_h_reply_to_domain'\n"); | |
785 g_free(route->set_h_reply_to_domain); | |
786 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
|
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 if (!ok) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
790 g_free(route); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
791 route = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
792 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
793 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
794 return route; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
795 } |
0 | 796 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
797 static void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
798 _g_list_free_all(GList * list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
799 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
800 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
801 if (list) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
802 foreach(list, node) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
803 g_free(node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
804 g_list_free(list); |
0 | 805 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
806 } |
0 | 807 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
808 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
809 destroy_route(connect_route * r) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
810 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
811 if (r->filename) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
812 g_free(r->filename); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
813 if (r->protocol) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
814 g_free(r->protocol); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
815 if (r->mail_host) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
816 g_free(r->mail_host->address); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
817 g_free(r->mail_host); |
0 | 818 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
819 if (r->wrapper) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
820 g_free(r->wrapper); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
821 if (r->helo_name) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
822 g_free(r->helo_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
823 _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
|
824 _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
|
825 _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
|
826 _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
|
827 if (r->set_h_from_domain) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
828 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
|
829 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
|
830 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
|
831 if (r->set_return_path_domain) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
832 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
|
833 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
|
834 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
|
835 if (r->resolve_list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
836 g_list_free(r->resolve_list); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
837 #ifdef ENABLE_AUTH |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
838 if (r->auth_name) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
839 g_free(r->auth_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
840 if (r->auth_login) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
841 g_free(r->auth_login); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
842 if (r->auth_secret) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
843 g_free(r->auth_secret); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
844 #endif |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
845 #ifdef ENABLE_POP3 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
846 if (r->pop3_login) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
847 g_free(r->pop3_login); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
848 #endif |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
849 if (r->pipe) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
850 g_free(r->pipe); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
851 g_free(r); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
852 } |
0 | 853 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
854 GList* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
855 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
|
856 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
857 GList *list = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
858 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
859 uid_t saved_uid, saved_gid; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
860 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
861 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
862 set_euidgid(0, 0, &saved_uid, &saved_gid); |
0 | 863 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
864 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
865 foreach(rf_list, node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
866 gchar *fname = (gchar *) (node->data); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
867 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
|
868 if (route) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
869 list = g_list_append(list, route); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
870 else |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
871 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
|
872 } |
0 | 873 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
874 /* set uid and gid back */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
875 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
876 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
|
877 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
878 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
879 return list; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
880 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
881 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
882 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
883 destroy_route_list(GList * list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
884 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
885 GList *node; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
886 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
887 foreach(list, node) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
888 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
|
889 destroy_route(route); |
0 | 890 } |
891 g_list_free(list); | |
892 } | |
893 | |
894 #ifdef ENABLE_POP3 | |
895 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
896 get_conf* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
897 read_get_conf(gchar * filename) |
0 | 898 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
899 FILE *in; |
0 | 900 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
901 get_conf *gc = g_malloc(sizeof(get_conf)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
902 memset(gc, 0, sizeof(get_conf)); |
0 | 903 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
904 gc->server_port = 110; |
0 | 905 |
28 | 906 if ((in = fopen(filename, "r")) == NULL) { |
907 logwrite(LOG_ALERT, "could not open get file %s: %s\n", filename, strerror(errno)); | |
908 g_free(gc); | |
909 return NULL; | |
910 } | |
0 | 911 |
28 | 912 gchar lval[256], rval[2048]; |
913 while (read_statement(in, lval, 256, rval, 2048)) { | |
914 if (strcmp(lval, "protocol") == 0) | |
915 gc->protocol = g_strdup(rval); | |
916 else if (strcmp(lval, "server") == 0) | |
917 gc->server_name = g_strdup(rval); | |
918 else if (strcmp(lval, "port") == 0) | |
919 gc->server_port = atoi(rval); | |
920 else if (strcmp(lval, "wrapper") == 0) | |
921 gc->wrapper = g_strdup(rval); | |
922 else if (strcmp(lval, "user") == 0) | |
923 gc->login_user = g_strdup(rval); | |
924 else if (strcmp(lval, "pass") == 0) | |
925 gc->login_pass = g_strdup(rval); | |
926 else if (strcmp(lval, "address") == 0) | |
927 gc->address = create_address_qualified(rval, TRUE, conf.host_name); | |
928 else if (strcmp(lval, "return_path") == 0) | |
929 gc->return_path = create_address_qualified(rval, TRUE, conf.host_name); | |
930 else if (strcmp(lval, "do_ssl") == 0) | |
931 /* we ignore this. This option is used by sqilconf */ | |
932 ; | |
933 else if (strcmp(lval, "do_keep") == 0) | |
934 gc->do_keep = parse_boolean(rval); | |
935 else if (strcmp(lval, "do_uidl") == 0) | |
936 gc->do_uidl = parse_boolean(rval); | |
937 else if (strcmp(lval, "do_uidl_dele") == 0) | |
938 gc->do_uidl_dele = parse_boolean(rval); | |
939 else if (strcmp(lval, "max_size") == 0) | |
940 gc->max_size = atoi(rval); | |
941 else if (strcmp(lval, "max_size_delete") == 0) | |
131
d68f0cab0be5
fixed the use of max_size instead of max_size_delete
meillo@marmaro.de
parents:
120
diff
changeset
|
942 gc->max_size_delete = parse_boolean(rval); |
28 | 943 else if (strcmp(lval, "max_count") == 0) |
944 gc->max_count = atoi(rval); | |
945 else if (strcmp(lval, "resolve_list") == 0) | |
946 gc->resolve_list = parse_resolve_list(rval); | |
947 else | |
948 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); | |
949 } | |
950 fclose(in); | |
0 | 951 |
28 | 952 if (gc->resolve_list == NULL) { |
953 #ifdef ENABLE_RESOLVER | |
954 gc->resolve_list = g_list_append(NULL, resolve_dns_a); | |
955 #endif | |
956 gc->resolve_list = g_list_append(NULL, resolve_byname); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
957 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
958 |
28 | 959 if (gc->protocol == NULL) |
960 gc->protocol = g_strdup("pop3"); | |
961 return gc; | |
0 | 962 } |
963 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
964 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
965 destroy_get_conf(get_conf * gc) |
0 | 966 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
967 if (gc->protocol) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
968 g_free(gc->protocol); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
969 if (gc->server_name) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
970 g_free(gc->server_name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
971 if (gc->login_user) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
972 g_free(gc->login_user); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
973 if (gc->login_pass) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
974 g_free(gc->login_pass); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
975 if (gc->wrapper) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
976 g_free(gc->wrapper); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
977 if (gc->address) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
978 destroy_address(gc->address); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
979 if (gc->return_path) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
980 destroy_address(gc->return_path); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
981 if (gc->resolve_list) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
982 g_list_free(gc->resolve_list); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
983 g_free(gc); |
0 | 984 } |
985 | |
986 #endif | |
987 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
988 connect_route* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
989 create_local_route() |
0 | 990 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
991 connect_route *route; |
0 | 992 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
993 route = g_malloc(sizeof(connect_route)); |
28 | 994 if (!route) { |
995 return NULL; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
996 } |
28 | 997 memset(route, 0, sizeof(connect_route)); |
998 route->protocol = g_strdup("smtp"); | |
999 route->is_local_net = TRUE; | |
1000 route->name = g_strdup("local_net (default)"); | |
1001 route->expand_h_sender_address = TRUE; | |
1002 route->resolve_list = g_list_append(NULL, resolve_byname); | |
1003 route->connect_error_fail = TRUE; | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
1004 return route; |
0 | 1005 } |