/*
* sma -- Sendmail log analyser
*
* Copyright (c) 2000 - 2003 Jarkko Turkulainen. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY JARKKO TURKULAINEN ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL JARKKO TURKULAINEN BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Date: 2002/09/12 11:36:00 $
*/
#include "sma.h"
int isspace(int);
void
init(FILE *conf) {
char buff[1024];
char *str1, *str2;
int k, i, lines;
lines = 0;
while (fgets(buff, 1024, conf)) {
lines++;
/* null-terminate: */
buff[strlen(buff)-1] = '\0';
/* skip leading white space: */
for ( i = 0 ; isspace(buff[i]) ; i++)
;
/* empty line? */
if (!strlen(&buff[i]))
continue;
/* comment? */
if (!strncmp("#", &buff[i], 1))
continue;
/* fetch key and value: */
k = 0;
str1 = get_string(&buff[i]);
i += strlen(&buff[i])+1;
for ( ; isspace(buff[i]) ; i++ )
;
k = 1;
str2 = get_string(&buff[i]);
/* if not found... */
if (!strlen(str2)) {
if (!qflag)
fprintf(stderr, "%s: config file parse"
" error, line %d\n", pname, lines);
/* Parse configuration keys */
} else {
if (!strncmp(str1, "EnvelopePairs", 13)) {
epnum = atoi(str2);
} else if (!strncmp(str1, "EnvelopeSenders", 15)) {
if (!lflag) {
lrflag = 1;
lnum = atoi(str2);
}
} else if (!strncmp(str1, "EnvelopeRecipients", 18)) {
if (!lflag) {
lrflag = 1;
lrnum = atoi(str2);
}
} else if (!strncmp(str1, "RelayPairs", 10)) {
rpnum = atoi(str2);
} else if (!strncmp(str1, "RelaySenders", 12)) {
if (!rflag) {
rrflag = 1;
rnum = atoi(str2);
}
} else if (!strncmp(str1, "RelayRecipients", 15)) {
if (!rflag) {
rrflag = 1;
rrnum = atoi(str2);
}
} else if (!strncmp(str1, "Comment", 7)) {
if (!Cflag)
if (!(Cchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "BounceAddress", 13)) {
if (!(bechar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "ShowUsers", 9)) {
if (strncmp(str2, "yes", 3) && !dflag)
dflag = 1;
} else if (!strncmp(str1, "Format", 6)) {
if (!Oflag) {
Oflag = 1;
if (!(Ochar = strdup(str2)))
error_memory();
}
} else if (!strncmp(str1, "HostName", 8)) {
if (!Hflag)
if(!(Hchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "BgColor", 7)) {
if (!bflag)
if (!(bchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "TbColor", 7)) {
if (!(tbchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "Debug", 5)) {
if (!strncmp(str2, "yes", 3) && !vflag)
vflag = 1;
} else if (!strncmp(str1, "PrintTime", 9)) {
if (strncmp(str2, "yes", 3) && !nflag)
nflag = 1;
} else if (!strncmp(str1, "PrintGeneralInfo", 16)) {
if (!strncmp(str2, "no", 3))
pgflag = 0;
} else if (!strncmp(str1, "PrintStatus", 11)) {
stnum = atoi(str2);
} else if (!strncmp(str1, "PrintRuleset", 12)) {
rsnum = atoi(str2);
} else if (!strncmp(str1, "RulesetRelays", 13)) {
rsrnum = atoi(str2);
} else if (!strncmp(str1, "OutFile", 7)) {
if (!oflag)
if (!(ochar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "Sorting", 7)) {
if (strncmp(str2, "number", 6) && !sflag)
sflag = 1;
} else if (!strncmp(str1, "Silent", 6)) {
if (!strncmp(str2, "yes", 3) && !qflag)
qflag = 1;
} else if (!strncmp(str1, "SyslogTag", 9)) {
if (!Lflag)
if (!(Lchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "EnvelopeSenderFilter", 20)) {
if (!(sef = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "EnvelopeRecipientFilter", 23)) {
if (!(ref = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "RelaySenderFilter", 17)) {
if (!(srf = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "RelayRecipientFilter", 20)) {
if (!(rrf = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "StartTime", 9)) {
if (!Dflag)
if (!(sstring = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "EndTime", 7)) {
if (!Dflag)
if (!(estring = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "PictureURL", 10)) {
if (!(puchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "PictureALT", 10)) {
if (!(pachar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "PictureParameters", 17)) {
if (!(ppchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "PictureLink", 11)) {
if (!(plchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "HeaderText", 10)) {
if (!(htchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "FooterText", 10)) {
if (!(ftchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "CaseSensitive", 13)) {
if (!strncmp(str2, "yes", 3))
csflag = 1;
else
csflag = 0;
} else if (!strncmp(str1, "ClogFormat", 10)) {
if (!(cfchar = strdup(str2)))
error_memory();
} else if (!strncmp(str1, "ClogSentOnly", 12)) {
if (!strncmp(str2, "yes", 3))
clsflag = 1;
else
clsflag = 0;
} else if (!strncmp(str1, "IncludeAscii", 12)) {
if (!strncmp(str2, "yes", 3) && !iflag)
iflag = 1;
} else if (!strncmp(str1, "HashTables", 10)) {
if (!tflag) {
if(!(tchar = strdup(str2)))
error_memory();
tflag = 1;
}
} else if (!strncmp(str1, "DowncaseAddresses", 17)) {
if (!strncmp(str2, "yes", 3) && !dcaddrflag) {
dcaddrflag = 1;
}
} else {
if (!qflag)
fprintf(stderr, "%s: unknown config parameter"
" \"%s\", line %d\n", pname, str1, lines);
}
}
}
}
/*
* Find string, strip off '"'s.
*/
char *
get_string(char *str) {
char *tmpstr;
char *retstr;
int c;
/* Malloc space for string: */
if (!(tmpstr = malloc(strlen(str))))
error_memory();
/* check for '"': */
if (*str != '"') c = 0;
else c = 1;
/* not '"': */
if (!c) {
retstr = str;
free(tmpstr);
while (*str++ != '\0') {
if (isspace(*str)) {
break;
}
}
*str = '\0';
/* starts with '"': */
} else {
retstr = tmpstr;
while (*str++ != '\0') {
if (*str == '\\' && *(str+1) && *(str+1) == '"') {
*tmpstr++ = *(str+1);
str++;
} else if (*str == '"')
break;
else
*tmpstr++ = *str;
}
*tmpstr = '\0';
}
return retstr;
}
syntax highlighted by Code2HTML, v. 0.9.1