/* * log.c - logging functionality * * Erik Troan * Matt Wilson * Michael Fulbright * Jeremy Katz * * Copyright 1997 - 2002 Red Hat, Inc. * * This software may be freely redistributed under the terms of the GNU * General Public License. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include "log.h" static FILE * tty_logfile = NULL; static FILE * file_logfile = NULL; static int minLevel = INFO; static void printLogHeader(int level, FILE *outfile) { time_t current_time = time(NULL); struct tm *t = gmtime (¤t_time); switch (level) { case DEBUGLVL: fprintf (outfile, "%02d:%02d:%02d DEBUG : ", t->tm_hour, t->tm_min, t->tm_sec); break; case INFO: fprintf (outfile, "%02d:%02d:%02d INFO : ", t->tm_hour, t->tm_min, t->tm_sec); break; case WARNING: fprintf (outfile, "%02d:%02d:%02d WARNING : ", t->tm_hour, t->tm_min, t->tm_sec); break; case ERROR: fprintf (outfile, "%02d:%02d:%02d ERROR : ", t->tm_hour, t->tm_min, t->tm_sec); break; case CRITICAL: fprintf (outfile, "%02d:%02d:%02d CRITICAL: ", t->tm_hour, t->tm_min, t->tm_sec); break; } } void logMessage(int level, const char * s, ...) { va_list args; /* Only log to the screen things that are above the minimum level. */ if (tty_logfile && level >= minLevel) { va_start(args, s); printLogHeader(level, tty_logfile); vfprintf(tty_logfile, s, args); fprintf(tty_logfile, "\n"); fflush(tty_logfile); va_end(args); } /* But log everything to the file. */ if (file_logfile) { va_start(args, s); printLogHeader(level, file_logfile); vfprintf(file_logfile, s, args); fprintf(file_logfile, "\n"); fflush(file_logfile); va_end(args); } return; } void openLog(int useLocal) { int flags, fd; if (!useLocal) { tty_logfile = fopen("/dev/tty3", "w"); file_logfile = fopen("/tmp/anaconda.log", "w"); } else { tty_logfile = NULL; file_logfile = fopen("debug.log", "w"); } if (tty_logfile) { fd = fileno(tty_logfile); flags = fcntl(fd, F_GETFD, 0) | FD_CLOEXEC; fcntl(fd, F_SETFD, flags); } if (file_logfile) { fd = fileno(file_logfile); flags = fcntl(fd, F_GETFD, 0) | FD_CLOEXEC; fcntl(fd, F_SETFD, flags); } } void closeLog(void) { if (tty_logfile) fclose(tty_logfile); if (file_logfile) fclose(file_logfile); } /* set the level. higher means you see more verbosity */ void setLogLevel(int level) { minLevel = level; } int getLogLevel(void) { return minLevel; }