123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
- See the COPYRIGHT file for more information. */
- #include "config.h"
- #include "ocinternal.h"
- #include <stdio.h>
- #include <fcntl.h>
- #define PREFIXLEN 8
- #define ENVFLAG "OCLOGFILE"
- static int ocloginit = 0;
- static int oclogging = 0;
- static char* oclogfile = NULL;
- static FILE* oclogstream = NULL;
- void
- oc_loginit(void)
- {
- ocloginit = 1;
- oc_setlogging(0);
- oclogfile = NULL;
- oclogstream = NULL;
- /* Use environment variables to preset oclogging state*/
- /* I hope this is portable*/
- if(getenv(ENVFLAG) != NULL) {
- const char* file = getenv(ENVFLAG);
- oc_setlogging(1);
- oc_logopen(file);
- }
- }
- void
- oc_setlogging(int tf)
- {
- if(!ocloginit) oc_loginit();
- oclogging = tf;
- }
- void
- oc_logopen(const char* file)
- {
- if(!ocloginit) oc_loginit();
- if(oclogfile != NULL) {
- fclose(oclogstream);
- free(oclogfile);
- oclogfile = NULL;
- }
- if(file == NULL || strlen(file) == 0) {
- /* use stderr*/
- oclogstream = stderr;
- oclogfile = NULL;
- } else {
- int fd;
- oclogfile = (char*)malloc(strlen(file)+1);
- strcpy(oclogfile,file);
- oclogstream = NULL;
- /* We need to deal with this file carefully
- to avoid unauthorized access*/
- fd = open(oclogfile,O_WRONLY|O_APPEND|O_CREAT,0600);
- if(fd >= 0) {
- oclogstream = fdopen(fd,"a");
- } else {
- free(oclogfile);
- oclogfile = NULL;
- oc_setlogging(0);
- }
- }
- }
- void
- oc_logclose(void)
- {
- if(oclogfile != NULL && oclogstream != NULL) {
- fclose(oclogstream);
- oclogstream = NULL;
- if(oclogfile != NULL) free(oclogfile);
- oclogfile = NULL;
- }
- }
- void
- oc_log(int tag, const char* fmt, ...)
- {
- va_list args;
- char* prefix;
- if(!oclogging || oclogstream == NULL) return;
- switch (tag) {
- case LOGWARN: prefix = "Warning:"; break;
- case LOGERR: prefix = "Error: "; break;
- case LOGNOTE: prefix = "Note: "; break;
- case LOGDBG: prefix = "Debug: "; break;
- default:
- fprintf(oclogstream,"Error: Bad log prefix: %d\n",tag);
- prefix = "Error: ";
- break;
- }
- fprintf(oclogstream,"%s:",prefix);
- if(fmt != NULL) {
- va_start(args, fmt);
- vfprintf(oclogstream, fmt, args);
- va_end( args );
- }
- fprintf(oclogstream, "\n" );
- fflush(oclogstream);
- }
- void
- oc_logtext(int tag, const char* text)
- {
- char line[1024];
- size_t delta = 0;
- const char* eol = text;
- if(!oclogging || oclogstream == NULL) return;
- while(*text) {
- eol = strchr(text,'\n');
- if(eol == NULL)
- delta = strlen(text);
- else
- delta = (eol - text);
- if(delta > 0) memcpy(line,text,delta);
- line[delta] = '\0';
- fprintf(oclogstream," %s\n",line);
- text = eol+1;
- }
- }
|