/* * Copyright (C) 2014-2016 * Olivier Gayot * Bartosz Golaszewski * Olivier Gayot * * 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; either version 2 of the License, or * (at your option) any later version. * * 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 #include #include #include #include #include #include "log.h" #define PRINT_FROM_VA(STREAM, LVL, FMT) \ do { \ va_list va; \ va_start(va, FMT); \ fprintf(STREAM, "caod ["LVL"] PID: %d\t", getpid()); \ vfprintf(STREAM, FMT, va); \ fprintf(STREAM, "\n"); \ va_end(va); \ } while (0) static const char* const logpath = "/tmp/caod.log"; static FILE* logfd; static void close_log(void) { fclose(logfd); } void caod_setup_logs(void) { (void)unlink(logpath); logfd = fopen(logpath, "w"); if (logfd) atexit(&close_log); } void caod_info(const char *fmt, ...) { PRINT_FROM_VA(stdout, "INFO", fmt); if (logfd) { PRINT_FROM_VA(logfd, "INFO", fmt); } } void caod_warn(const char *fmt, ...) { PRINT_FROM_VA(stdout, "WARN", fmt); if (logfd) { PRINT_FROM_VA(logfd, "WARN", fmt); } } void caod_err(const char *fmt, ...) { PRINT_FROM_VA(stdout, "ERR", fmt); if (logfd) { PRINT_FROM_VA(logfd, "ERR", fmt); } } void caod_log_hook(int level, const char *line) { char buf[256]; int last; memset(buf, 0, sizeof(buf)); strncpy(buf, line, sizeof(buf)); last = strlen(buf)-1; if (buf[last] == '\n') { buf[last] = '\0'; } switch (level) { case LLL_DEBUG: case LLL_INFO: case LLL_NOTICE: caod_info("%s", buf); break; case LLL_WARN: caod_warn("%s", buf); break; case LLL_ERR: caod_err("%s", buf); break; default: break; } }