summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clamsmtpd.c10
-rw-r--r--src/clstate.c46
2 files changed, 26 insertions, 30 deletions
diff --git a/src/clamsmtpd.c b/src/clamsmtpd.c
index a9e8f9d..e985fa3 100644
--- a/src/clamsmtpd.c
+++ b/src/clamsmtpd.c
@@ -171,7 +171,7 @@ int main(int argc, char* argv[])
clstate_init(&g_state);
/* Parse the arguments nicely */
- while((ch = getopt(argc, argv, "bc:d:D:h:l:m:p:qt:v")) != -1)
+ while((ch = getopt(argc, argv, "bc:d:D:f:h:l:m:p:qt:v")) != -1)
{
switch(ch)
{
@@ -267,7 +267,7 @@ int main(int argc, char* argv[])
}
}
- if(warnargs);
+ if(warnargs)
warnx("please use configuration file instead of command-line flags: %s", configfile);
argc -= optind;
@@ -357,9 +357,13 @@ int main(int argc, char* argv[])
if(g_state.pidfile)
pid_file(0);
- clstate_cleanup(&g_state);
messagex(NULL, LOG_DEBUG, "stopped");
+ /*
+ * We have to do this at the very end because even printing
+ * messages requires that g_state is valid.
+ */
+ clstate_cleanup(&g_state);
return 0;
}
diff --git a/src/clstate.c b/src/clstate.c
index 1d5f2af..3c6084c 100644
--- a/src/clstate.c
+++ b/src/clstate.c
@@ -159,7 +159,7 @@ int clstate_parse_config(clstate_t* state, const char* configfile)
err(1, "couldn't open config file: %s", configfile);
}
- if(fseek(f, 0, SEEK_END) == -1 || (len = ftell(f)) == -1)
+ if(fseek(f, 0, SEEK_END) == -1 || (len = ftell(f)) == -1 || fseek(f, 0, SEEK_SET) == -1)
err(1, "couldn't seek config file: %s", configfile);
if((state->_p = (char*)malloc(len + 2)) == NULL)
@@ -169,27 +169,21 @@ int clstate_parse_config(clstate_t* state, const char* configfile)
err(1, "couldn't read config file: %s", configfile);
fclose(f);
- messagex(NULL, LOG_DEBUG, "successfully opened config file: %s", configfile);
+ messagex(NULL, LOG_DEBUG, "opened config file: %s", configfile);
/* Double null terminate the data */
p = state->_p;
p[len] = 0;
p[len + 1] = 0;
- /* Now split string at new lines */
- while((t = strchr(p, '\n')) != NULL)
- {
- *t = 0;
- p = t + 1;
- }
-
n = state->_p;
/* Go through lines and process them */
- while(*n != 0)
+ while((t = strchr(n, '\n')) != NULL)
{
- p = n; /* Do this before trimming below */
- n = p + strlen(p) + 1;
+ *t = 0;
+ p = n; /* Do this before cleaning below */
+ n = t + 1;
p = trim_space(p);
@@ -251,9 +245,9 @@ int clstate_parse_config(clstate_t* state, const char* configfile)
/* Unrecognized option */
else
- errx(2, "unrecognized line in config file: %s", p);
+ errx(2, "invalid config line: %s", p);
- messagex(NULL, LOG_DEBUG, "successfully parsed line: %s", p);
+ messagex(NULL, LOG_DEBUG, "parsed line: %s", p);
}
return 0;
@@ -264,18 +258,18 @@ void clstate_validate(clstate_t* state)
ASSERT(state);
messagex(NULL, LOG_DEBUG, "validating configuration options");
- if(state->debug_level < -1 || state->debug_level > 4)
+ if(!(state->debug_level == -1 || state->debug_level <= LOG_DEBUG))
errx(2, "invalid debug log level (must be between 1 and 4)");
if(state->max_threads <= 1 || state->max_threads >= 1024)
- errx(2, "invalid " CFG_MAXTHREADS " (must be between 1 and 1024)");
+ errx(2, "invalid setting: " CFG_MAXTHREADS " (must be between 1 and 1024)");
if(state->timeout.tv_sec <= 0)
- errx(2, "invalid " CFG_TIMEOUT);
+ errx(2, "invalid setting: " CFG_TIMEOUT);
/* This option has no default, but is required */
if(state->outname == NULL)
- errx(2, "no " CFG_OUTADDR " specified in config file.");
+ errx(2, "no " CFG_OUTADDR " specified.");
if(state->bounce == -1)
errx(2, "invalid value for " CFG_BOUNCE);
@@ -293,9 +287,9 @@ void clstate_validate(clstate_t* state)
errx(2, "invalid " CFG_CLAMADDR " socket name: %s", state->clamname);
if(strlen(state->directory) == 0)
- errx(2, "invalid " CFG_DIRECTORY);
+ errx(2, "invalid setting: " CFG_DIRECTORY);
if(state->pidfile && strlen(state->pidfile) == 0)
- errx(2, "invalid " CFG_PIDFILE);
+ errx(2, "invalid setting: " CFG_PIDFILE);
if(state->header)
{
@@ -312,14 +306,12 @@ void clstate_validate(clstate_t* state)
void clstate_cleanup(clstate_t* state)
{
- if(state->_p)
- {
- free(state->_p);
- memset(state, 0, sizeof(*state));
- messagex(NULL, LOG_DEBUG, "freed configuration option memory");
- }
-
/* Close the mutex */
pthread_mutex_destroy(&(state->mutex));
pthread_mutexattr_destroy(&(state->_mtxattr));
+
+ if(state->_p)
+ free(state->_p);
+
+ memset(state, 0, sizeof(*state));
}