/* header_parse() -- Break headers into seperate entries */ void header_parse(FILE *stream) { size_t size = BUF_SZ, len = 0; char *p = (char *)NULL, *q = NULL; bool_t in_header = True; char l = 0; int c; while(in_header && ((c = fgetc(stream)) != EOF)) { /* Must have space for up to two more characters, since we may need to insert a '\r' */ if((p == (char *)NULL) || (len >= (size - 1))) { size += BUF_SZ; p = (char *)realloc(p, (size * sizeof(char))); if(p == (char *)NULL) { die("header_parse() -- realloc() failed"); } q = (p + len); } len++; if(l == '\n') { switch(c) { case ' ': case '\t': /* Must insert '\r' before '\n's embedded in header fields otherwise qmail won't accept our mail because a bare '\n' violates some RFC */ *(q - 1) = '\r'; /* Replace previous \n with \r */ *q++ = '\n'; /* Insert \n */ len++; break; case '\n': in_header = False; default: *q = '\0'; if((q = strrchr(p, '\n'))) { *q = '\0'; } header_save(p); q = p; len = 0; } } *q++ = c; l = c; } (void)free(p); }
/* read_config() -- Open and parse config file and extract values of variables */ bool_t read_config() { char buf[(BUF_SZ + 1)], *p, *q, *r; FILE *fp; if(config_file == (char *)NULL) { config_file = strdup(CONFIGURATION_FILE); if(config_file == (char *)NULL) { die("parse_config() -- strdup() failed"); } } if((fp = fopen(config_file, "r")) == NULL) { return(False); } while(fgets(buf, sizeof(buf), fp)) { char *begin=buf; char *rightside; /* Make comments invisible */ if((p = strchr(buf, '#'))) { *p = (char)NULL; } /* Ignore malformed lines and comments */ if(strchr(buf, '=') == (char *)NULL) continue; /* Parse out keywords */ p=firsttok(&begin, "= \t\n"); if(p){ rightside=begin; q = firsttok(&begin, "= \t\n"); } if(p && q) { if(strcasecmp(p, "Root") == 0) { if((root = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set Root=\"%s\"\n", root); } } else if(strcasecmp(p, "MailHub") == 0) { if((r = strchr(q, ':')) != NULL) { *r++ = '\0'; port = atoi(r); } if((mailhost = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set MailHub=\"%s\"\n", mailhost); log_event(LOG_INFO, "Set RemotePort=\"%d\"\n", port); } } else if(strcasecmp(p, "HostName") == 0) { free(hostname); hostname = strdup(q); if (!hostname) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set HostName=\"%s\"\n", hostname); } } else if(strcasecmp(p,"AddHeader") == 0) { if((r = firsttok(&rightside, "\n#")) != NULL) { header_save(r); free(r); } else { die("cannot AddHeader"); } if(log_level > 0 ) { log_event(LOG_INFO, "Set AddHeader=\"%s\"\n", q); } } #ifdef REWRITE_DOMAIN else if(strcasecmp(p, "RewriteDomain") == 0) { if((p = strrchr(q, '@'))) { mail_domain = strdup(++p); log_event(LOG_ERR, "Set RewriteDomain=\"%s\" is invalid\n", q); log_event(LOG_ERR, "Set RewriteDomain=\"%s\" used\n", mail_domain); } else { mail_domain = strdup(q); } if(mail_domain == (char *)NULL) { die("parse_config() -- strdup() failed"); } rewrite_domain = True; if(log_level > 0) { log_event(LOG_INFO, "Set RewriteDomain=\"%s\"\n", mail_domain); } } #endif else if(strcasecmp(p, "FromLineOverride") == 0) { if(strcasecmp(q, "YES") == 0) { override_from = True; } else { override_from = False; } if(log_level > 0) { log_event(LOG_INFO, "Set FromLineOverride=\"%s\"\n", override_from ? "True" : "False"); } } else if(strcasecmp(p, "RemotePort") == 0) { port = atoi(q); if(log_level > 0) { log_event(LOG_INFO, "Set RemotePort=\"%d\"\n", port); } } #ifdef HAVE_SSL else if(strcasecmp(p, "UseTLS") == 0) { if(strcasecmp(q, "YES") == 0) { use_tls = True; } else { use_tls = False; use_starttls = False; } if(log_level > 0) { log_event(LOG_INFO, "Set UseTLS=\"%s\"\n", use_tls ? "True" : "False"); } } else if(strcasecmp(p, "UseSTARTTLS") == 0) { if(strcasecmp(q, "YES") == 0) { use_starttls = True; use_tls = True; } else { use_starttls = False; } if(log_level > 0) { log_event(LOG_INFO, "Set UseSTARTTLS=\"%s\"\n", use_tls ? "True" : "False"); } } else if(strcasecmp(p, "UseTLSCert") == 0) { if(strcasecmp(q, "YES") == 0) { use_cert = True; } else { use_cert = False; } if(log_level > 0) { log_event(LOG_INFO, "Set UseTLSCert=\"%s\"\n", use_cert ? "True" : "False"); } } else if(strcasecmp(p, "TLSCert") == 0) { if((tls_cert = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set TLSCert=\"%s\"\n", tls_cert); } } #endif /* Command-line overrides these */ else if(strcasecmp(p, "AuthUser") == 0 && !auth_user) { if((auth_user = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set AuthUser=\"%s\"\n", auth_user); } } else if(strcasecmp(p, "AuthPass") == 0 && !auth_pass) { if((auth_pass = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set AuthPass=\"%s\"\n", auth_pass); } } else if(strcasecmp(p, "AuthMethod") == 0 && !auth_method) { if((auth_method = strdup(q)) == (char *)NULL) { die("parse_config() -- strdup() failed"); } if(log_level > 0) { log_event(LOG_INFO, "Set AuthMethod=\"%s\"\n", auth_method); } } else if(strcasecmp(p, "UseOldAUTH") == 0) { if(strcasecmp(q, "YES") == 0) { use_oldauth = True; } else { use_oldauth = False; } if(log_level > 0) { log_event(LOG_INFO, "Set UseOldAUTH=\"%s\"\n", use_oldauth ? "True" : "False"); } } else if (strcasecmp(p, "Debug") == 0) { if (strcasecmp(q, "YES") == 0) { log_level = 1; } else { log_level = 0; } } else { log_event(LOG_INFO, "Unable to set %s=\"%s\"\n", p, q); } free(p); free(q); } } (void)fclose(fp); return(True); }