comparison src/conf.c @ 393:5e728dd64c1b

Various refactoring and code layouting in the second half of conf.c.
author markus schnalke <meillo@marmaro.de>
date Sat, 18 Feb 2012 18:48:19 +0100
parents c5fd796ea06e
children c8e3d1a79313
comparison
equal deleted inserted replaced
392:c5fd796ea06e 393:5e728dd64c1b
374 gint c; 374 gint c;
375 375
376 DEBUG(9) fprintf(stderr, "read_statement()\n"); 376 DEBUG(9) fprintf(stderr, "read_statement()\n");
377 377
378 /* eat comments and empty lines: */ 378 /* eat comments and empty lines: */
379 if (!eat_comments(in)) 379 if (!eat_comments(in)) {
380 return FALSE; 380 return FALSE;
381 381 }
382 if (!read_lval(in, lval, lsize)) { 382 if (!read_lval(in, lval, lsize)) {
383 return FALSE; 383 return FALSE;
384 } 384 }
385 385
386 DEBUG(9) fprintf(stderr, " lval = %s\n", lval); 386 DEBUG(9) fprintf(stderr, " lval = %s\n", lval);
387 if ((c = fgetc(in) == '=')) { 387 if ((c = fgetc(in) != '=')) {
388 if (read_rval(in, rval, rsize)) { 388 fprintf(stderr, "'=' expected after %s, char was '%c'\n",
389 DEBUG(9) fprintf(stderr, " rval = %s\n", rval); 389 lval, c);
390 return TRUE; 390 }
391 } 391 if (!read_rval(in, rval, rsize)) {
392 } else { 392 return FALSE;
393 DEBUG(9) fprintf(stderr," '=' expected after %s, char was '%c'\n", lval, c); 393 }
394 fprintf(stderr, "'=' expected after %s, char was '%c'\n", lval, c); 394 DEBUG(9) fprintf(stderr, " rval = %s\n", rval);
395 } 395 return TRUE;
396 return FALSE;
397 } 396 }
398 397
399 gboolean 398 gboolean
400 read_conf(gchar *filename) 399 read_conf(gchar *filename)
401 { 400 {
402 FILE *in; 401 FILE *in;
402 gchar lval[256], rval[2048];
403 GList *listen_addrs_tmp = NULL;
403 404
404 conf.log_max_pri = 7; 405 conf.log_max_pri = 7;
405 conf.do_relay = TRUE; 406 conf.do_relay = TRUE;
406 conf.localpartcmp = strcmp; 407 conf.localpartcmp = strcmp;
407 conf.max_defer_time = 86400 * 4; /* 4 days */ 408 conf.max_defer_time = 86400 * 4; /* 4 days */
408 conf.max_msg_size = 0; /* no limit on msg size */ 409 conf.max_msg_size = 0; /* no limit on msg size */
409 conf.spool_dir = SPOOL_DIR; 410 conf.spool_dir = SPOOL_DIR;
410 conf.mail_dir = "/var/mail"; 411 conf.mail_dir = "/var/mail";
411 conf.listen_addresses = g_list_append(NULL, parse_interface("localhost", 25)); 412
412 413 if (!(in = fopen(filename, "r"))) {
413 if ((in = fopen(filename, "r")) == NULL) { 414 logwrite(LOG_ALERT, "could not open config file %s: %s\n",
414 logwrite(LOG_ALERT, "could not open config file %s: %s\n", filename, strerror(errno)); 415 filename, strerror(errno));
415 return FALSE; 416 return FALSE;
416 } 417 }
417 418
418 gchar lval[256], rval[2048];
419 while (read_statement(in, lval, sizeof lval, rval, sizeof rval)) { 419 while (read_statement(in, lval, sizeof lval, rval, sizeof rval)) {
420 DEBUG(9) fprintf(stderr,"read_conf(): lval=%s\n", lval); 420 DEBUG(9) fprintf(stderr,"read_conf(): lval=%s\n", lval);
421 if (strcmp(lval, "debug_level") == 0) 421 if (strcmp(lval, "debug_level")==0) {
422 conf.debug_level = atoi(rval); 422 conf.debug_level = atoi(rval);
423 else if (strcmp(lval, "run_as_user") == 0) { 423 } else if (strcmp(lval, "run_as_user")==0) {
424 if (!conf.run_as_user) /* you should not be able to reset that flag */ 424 if (!conf.run_as_user) {
425 /* you should not be able to reset that flag */
425 conf.run_as_user = parse_boolean(rval); 426 conf.run_as_user = parse_boolean(rval);
426 } else if (strcmp(lval, "use_syslog") == 0) 427 }
428 } else if (strcmp(lval, "use_syslog")==0) {
427 conf.use_syslog = parse_boolean(rval); 429 conf.use_syslog = parse_boolean(rval);
428 else if (strcmp(lval, "mail_dir") == 0) 430 } else if (strcmp(lval, "mail_dir")==0) {
429 conf.mail_dir = g_strdup(rval); 431 conf.mail_dir = g_strdup(rval);
430 else if (strcmp(lval, "lock_dir") == 0) 432 } else if (strcmp(lval, "lock_dir")==0) {
431 conf.lock_dir = g_strdup(rval); 433 conf.lock_dir = g_strdup(rval);
432 else if (strcmp(lval, "spool_dir") == 0) 434 } else if (strcmp(lval, "spool_dir")==0) {
433 conf.spool_dir = g_strdup(rval); 435 conf.spool_dir = g_strdup(rval);
434 else if (strcmp(lval, "log_dir") == 0) 436 } else if (strcmp(lval, "log_dir")==0) {
435 conf.log_dir = g_strdup(rval); 437 conf.log_dir = g_strdup(rval);
436 else if (strcmp(lval, "host_name") == 0) { 438 } else if (strcmp(lval, "host_name")==0) {
437 if (rval[0] != '/') 439 if (rval[0] != '/') {
438 conf.host_name = g_strdup(rval); 440 conf.host_name = g_strdup(rval);
439 else { 441 } else {
440 char buf[256]; 442 char buf[256];
441 FILE *fptr = fopen(rval, "rt"); 443 FILE *fptr = fopen(rval, "rt");
442 if (!fptr) { 444 if (!fptr) {
443 logwrite(LOG_ALERT, "could not open %s: %s\n", rval, strerror(errno)); 445 logwrite(LOG_ALERT, "could not open "
446 "%s: %s\n", rval,
447 strerror(errno));
444 return FALSE; 448 return FALSE;
445 } 449 }
446 fgets(buf, 255, fptr); 450 fgets(buf, sizeof buf, fptr);
447 g_strchomp(buf); 451 g_strstrip(buf);
448 conf.host_name = g_strdup(buf); 452 conf.host_name = g_strdup(buf);
449 fclose(fptr); 453 fclose(fptr);
450 } 454 }
451 } else if (strcmp(lval, "local_hosts") == 0) 455 } else if (strcmp(lval, "local_hosts")==0) {
452 conf.local_hosts = parse_list(rval, TRUE); 456 conf.local_hosts = parse_list(rval, TRUE);
453 else if (strcmp(lval, "local_addresses") == 0) 457 } else if (strcmp(lval, "local_addresses")==0) {
454 conf.local_addresses = parse_list(rval, TRUE); 458 conf.local_addresses = parse_list(rval, TRUE);
455 else if (strcmp(lval, "not_local_addresses") == 0) 459 } else if (strcmp(lval, "not_local_addresses")==0) {
456 conf.not_local_addresses = parse_list(rval, TRUE); 460 conf.not_local_addresses = parse_list(rval, TRUE);
457 else if (strcmp(lval, "do_save_envelope_to") == 0) 461 } else if (strcmp(lval, "do_save_envelope_to")==0) {
458 conf.do_save_envelope_to = parse_boolean(rval); 462 conf.do_save_envelope_to = parse_boolean(rval);
459 else if (strcmp(lval, "defer_all") == 0) 463 } else if (strcmp(lval, "defer_all")==0) {
460 conf.defer_all = parse_boolean(rval); 464 conf.defer_all = parse_boolean(rval);
461 else if (strcmp(lval, "do_relay") == 0) 465 } else if (strcmp(lval, "do_relay")==0) {
462 conf.do_relay = parse_boolean(rval); 466 conf.do_relay = parse_boolean(rval);
463 else if (strcmp(lval, "alias_file") == 0) { 467 } else if (strcmp(lval, "alias_file")==0) {
464 conf.alias_file = g_strdup(rval); 468 conf.alias_file = g_strdup(rval);
465 } else if (strcmp(lval, "globalias_file") == 0) { 469 } else if (strcmp(lval, "globalias_file")==0) {
466 conf.globalias_file = g_strdup(rval); 470 conf.globalias_file = g_strdup(rval);
467 } else if (strcmp(lval, "caseless_matching") == 0) { 471 } else if (strcmp(lval, "caseless_matching")==0) {
468 conf.localpartcmp = parse_boolean(rval) ? strcasecmp : strcmp; 472 conf.localpartcmp = parse_boolean(rval) ?
469 } else if (strcmp(lval, "mbox_default") == 0) { 473 strcasecmp : strcmp;
474 } else if (strcmp(lval, "mbox_default")==0) {
470 conf.mbox_default = g_strdup(rval); 475 conf.mbox_default = g_strdup(rval);
471 } else if (strcmp(lval, "mbox_users") == 0) { 476 } else if (strcmp(lval, "mbox_users")==0) {
472 conf.mbox_users = parse_list(rval, TRUE); 477 conf.mbox_users = parse_list(rval, TRUE);
473 } else if (strcmp(lval, "mda_users") == 0) { 478 } else if (strcmp(lval, "mda_users")==0) {
474 conf.mda_users = parse_list(rval, TRUE); 479 conf.mda_users = parse_list(rval, TRUE);
475 } else if (strcmp(lval, "mda") == 0) { 480 } else if (strcmp(lval, "mda")==0) {
476 conf.mda = g_strdup(rval); 481 conf.mda = g_strdup(rval);
477 } else if (strcmp(lval, "mda_fromline") == 0) { 482 } else if (strcmp(lval, "mda_fromline")==0) {
478 conf.mda_fromline = parse_boolean(rval); 483 conf.mda_fromline = parse_boolean(rval);
479 } else if (strcmp(lval, "mda_fromhack") == 0) { 484 } else if (strcmp(lval, "mda_fromhack")==0) {
480 conf.mda_fromhack = parse_boolean(rval); 485 conf.mda_fromhack = parse_boolean(rval);
481 } else if (strcmp(lval, "pipe_fromline") == 0) { 486 } else if (strcmp(lval, "pipe_fromline")==0) {
482 conf.pipe_fromline = parse_boolean(rval); 487 conf.pipe_fromline = parse_boolean(rval);
483 } else if (strcmp(lval, "pipe_fromhack") == 0) { 488 } else if (strcmp(lval, "pipe_fromhack")==0) {
484 conf.pipe_fromhack = parse_boolean(rval); 489 conf.pipe_fromhack = parse_boolean(rval);
485 } else if (strcmp(lval, "listen_addresses") == 0) { 490 } else if (strcmp(lval, "listen_addresses")==0) {
486 GList *node; 491 listen_addrs_tmp = parse_list(rval, TRUE);
487 GList *tmp_list = parse_list(rval, TRUE); 492 } else if (strncmp(lval, "query_routes.", 13)==0) {
488
489 conf.listen_addresses = NULL;
490 foreach(tmp_list, node) {
491 conf.listen_addresses = g_list_append(conf.listen_addresses, parse_interface((gchar *) (node-> data), 25));
492 g_free(node->data);
493 }
494 g_list_free(tmp_list);
495 } else if (strncmp(lval, "query_routes.", 13) == 0) {
496 GList *file_list = parse_list(rval, FALSE); 493 GList *file_list = parse_list(rval, FALSE);
497 table_pair *pair = create_pair(lval+13, file_list); 494 table_pair *pair = create_pair(lval+13, file_list);
498 conf.query_routes = g_list_append(conf.query_routes, pair); 495 conf.query_routes = g_list_append(conf.query_routes,
499 } else if (strcmp(lval, "permanent_routes") == 0) { 496 pair);
497 } else if (strcmp(lval, "permanent_routes")==0) {
500 conf.perma_routes = parse_list(rval, FALSE); 498 conf.perma_routes = parse_list(rval, FALSE);
501 } else if (strcmp(lval, "online_query") == 0) 499 } else if (strcmp(lval, "online_query")==0) {
502 conf.online_query = g_strdup(rval); 500 conf.online_query = g_strdup(rval);
503 else if (strcmp(lval, "do_queue") == 0) 501 } else if (strcmp(lval, "do_queue")==0) {
504 conf.do_queue = parse_boolean(rval); 502 conf.do_queue = parse_boolean(rval);
505 else if (strcmp(lval, "errmsg_file") == 0) 503 } else if (strcmp(lval, "errmsg_file")==0) {
506 conf.errmsg_file = g_strdup(rval); 504 conf.errmsg_file = g_strdup(rval);
507 else if (strcmp(lval, "warnmsg_file") == 0) 505 } else if (strcmp(lval, "warnmsg_file")==0) {
508 conf.warnmsg_file = g_strdup(rval); 506 conf.warnmsg_file = g_strdup(rval);
509 else if (strcmp(lval, "warn_intervals") == 0) 507 } else if (strcmp(lval, "warn_intervals")==0) {
510 conf.warn_intervals = parse_list(rval, TRUE); 508 conf.warn_intervals = parse_list(rval, TRUE);
511 else if (strcmp(lval, "max_defer_time") == 0) { 509 } else if (strcmp(lval, "max_defer_time")==0) {
512 gint ival = time_interval(rval); 510 gint ival = time_interval(rval);
513 if (ival < 0) 511 if (ival < 0) {
514 logwrite(LOG_WARNING, "invalid time interval for 'max_defer_time': %s\n", rval); 512 logwrite(LOG_WARNING, "invalid time interval "
515 else 513 "for 'max_defer_time': %s\n",
514 rval);
515 } else {
516 conf.max_defer_time = ival; 516 conf.max_defer_time = ival;
517 } else if (strcmp(lval, "log_user") == 0) 517 }
518 } else if (strcmp(lval, "log_user")==0) {
518 conf.log_user = g_strdup(rval); 519 conf.log_user = g_strdup(rval);
519 else if(strcmp(lval, "max_msg_size") == 0) { 520 } else if(strcmp(lval, "max_msg_size")==0) {
520 conf.max_msg_size = atol(rval); 521 conf.max_msg_size = atol(rval);
521 DEBUG(9) fprintf(stderr,"rval=%s, conf.max_msg_size=%ld\n", 522 DEBUG(9) fprintf(stderr,
523 "rval=%s, conf.max_msg_size=%ld\n",
522 rval, conf.max_msg_size); 524 rval, conf.max_msg_size);
523 } 525 } else {
524 else 526 logwrite(LOG_WARNING, "var '%s' unknown: ignored\n",
525 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); 527 lval);
528 }
526 } 529 }
527 fclose(in); 530 fclose(in);
528 531
529 if (!conf.host_name) { 532 if (!conf.host_name) {
530 logwrite(LOG_ALERT, "`host_name' MUST be set in masqmail.conf. See man page\n"); 533 logwrite(LOG_ALERT, "`host_name' MUST be set in "
534 "masqmail.conf. See man page\n");
531 return FALSE; 535 return FALSE;
532 } 536 }
533 537 if (!conf.errmsg_file) {
534 if (conf.errmsg_file == NULL)
535 conf.errmsg_file = g_strdup(DATA_DIR "/tpl/failmsg.tpl"); 538 conf.errmsg_file = g_strdup(DATA_DIR "/tpl/failmsg.tpl");
536 if (conf.warnmsg_file == NULL) 539 }
540 if (!conf.warnmsg_file) {
537 conf.warnmsg_file = g_strdup(DATA_DIR "/tpl/warnmsg.tpl"); 541 conf.warnmsg_file = g_strdup(DATA_DIR "/tpl/warnmsg.tpl");
538 542 }
539 if (conf.lock_dir == NULL) 543 if (!conf.lock_dir) {
540 conf.lock_dir = g_strdup_printf("%s/lock/", conf.spool_dir); 544 conf.lock_dir = g_strdup_printf("%s/lock/", conf.spool_dir);
541 545 }
542 if (conf.mbox_default == NULL) 546 if (!conf.mbox_default) {
543 conf.mbox_default = g_strdup("mbox"); 547 conf.mbox_default = g_strdup("mbox");
544 548 }
545 if (conf.warn_intervals == NULL) 549 if (!conf.warn_intervals) {
546 conf.warn_intervals = parse_list("1h;4h;8h;1d;2d;3d", TRUE); 550 conf.warn_intervals = parse_list("1h;4h;8h;1d;2d;3d", TRUE);
547 551 }
548 if (!conf.local_hosts) { 552 if (!conf.local_hosts) {
549 char *shortname = strdup(conf.host_name); 553 char *shortname = strdup(conf.host_name);
550 char *p = strchr(shortname, '.'); 554 char *p = strchr(shortname, '.');
551 if (p) { 555 if (p) {
552 *p = '\0'; 556 *p = '\0';
556 shortname, conf.host_name); 560 shortname, conf.host_name);
557 conf.local_hosts = parse_list(local_hosts_str, TRUE); 561 conf.local_hosts = parse_list(local_hosts_str, TRUE);
558 free(shortname); 562 free(shortname);
559 free(local_hosts_str); 563 free(local_hosts_str);
560 } 564 }
561 565 if (!listen_addrs_tmp) {
566 conf.listen_addresses = g_list_append(NULL,
567 parse_interface("localhost", 25));
568 } else {
569 GList *node;
570
571 foreach(listen_addrs_tmp, node) {
572 conf.listen_addresses =
573 g_list_append(conf.listen_addresses,
574 parse_interface((gchar *) node->data,
575 25));
576 g_free(node->data);
577 }
578 g_list_free(listen_addrs_tmp);
579 }
562 580
563 return TRUE; 581 return TRUE;
564 } 582 }
565 583
566 connect_route* 584 connect_route*
567 read_route(gchar *filename, gboolean is_perma) 585 read_route(gchar *filename, gboolean is_perma)
568 { 586 {
569 gboolean ok = FALSE;
570 FILE *in; 587 FILE *in;
571 588 connect_route *route;
572 connect_route *route = g_malloc(sizeof(connect_route)); 589 gchar lval[256], rval[2048];
590
591 DEBUG(5) debugf("read_route, filename = %s\n", filename);
592
593 if (!(in = fopen(filename, "r"))) {
594 logwrite(LOG_ALERT, "could not open route file %s: %s\n",
595 filename, strerror(errno));
596 return NULL;
597 }
598
599 route = g_malloc(sizeof(connect_route));
573 memset(route, 0, sizeof(connect_route)); 600 memset(route, 0, sizeof(connect_route));
574
575 DEBUG(5) debugf("read_route, filename = %s\n", filename);
576
577 route->filename = g_strdup(filename); 601 route->filename = g_strdup(filename);
578 route->name = route->filename; /* quick hack */ 602 route->name = route->filename; /* quick hack */
579
580 route->expand_h_sender_address = TRUE; 603 route->expand_h_sender_address = TRUE;
581
582 route->is_perma = is_perma; 604 route->is_perma = is_perma;
583
584 route->do_pipelining = TRUE; 605 route->do_pipelining = TRUE;
585 606
586 if ((in = fopen(route->filename, "r")) == NULL) {
587 logwrite(LOG_ALERT, "could not open route file %s: %s\n", route->filename, strerror(errno));
588 g_free(route);
589 return NULL;
590 }
591
592 gchar lval[256], rval[2048];
593 while (read_statement(in, lval, sizeof lval, rval, sizeof rval)) { 607 while (read_statement(in, lval, sizeof lval, rval, sizeof rval)) {
594 if (strcmp(lval, "mail_host") == 0) 608 if (strcmp(lval, "mail_host")==0) {
595 route->mail_host = parse_interface(rval, 25); 609 route->mail_host = parse_interface(rval, 25);
596 else if (strcmp(lval, "helo_name") == 0) 610 } else if (strcmp(lval, "helo_name")==0) {
597 route->helo_name = g_strdup(rval); 611 route->helo_name = g_strdup(rval);
598 else if (strcmp(lval, "wrapper") == 0) 612 } else if (strcmp(lval, "wrapper")==0) {
599 route->wrapper = g_strdup(rval); 613 route->wrapper = g_strdup(rval);
600 else if (strcmp(lval, "connect_error_fail") == 0) 614 } else if (strcmp(lval, "connect_error_fail")==0) {
601 route->connect_error_fail = parse_boolean(rval); 615 route->connect_error_fail = parse_boolean(rval);
602 else if (strcmp(lval, "do_correct_helo") == 0) 616 } else if (strcmp(lval, "do_correct_helo")==0) {
603 route->do_correct_helo = parse_boolean(rval); 617 route->do_correct_helo = parse_boolean(rval);
604 else if (strcmp(lval, "instant_helo") == 0) 618 } else if (strcmp(lval, "instant_helo")==0) {
605 route->instant_helo = parse_boolean(rval); 619 route->instant_helo = parse_boolean(rval);
606 else if (strcmp(lval, "do_pipelining") == 0) 620 } else if (strcmp(lval, "do_pipelining")==0) {
607 route->do_pipelining = parse_boolean(rval); 621 route->do_pipelining = parse_boolean(rval);
608 622
609 else if (strcmp(lval, "allowed_senders") == 0) 623 } else if (strcmp(lval, "allowed_senders")==0) {
610 route->allowed_senders = parse_address_glob_list(rval); 624 route->allowed_senders = parse_address_glob_list(rval);
611 else if (strcmp(lval, "denied_senders") == 0) 625 } else if (strcmp(lval, "denied_senders")==0) {
612 route->denied_senders = parse_address_glob_list(rval); 626 route->denied_senders = parse_address_glob_list(rval);
613 else if (strcmp(lval, "allowed_recipients") == 0) 627 } else if (strcmp(lval, "allowed_recipients")==0) {
614 route->allowed_recipients = parse_address_glob_list(rval); 628 route->allowed_recipients = parse_address_glob_list(rval);
615 else if (strcmp(lval, "denied_recipients") == 0) 629 } else if (strcmp(lval, "denied_recipients")==0) {
616 route->denied_recipients = parse_address_glob_list(rval); 630 route->denied_recipients = parse_address_glob_list(rval);
617 631
618 else if (strcmp(lval, "set_h_from_domain") == 0) 632 } else if (strcmp(lval, "set_h_from_domain")==0) {
619 route->set_h_from_domain = g_strdup(rval); 633 route->set_h_from_domain = g_strdup(rval);
620 else if (strcmp(lval, "set_h_reply_to_domain") == 0) 634 } else if (strcmp(lval, "set_h_reply_to_domain")==0) {
621 route->set_h_reply_to_domain = g_strdup(rval); 635 route->set_h_reply_to_domain = g_strdup(rval);
622 else if (strcmp(lval, "set_return_path_domain") == 0) 636 } else if (strcmp(lval, "set_return_path_domain")==0) {
623 route->set_return_path_domain = g_strdup(rval); 637 route->set_return_path_domain = g_strdup(rval);
624 else if (strcmp(lval, "map_return_path_addresses") == 0) { 638 } else if (strcmp(lval, "map_return_path_addresses")==0) {
625 GList *node, *list; 639 GList *node, *list;
626 640
627 list = parse_list(rval, TRUE); 641 list = parse_list(rval, TRUE);
628 foreach(list, node) { 642 foreach(list, node) {
629 gchar *item = (gchar *) (node->data); 643 gchar *item = (gchar *) (node->data);
630 table_pair *pair = parse_table_pair(item, ':'); 644 table_pair *pair = parse_table_pair(item, ':');
631 address *addr = create_address((gchar *) (pair->value), TRUE); 645 address *addr = create_address(
646 (gchar *) (pair->value), TRUE);
632 g_free(pair->value); 647 g_free(pair->value);
633 pair->value = (gpointer *) addr; 648 pair->value = (gpointer *) addr;
634 route->map_return_path_addresses = g_list_append(route->map_return_path_addresses, pair); 649 route->map_return_path_addresses = g_list_append( route->map_return_path_addresses, pair);
635 g_free(item); 650 g_free(item);
636 } 651 }
637 g_list_free(list); 652 g_list_free(list);
638 } else if (strcmp(lval, "map_h_from_addresses") == 0) { 653 } else if (strcmp(lval, "map_h_from_addresses")==0) {
639 GList *list, *node; 654 GList *list, *node;
640 655
641 list = parse_list(rval, TRUE); 656 list = parse_list(rval, TRUE);
642 foreach(list, node) { 657 foreach(list, node) {
643 gchar *item = (gchar *) (node->data); 658 gchar *item = (gchar *) (node->data);
644 table_pair *pair = parse_table_pair(item, ':'); 659 table_pair *pair = parse_table_pair(item, ':');
645 route->map_h_from_addresses = g_list_append(route->map_h_from_addresses, pair); 660 route->map_h_from_addresses = g_list_append(route->map_h_from_addresses, pair);
646 g_free(item); 661 g_free(item);
647 } 662 }
648 g_list_free(list); 663 g_list_free(list);
649 } else if (strcmp(lval, "map_h_reply_to_addresses") == 0) { 664 } else if (strcmp(lval, "map_h_reply_to_addresses")==0) {
650 GList *list, *node; 665 GList *list, *node;
651 666
652 list = parse_list(rval, TRUE); 667 list = parse_list(rval, TRUE);
653 foreach(list, node) { 668 foreach(list, node) {
654 gchar *item = (gchar *) (node->data); 669 gchar *item = (gchar *) (node->data);
655 table_pair *pair = parse_table_pair(item, ':'); 670 table_pair *pair = parse_table_pair(item, ':');
656 route->map_h_reply_to_addresses = g_list_append(route->map_h_reply_to_addresses, pair); 671 route->map_h_reply_to_addresses = g_list_append(route->map_h_reply_to_addresses, pair);
657 g_free(item); 672 g_free(item);
658 } 673 }
659 g_list_free(list); 674 g_list_free(list);
660 } else if (strcmp(lval, "map_h_mail_followup_to_addresses") == 0) { 675 } else if (strcmp(lval, "map_h_mail_followup_to_addresses")==0) {
661 GList *list, *node; 676 GList *list, *node;
662 677
663 list = parse_list(rval, TRUE); 678 list = parse_list(rval, TRUE);
664 foreach(list, node) { 679 foreach(list, node) {
665 gchar *item = (gchar *) (node->data); 680 gchar *item = (gchar *) (node->data);
666 table_pair *pair = parse_table_pair(item, ':'); 681 table_pair *pair = parse_table_pair(item, ':');
667 route->map_h_mail_followup_to_addresses = g_list_append(route->map_h_mail_followup_to_addresses, pair); 682 route->map_h_mail_followup_to_addresses = g_list_append(route->map_h_mail_followup_to_addresses, pair);
668 g_free(item); 683 g_free(item);
669 } 684 }
670 g_list_free(list); 685 g_list_free(list);
671 } else if (strcmp(lval, "expand_h_sender_domain") == 0) { 686 } else if (strcmp(lval, "expand_h_sender_domain")==0) {
672 route->expand_h_sender_domain = parse_boolean(rval); 687 route->expand_h_sender_domain = parse_boolean(rval);
673 } else if (strcmp(lval, "expand_h_sender_address") == 0) { 688 } else if (strcmp(lval, "expand_h_sender_address")==0) {
674 route->expand_h_sender_address = parse_boolean(rval); 689 route->expand_h_sender_address = parse_boolean(rval);
675 } else if (strcmp(lval, "resolve_list") == 0) 690 } else if (strcmp(lval, "resolve_list")==0) {
676 route->resolve_list = parse_resolve_list(rval); 691 route->resolve_list = parse_resolve_list(rval);
677 else if (strcmp(lval, "do_ssl") == 0) { 692 } else if (strcmp(lval, "do_ssl")==0) {
678 /* we ignore this. This option is used by sqilconf */ 693 /* we ignore this. This option is used by sqilconf */
679 ; 694 ;
680 }
681 #ifdef ENABLE_AUTH 695 #ifdef ENABLE_AUTH
682 else if (strcmp(lval, "auth_name") == 0) { 696 } else if (strcmp(lval, "auth_name")==0) {
683 route->auth_name = g_strdup(rval); 697 route->auth_name = g_strdup(rval);
684 } else if (strcmp(lval, "auth_login") == 0) { 698 } else if (strcmp(lval, "auth_login")==0) {
685 route->auth_login = g_strdup(rval); 699 route->auth_login = g_strdup(rval);
686 } else if (strcmp(lval, "auth_secret") == 0) { 700 } else if (strcmp(lval, "auth_secret")==0) {
687 route->auth_secret = g_strdup(rval); 701 route->auth_secret = g_strdup(rval);
688 }
689 #else 702 #else
690 else if ((strcmp(lval, "auth_name") == 0) 703 } else if ((strcmp(lval, "auth_name")==0) ||
691 || (strcmp(lval, "auth_login") == 0) 704 (strcmp(lval, "auth_login")==0) ||
692 || (strcmp(lval, "auth_secret") == 0)) { 705 (strcmp(lval, "auth_secret")==0)) {
693 logwrite(LOG_WARNING, "%s ignored: not compiled with auth support.\n", lval); 706 logwrite(LOG_WARNING, "%s ignored: not compiled with "
707 "auth support.\n", lval);
694 } 708 }
695 #endif 709 #endif
696 else if (strcmp(lval, "pipe") == 0) { 710 } else if (strcmp(lval, "pipe")==0) {
697 route->pipe = g_strdup(rval); 711 route->pipe = g_strdup(rval);
698 } else if (strcmp(lval, "pipe_fromline") == 0) { 712 } else if (strcmp(lval, "pipe_fromline")==0) {
699 route->pipe_fromline = parse_boolean(rval); 713 route->pipe_fromline = parse_boolean(rval);
700 } else if (strcmp(lval, "pipe_fromhack") == 0) { 714 } else if (strcmp(lval, "pipe_fromhack")==0) {
701 route->pipe_fromhack = parse_boolean(rval); 715 route->pipe_fromhack = parse_boolean(rval);
702 } else if (strcmp(lval, "last_route") == 0) { 716 } else if (strcmp(lval, "last_route")==0) {
703 route->last_route = parse_boolean(rval); 717 route->last_route = parse_boolean(rval);
704 } else 718 } else {
705 logwrite(LOG_WARNING, "var '%s' not (yet) known, ignored\n", lval); 719 logwrite(LOG_WARNING, "var '%s' unknown: ignored\n",
720 lval);
721 }
706 } 722 }
707 723
708 if (!route->resolve_list) { 724 if (!route->resolve_list) {
709 #ifdef ENABLE_RESOLVER 725 #ifdef ENABLE_RESOLVER
710 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_mx); 726 route->resolve_list = g_list_append(route->resolve_list,
711 route->resolve_list = g_list_append(route->resolve_list, resolve_dns_a); 727 resolve_dns_mx);
728 route->resolve_list = g_list_append(route->resolve_list,
729 resolve_dns_a);
712 #endif 730 #endif
713 route->resolve_list = g_list_append(route->resolve_list, resolve_byname); 731 route->resolve_list = g_list_append(route->resolve_list,
732 resolve_byname);
714 } 733 }
715 fclose(in); 734 fclose(in);
716 ok = TRUE; 735
717 736 /* warn user about mis-configurations: */
718 /* warn user about misconfigurations: */ 737 if (route->map_h_from_addresses && route->set_h_from_domain) {
719 if ((route->map_h_from_addresses != NULL) && (route->set_h_from_domain != NULL)) { 738 logwrite(LOG_WARNING, "'map_h_from_addresses' overrides "
720 logwrite(LOG_WARNING, "'map_h_from_addresses' overrides 'set_h_from_domain'\n"); 739 "'set_h_from_domain'\n");
721 g_free(route->set_h_from_domain); 740 g_free(route->set_h_from_domain);
722 route->set_h_from_domain = NULL; 741 route->set_h_from_domain = NULL;
723 } 742 }
724 if ((route->map_h_reply_to_addresses != NULL) && (route->set_h_reply_to_domain != NULL)) { 743 if (route->map_h_reply_to_addresses && route->set_h_reply_to_domain) {
725 logwrite(LOG_WARNING, "'map_h_reply_to_addresses' overrides 'set_h_reply_to_domain'\n"); 744 logwrite(LOG_WARNING, "'map_h_reply_to_addresses' overrides "
745 "'set_h_reply_to_domain'\n");
726 g_free(route->set_h_reply_to_domain); 746 g_free(route->set_h_reply_to_domain);
727 route->set_h_reply_to_domain = NULL; 747 route->set_h_reply_to_domain = NULL;
728 } 748 }
729 749
730 if (!ok) {
731 g_free(route);
732 route = NULL;
733 }
734
735 return route; 750 return route;
736 } 751 }
737 752
738 static void 753 static void
739 _g_list_free_all(GList *list) 754 _g_list_free_all(GList *list)
740 { 755 {
741 GList *node; 756 GList *node;
742 if (list) { 757 if (!list) {
743 foreach(list, node) 758 return;
744 g_free(node->data); 759 }
745 g_list_free(list); 760 foreach(list, node) {
746 } 761 g_free(node->data);
762 }
763 g_list_free(list);
747 } 764 }
748 765
749 void 766 void
750 destroy_route(connect_route *r) 767 destroy_route(connect_route *r)
751 { 768 {
752 if (r->filename) 769 if (r->filename) {
753 g_free(r->filename); 770 g_free(r->filename);
771 }
754 if (r->mail_host) { 772 if (r->mail_host) {
755 g_free(r->mail_host->address); 773 g_free(r->mail_host->address);
756 g_free(r->mail_host); 774 g_free(r->mail_host);
757 } 775 }
758 if (r->wrapper) 776 if (r->wrapper) {
759 g_free(r->wrapper); 777 g_free(r->wrapper);
760 if (r->helo_name) 778 }
779 if (r->helo_name) {
761 g_free(r->helo_name); 780 g_free(r->helo_name);
781 }
762 _g_list_free_all(r->allowed_senders); 782 _g_list_free_all(r->allowed_senders);
763 _g_list_free_all(r->denied_senders); 783 _g_list_free_all(r->denied_senders);
764 _g_list_free_all(r->allowed_recipients); 784 _g_list_free_all(r->allowed_recipients);
765 _g_list_free_all(r->denied_recipients); 785 _g_list_free_all(r->denied_recipients);
766 if (r->set_h_from_domain) 786 if (r->set_h_from_domain) {
767 g_free(r->set_h_from_domain); 787 g_free(r->set_h_from_domain);
768 if (r->set_h_reply_to_domain) 788 }
789 if (r->set_h_reply_to_domain) {
769 g_free(r->set_h_reply_to_domain); 790 g_free(r->set_h_reply_to_domain);
770 if (r->set_return_path_domain) 791 }
792 if (r->set_return_path_domain) {
771 g_free(r->set_return_path_domain); 793 g_free(r->set_return_path_domain);
772 if (r->map_h_reply_to_addresses) 794 }
795 if (r->map_h_reply_to_addresses) {
773 destroy_table(r->map_h_reply_to_addresses); 796 destroy_table(r->map_h_reply_to_addresses);
774 if (r->resolve_list) 797 }
798 if (r->resolve_list) {
775 g_list_free(r->resolve_list); 799 g_list_free(r->resolve_list);
800 }
776 #ifdef ENABLE_AUTH 801 #ifdef ENABLE_AUTH
777 if (r->auth_name) 802 if (r->auth_name) {
778 g_free(r->auth_name); 803 g_free(r->auth_name);
779 if (r->auth_login) 804 }
805 if (r->auth_login) {
780 g_free(r->auth_login); 806 g_free(r->auth_login);
781 if (r->auth_secret) 807 }
808 if (r->auth_secret) {
782 g_free(r->auth_secret); 809 g_free(r->auth_secret);
810 }
783 #endif 811 #endif
784 if (r->pipe) 812 if (r->pipe) {
785 g_free(r->pipe); 813 g_free(r->pipe);
814 }
786 g_free(r); 815 g_free(r);
787 } 816 }
788 817
789 GList* 818 GList*
790 read_route_list(GList *rf_list, gboolean is_perma) 819 read_route_list(GList *rf_list, gboolean is_perma)
794 uid_t saved_uid, saved_gid; 823 uid_t saved_uid, saved_gid;
795 824
796 if (!conf.run_as_user) { 825 if (!conf.run_as_user) {
797 set_euidgid(0, 0, &saved_uid, &saved_gid); 826 set_euidgid(0, 0, &saved_uid, &saved_gid);
798 } 827 }
799
800 foreach(rf_list, node) { 828 foreach(rf_list, node) {
801 gchar *fname = (gchar *) (node->data); 829 gchar *fname = (gchar *) (node->data);
802 connect_route *route = read_route(fname, is_perma); 830 connect_route *route = read_route(fname, is_perma);
803 if (route) 831 if (route) {
804 list = g_list_append(list, route); 832 list = g_list_append(list, route);
805 else 833 } else {
806 logwrite(LOG_ALERT, "could not read route configuration %s\n", fname); 834 logwrite(LOG_ALERT, "could not read route "
807 } 835 "configuration %s\n", fname);
808 836 }
837 }
809 /* set uid and gid back */ 838 /* set uid and gid back */
810 if (!conf.run_as_user) { 839 if (!conf.run_as_user) {
811 set_euidgid(saved_uid, saved_gid, NULL, NULL); 840 set_euidgid(saved_uid, saved_gid, NULL, NULL);
812 } 841 }
813
814 return list; 842 return list;
815 } 843 }
816 844
817 void 845 void
818 destroy_route_list(GList *list) 846 destroy_route_list(GList *list)