Mercurial > masqmail
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) |