summaryrefslogtreecommitdiffstats
path: root/common/eurephia_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/eurephia_log.c')
-rw-r--r--common/eurephia_log.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/common/eurephia_log.c b/common/eurephia_log.c
new file mode 100644
index 0000000..9ea6a8e
--- /dev/null
+++ b/common/eurephia_log.c
@@ -0,0 +1,77 @@
+/* eurephia_log.c -- eurephia logging
+ *
+ * GPLv2 - Copyright (C) 2008 David Sommerseth <dazo@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; version 2
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <time.h>
+#include <pthread.h>
+
+#include "eurephia_struct.h"
+#include "eurephia_log.h"
+
+const char *erp_logtypes[] = {
+ "\0",
+ "-- INFO -- \0",
+ "-- DEBUG -- \0",
+ "** WARNING ** \0",
+ "** ERROR ** \0",
+ "** CRITICAL ** \0",
+ "** - FATAL - ** \0",
+ "** * PANIC * ** \0"
+};
+
+// POSIX Mutex to avoild simultaneously logging activity from
+// several threads at the same time
+pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+// Simple log function ... Write log data to the context log file
+void eurephia_log(eurephiaCTX *ctx, int logdst, int loglvl, const char *fmt, ... ) {
+
+ // Only log if we have an open log file and which has high enough log level
+ if( (ctx->log != NULL) && (ctx->loglevel >= loglvl) ) {
+ va_list ap;
+ char tstmp_str[200];
+ time_t tstmp;
+ struct tm *loctstmp;
+
+ // Get timestamp
+ memset(&tstmp_str, 0, 200);
+ tstmp = time(NULL);
+ loctstmp = localtime(&tstmp);
+ if( loctstmp != NULL ) {
+ if( strftime(tstmp_str, 198, "%Y-%m-%d %H:%M:%S %Z", loctstmp) == 0 ) {
+ snprintf(tstmp_str, 198, "(error getting timestamp string)");
+ }
+ } else {
+ snprintf(tstmp_str, 198, "(error getting timestamp)");
+ }
+
+ va_start(ap, fmt);
+ pthread_mutex_lock(&log_mutex); // Block other threads from writing when we write
+ fprintf(ctx->log, "[%s] %s [%i] ", tstmp_str, erp_logtypes[logdst], loglvl);
+ vfprintf(ctx->log, fmt, ap);
+ fprintf(ctx->log, "\n");
+ fflush(ctx->log);
+ pthread_mutex_unlock(&log_mutex); // Unblock other threads
+ va_end(ap);
+ }
+}
+