aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/initlog.c106
1 files changed, 94 insertions, 12 deletions
diff --git a/src/initlog.c b/src/initlog.c
index a8971e25..9883f2db 100644
--- a/src/initlog.c
+++ b/src/initlog.c
@@ -18,25 +18,93 @@
#include <popt.h>
+#include <regex.h>
+
#include "initlog.h"
#include "process.h"
-static int logfacility=LOG_LOCAL7;
+static int logfacility=LOG_DAEMON;
static int logpriority=LOG_NOTICE;
static int reexec=0;
static int quiet=0;
int debug=0;
+regex_t **regList = NULL;
+
static int logEntries = 0;
struct logInfo *logData = NULL;
+void readConfiguration(char *fname) {
+ int fd,num=0;
+ struct stat sbuf;
+ char *data,*line;
+ regex_t *regexp;
+ int lfac=-1,lpri=-1;
+
+ if ((fd=open(fname,O_RDONLY))==-1) return;
+ if (fstat(fd,&sbuf)) return;
+ data=malloc(sbuf.st_size);
+ if (read(fd,data,sbuf.st_size)!=sbuf.st_size) return;
+ while ((line=getLine(&data))) {
+ if (line[0]=='#') continue;
+ if (!strncmp(line,"ignore ",7)) {
+ regexp = malloc(sizeof(regex_t));
+ if (!regcomp(regexp,line+7,REG_EXTENDED|REG_NOSUB)) {
+ regList = realloc(regList,(num+2) * sizeof(regex_t *));
+ regList[num] = regexp;
+ regList[num+1] = NULL;
+ num++;
+ }
+ }
+ if (!strncmp(line,"facility ",9)) {
+ lfac=atoi(line+9);
+ if ((lfac == 0) && strcmp(line+9,"0")) {
+ int x =0;
+
+ lfac = LOG_DAEMON;
+ for (x=0;facilitynames[x].c_name;x++) {
+ if (!strcmp(line+9,facilitynames[x].c_name)) {
+ lfac = facilitynames[x].c_val;
+ break;
+ }
+ }
+ }
+ }
+ if (!strncmp(line,"priority ",9)) {
+ lpri = atoi(line+9);
+ if ((lpri == 0) && strcmp(line+9,"0")) {
+ int x=0;
+
+ lpri = LOG_NOTICE;
+ for (x=0;prioritynames[x].c_name;x++) {
+ if (!strcmp(line+9,prioritynames[x].c_name)) {
+ lpri = prioritynames[x].c_val;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (lfac!=-1) logfacility=lfac;
+ if (lpri!=-1) logpriority=lpri;
+}
+
char *getLine(char **data) {
/* Get one line from data */
+ /* Anything up to a carraige return (\r) is discarded. */
+ /* If this really bothers you, mail me and I might make it configurable. */
+ /* It's here to avoid confilcts with fsck's progress bar. */
char *x, *y;
if (!*data) return NULL;
-
- for (x = *data; *x && (*x != '\n'); x++);
+ x=*data;
+ while (*x && (*x != '\n')) {
+ while (*x && (*x != '\n') && (*x != '\r')) x++;
+ if (*x && *x=='\r') {
+ *data = x+1;
+ x++;
+ }
+ }
if (*x) {
x++;
} else {
@@ -66,6 +134,8 @@ char **toArray(char *line, int *num) {
*num = 0;
lines = NULL;
+ printf("in toArray, |%s|\n",line);
+
while ((tmpline=getLine(&line))) {
if (!*num)
lines = (char **) malloc(sizeof(char *));
@@ -197,14 +267,19 @@ int logString(char *cmd, char *string) {
int processArgs(int argc, char **argv, int silent) {
char *cmdname=NULL;
+ char *conffile=NULL;
int cmdevent=0;
char *cmd=NULL;
char *logstring=NULL;
char *fac=NULL,*pri=NULL;
+ int lfac=-1, lpri=-1;
poptContext context;
int rc;
struct poptOption optTable[] = {
POPT_AUTOHELP
+ { "conf", 0, POPT_ARG_STRING, &conffile, 0,
+ "configuration file (default: /etc/initlog.conf)", NULL
+ },
{ "name", 'n', POPT_ARG_STRING, &cmdname, 0,
"name of service being logged", NULL
},
@@ -224,7 +299,7 @@ int processArgs(int argc, char **argv, int silent) {
"string to log", NULL
},
{ "facility", 'f', POPT_ARG_STRING, &fac, 1,
- "facility to log at (default: 'daemon')", NULL
+ "facility to log at (default: 'local7')", NULL
},
{ "priority", 'p', POPT_ARG_STRING, &pri, 2,
"priority to log at (default: 'notice')", NULL
@@ -240,28 +315,28 @@ int processArgs(int argc, char **argv, int silent) {
while ((rc = poptGetNextOpt(context)) > 0) {
switch (rc) {
case 1:
- logfacility=atoi(fac);
- if ((logfacility == 0) && strcmp(fac,"0")) {
+ lfac=atoi(fac);
+ if ((lfac == 0) && strcmp(fac,"0")) {
int x =0;
- logfacility = LOG_DAEMON;
+ lfac = LOG_DAEMON;
for (x=0;facilitynames[x].c_name;x++) {
if (!strcmp(fac,facilitynames[x].c_name)) {
- logfacility = facilitynames[x].c_val;
+ lfac = facilitynames[x].c_val;
break;
}
}
}
break;
case 2:
- logpriority = atoi(pri);
- if ((logpriority == 0) && strcmp(pri,"0")) {
+ lpri = atoi(pri);
+ if ((lpri == 0) && strcmp(pri,"0")) {
int x=0;
- logpriority = LOG_NOTICE;
+ lpri = LOG_NOTICE;
for (x=0;prioritynames[x].c_name;x++) {
if (!strcmp(pri,prioritynames[x].c_name)) {
- logpriority = prioritynames[x].c_val;
+ lpri = prioritynames[x].c_val;
break;
}
}
@@ -293,6 +368,13 @@ int processArgs(int argc, char **argv, int silent) {
fprintf(stderr, _("--name requires one of --event or --string\n"));
return -1;
}
+ if (conffile) {
+ readConfiguration(conffile);
+ } else {
+ readConfiguration("/etc/initlog.conf");
+ }
+ if (lpri!=-1) logpriority=lpri;
+ if (lfac!=-1) logfacility=lfac;
if (cmdevent) {
logEvent(cmdname,cmdevent,logstring);
} else if (logstring) {