masqmail-0.2

annotate src/conf.c @ 171:349518b940db

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