diff options
Diffstat (limited to 'nslcd/log.c')
-rw-r--r-- | nslcd/log.c | 151 |
1 files changed, 19 insertions, 132 deletions
diff --git a/nslcd/log.c b/nslcd/log.c index bc39398..27402f7 100644 --- a/nslcd/log.c +++ b/nslcd/log.c @@ -19,7 +19,6 @@ 02110-1301 USA */ - #include "config.h" #include <stdio.h> @@ -34,106 +33,37 @@ #include "log.h" - /* set the logname */ #undef PACKAGE #define PACKAGE "nslcd" - -/* storage for logging modes */ -static struct cvsd_log { - FILE *fp; /* NULL==syslog */ - int loglevel; - struct cvsd_log *next; -} *cvsd_loglist=NULL; - - /* default loglevel when no logging is configured */ static int prelogging_loglevel=LOG_INFO; +/* loglevel to use before logging to syslog */ +static int loglevel=LOG_INFO; /* the session id that is set for this thread */ static __thread char *sessionid=NULL; - /* the request identifier that is set for this thread */ static __thread char *requestid=NULL; #define MAX_REQUESTID_LENGTH 40 - /* set loglevel when no logging is configured */ -void log_setdefaultloglevel(int loglevel) -{ - prelogging_loglevel=loglevel; -} - - -/* add logging method to configuration list */ -static void log_addlogging_fp(FILE *fp,int loglevel) -{ - struct cvsd_log *tmp,*lst; - /* create new logstruct */ - tmp=(struct cvsd_log *)malloc(sizeof(struct cvsd_log)); - if (tmp==NULL) - { - fprintf(stderr,"malloc() failed: %s",strerror(errno)); - /* since this is done during initialisation it's best to bail out */ - exit(EXIT_FAILURE); - } - tmp->fp=fp; - tmp->loglevel=loglevel; - tmp->next=NULL; - /* save the struct in the list */ - if (cvsd_loglist==NULL) - cvsd_loglist=tmp; - else - { - for (lst=cvsd_loglist;lst->next!=NULL;lst=lst->next); - lst->next=tmp; - } -} - - -/* configure logging to a file */ -void log_addlogging_file(const char *filename,int loglevel) -{ - FILE *fp; - fp=fopen(filename,"a"); - if (fp==NULL) - { - log_log(LOG_ERR,"cannot open logfile (%s) for appending: %s",filename,strerror(errno)); - exit(EXIT_FAILURE); - } - log_addlogging_fp(fp,loglevel); -} - - -/* configure logging to syslog */ -void log_addlogging_syslog(int loglevel) +void log_setdefaultloglevel(int pri) { - openlog(PACKAGE,LOG_PID,LOG_DAEMON); - log_addlogging_fp(NULL,loglevel); + prelogging_loglevel=pri; } - -/* configure a null logging mode (no logging) */ -void log_addlogging_none() -{ - /* this is a hack, but it's so easy */ - log_addlogging_fp(NULL,LOG_EMERG); -} - - /* start the logging with the configured logging methods if no method is configured yet, logging is done to syslog */ void log_startlogging(void) { - if (cvsd_loglist==NULL) - log_addlogging_syslog(LOG_INFO); + openlog(PACKAGE,LOG_PID,LOG_DAEMON); prelogging_loglevel=-1; } - /* indicate that we should clear any session identifiers set by log_newsession */ void log_clearsession(void) @@ -166,7 +96,6 @@ void log_newsession(void) requestid[0]='\0'; } - /* indicate that a request identifier should be included in the output from this point on, until log_newsession() is called */ void log_setrequest(const char *format, ...) @@ -189,27 +118,23 @@ void log_setrequest(const char *format, ...) va_end(ap); } - /* log the given message using the configured logging method */ void log_log(int pri,const char *format, ...) { int res; - struct cvsd_log *lst; - /* TODO: make this something better */ - #define maxbufferlen 200 - char buffer[maxbufferlen]; + char buffer[200]; va_list ap; /* make the message */ va_start(ap,format); - res=vsnprintf(buffer,maxbufferlen,format,ap); - if ((res<0)||(res>=maxbufferlen)) + res=vsnprintf(buffer,sizeof(buffer),format,ap); + if ((res<0)||(res>=(int)sizeof(buffer))) { /* truncate with "..." */ - buffer[maxbufferlen-2]='.'; - buffer[maxbufferlen-3]='.'; - buffer[maxbufferlen-4]='.'; + buffer[sizeof(buffer)-2]='.'; + buffer[sizeof(buffer)-3]='.'; + buffer[sizeof(buffer)-4]='.'; } - buffer[maxbufferlen-1]='\0'; + buffer[sizeof(buffer)-1]='\0'; va_end(ap); /* do the logging */ if (prelogging_loglevel>=0) @@ -227,52 +152,14 @@ void log_log(int pri,const char *format, ...) } else { - for (lst=cvsd_loglist;lst!=NULL;lst=lst->next) + if (pri<=loglevel) { - if (pri<=lst->loglevel) - { - if (lst->fp==NULL) /* syslog */ - { - if ((requestid!=NULL)&&(requestid[0]!='\0')) - syslog(pri,"[%s] <%s> %s",sessionid,requestid,buffer); - else if ((sessionid!=NULL)&&(sessionid[0]!='\0')) - syslog(pri,"[%s] %s",sessionid,buffer); - else - syslog(pri,"%s",buffer); - } - else /* file */ - { - if ((requestid!=NULL)&&(requestid[0]!='\0')) - fprintf(lst->fp,"%s: [%s] <%s> %s\n",sessionid,requestid,PACKAGE,buffer); - else if ((sessionid!=NULL)&&(sessionid[0]!='\0')) - fprintf(lst->fp,"%s: [%s] %s\n",sessionid,PACKAGE,buffer); - else - fprintf(lst->fp,"%s: %s\n",PACKAGE,buffer); - fflush(lst->fp); - } - } + if ((requestid!=NULL)&&(requestid[0]!='\0')) + syslog(pri,"[%s] <%s> %s",sessionid,requestid,buffer); + else if ((sessionid!=NULL)&&(sessionid[0]!='\0')) + syslog(pri,"[%s] %s",sessionid,buffer); + else + syslog(pri,"%s",buffer); } } } - - -/* return the syslog loglevel represented by the string - return -1 on unknown */ -int log_getloglevel(const char *lvl) -{ - if ( strcmp(lvl,"crit")==0 ) - return LOG_CRIT; - else if ( (strcmp(lvl,"error")==0) || - (strcmp(lvl,"err")==0) ) - return LOG_ERR; - else if ( strcmp(lvl,"warning")==0 ) - return LOG_WARNING; - else if ( strcmp(lvl,"notice")==0 ) - return LOG_NOTICE; - else if ( strcmp(lvl,"info")==0 ) - return LOG_INFO; - else if ( strcmp(lvl,"debug")==0 ) - return LOG_DEBUG; - else - return -1; /* unknown */ -} |