Factor out ConfFile parsing to separate function
Also, fix segfault when syslogd is started without a .conf file. Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
parent
c6a19049dc
commit
ddaa0a1a82
192
src/syslogd.c
192
src/syslogd.c
@ -2251,18 +2251,120 @@ void doexit(int signo)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check active rules for action FWD
|
||||||
|
*/
|
||||||
|
static int cffwd(void)
|
||||||
|
{
|
||||||
|
struct filed *f;
|
||||||
|
int fwd = 0;
|
||||||
|
|
||||||
|
for (f = Files; f; f = f->f_next) {
|
||||||
|
if (f->f_type == F_FORW ||
|
||||||
|
f->f_type == F_FORW_SUSP ||
|
||||||
|
f->f_type == F_FORW_UNKN)
|
||||||
|
fwd++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read /etc/syslog.conf and any *.conf in /etc/syslog.d/
|
||||||
|
*/
|
||||||
|
static int cfparse(char *fn)
|
||||||
|
{
|
||||||
|
struct filed **nextp = NULL;
|
||||||
|
struct filed *f;
|
||||||
|
FILE *fp;
|
||||||
|
char cbuf[BUFSIZ];
|
||||||
|
char *cline;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
fp = fopen(fn, "r");
|
||||||
|
if (!fp) {
|
||||||
|
logit("Cannot open %s: %s\n", fn, strerror(errno));
|
||||||
|
|
||||||
|
/* Create fallback .conf with err+panic sent to console */
|
||||||
|
Files = f = calloc(1, sizeof(*f));
|
||||||
|
if (!f) {
|
||||||
|
logerror("Cannot allocate memory for log target/file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
cfline("*.err\t" _PATH_CONSOLE, f);
|
||||||
|
|
||||||
|
f->f_next = calloc(1, sizeof(*f)); /* ASP */
|
||||||
|
if (!f->f_next) {
|
||||||
|
logerror("Cannot allocate memory for log target/file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
f = f->f_next;
|
||||||
|
cfline("*.panic\t*", f);
|
||||||
|
|
||||||
|
Initialized = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Foreach line in the conf table, open that file.
|
||||||
|
*/
|
||||||
|
cline = cbuf;
|
||||||
|
while (fgets(cline, sizeof(cbuf) - (cline - cbuf), fp) != NULL) {
|
||||||
|
/*
|
||||||
|
* check for end-of-section, comments, strip off trailing
|
||||||
|
* spaces and newline character.
|
||||||
|
*/
|
||||||
|
for (p = cline; isspace(*p); ++p)
|
||||||
|
;
|
||||||
|
if (*p == '\0' || *p == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
memmove(cline, p, strlen(p) + 1);
|
||||||
|
for (p = strchr(cline, '\0'); isspace(*--p);)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (*p == '\\') {
|
||||||
|
if ((p - cbuf) > BUFSIZ - 30) {
|
||||||
|
/* Oops the buffer is full - what now? */
|
||||||
|
cline = cbuf;
|
||||||
|
} else {
|
||||||
|
*p = 0;
|
||||||
|
cline = p;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
cline = cbuf;
|
||||||
|
|
||||||
|
*++p = '\0';
|
||||||
|
|
||||||
|
f = (struct filed *)calloc(1, sizeof(*f));
|
||||||
|
if (!f) {
|
||||||
|
logerror("Cannot allocate memory for log file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nextp)
|
||||||
|
Files = f;
|
||||||
|
else
|
||||||
|
*nextp = f;
|
||||||
|
nextp = &f->f_next;
|
||||||
|
|
||||||
|
cfline(cbuf, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close the configuration file */
|
||||||
|
(void)fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INIT -- Initialize syslogd from configuration table
|
* INIT -- Initialize syslogd from configuration table
|
||||||
*/
|
*/
|
||||||
void init(void)
|
void init(void)
|
||||||
{
|
{
|
||||||
struct filed **nextp = NULL;
|
|
||||||
struct hostent *hent;
|
struct hostent *hent;
|
||||||
struct filed *f;
|
struct filed *f;
|
||||||
unsigned int Forwarding = 0;
|
|
||||||
FILE *cf;
|
|
||||||
char cbuf[BUFSIZ];
|
|
||||||
char *cline;
|
|
||||||
char *p;
|
char *p;
|
||||||
int i, lognum;
|
int i, lognum;
|
||||||
|
|
||||||
@ -2337,86 +2439,16 @@ void init(void)
|
|||||||
/*
|
/*
|
||||||
* Convert to lower case to recognize the correct domain laterly
|
* Convert to lower case to recognize the correct domain laterly
|
||||||
*/
|
*/
|
||||||
for (p = (char *)LocalDomain; *p; p++)
|
for (p = (char *)LocalDomain; *p; p++) {
|
||||||
if (isupper(*p))
|
if (isupper(*p))
|
||||||
*p = tolower(*p);
|
*p = tolower(*p);
|
||||||
|
|
||||||
/* open the configuration file */
|
|
||||||
if ((cf = fopen(ConfFile, "r")) == NULL) {
|
|
||||||
logit("cannot open %s.\n", ConfFile);
|
|
||||||
|
|
||||||
cfline("*.err\t" _PATH_CONSOLE, f);
|
|
||||||
|
|
||||||
*nextp = calloc(1, sizeof(*f));
|
|
||||||
if (!*nextp) {
|
|
||||||
logerror("Cannot allocate memory for log target/file");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cfline("*.ERR\t" _PATH_CONSOLE, *nextp);
|
|
||||||
|
|
||||||
(*nextp)->f_next = calloc(1, sizeof(*f)); /* ASP */
|
|
||||||
if (!*nextp) {
|
|
||||||
logerror("Cannot allocate memory for log target/file");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cfline("*.PANIC\t*", (*nextp)->f_next);
|
|
||||||
|
|
||||||
Initialized = 1;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Foreach line in the conf table, open that file.
|
* Read configuration file(s)
|
||||||
*/
|
*/
|
||||||
cline = cbuf;
|
if (cfparse(ConfFile))
|
||||||
while (fgets(cline, sizeof(cbuf) - (cline - cbuf), cf) != NULL) {
|
return;
|
||||||
/*
|
|
||||||
* check for end-of-section, comments, strip off trailing
|
|
||||||
* spaces and newline character.
|
|
||||||
*/
|
|
||||||
for (p = cline; isspace(*p); ++p)
|
|
||||||
;
|
|
||||||
if (*p == '\0' || *p == '#')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
memmove(cline, p, strlen(p) + 1);
|
|
||||||
for (p = strchr(cline, '\0'); isspace(*--p);)
|
|
||||||
;
|
|
||||||
|
|
||||||
if (*p == '\\') {
|
|
||||||
if ((p - cbuf) > BUFSIZ - 30) {
|
|
||||||
/* Oops the buffer is full - what now? */
|
|
||||||
cline = cbuf;
|
|
||||||
} else {
|
|
||||||
*p = 0;
|
|
||||||
cline = p;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
cline = cbuf;
|
|
||||||
|
|
||||||
*++p = '\0';
|
|
||||||
|
|
||||||
f = (struct filed *)calloc(1, sizeof(*f));
|
|
||||||
if (!f) {
|
|
||||||
logerror("Cannot allocate memory for log file");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nextp)
|
|
||||||
Files = f;
|
|
||||||
else
|
|
||||||
*nextp = f;
|
|
||||||
nextp = &f->f_next;
|
|
||||||
|
|
||||||
cfline(cbuf, f);
|
|
||||||
if (f->f_type == F_FORW || f->f_type == F_FORW_SUSP || f->f_type == F_FORW_UNKN) {
|
|
||||||
Forwarding++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* close the configuration file */
|
|
||||||
(void)fclose(cf);
|
|
||||||
|
|
||||||
for (i = 0; i < nfunix; i++) {
|
for (i = 0; i < nfunix; i++) {
|
||||||
if (funix[i] != -1)
|
if (funix[i] != -1)
|
||||||
@ -2428,7 +2460,7 @@ void init(void)
|
|||||||
logit("Opened UNIX socket `%s'.\n", funixn[i]);
|
logit("Opened UNIX socket `%s'.\n", funixn[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Forwarding || AcceptRemote) {
|
if (cffwd() || AcceptRemote) {
|
||||||
if (!finet) {
|
if (!finet) {
|
||||||
finet = create_inet_sockets();
|
finet = create_inet_sockets();
|
||||||
if (finet) {
|
if (finet) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user