/* Chrysalide - Outil d'analyse de fichiers binaires * logs.c - diffusion de messages d'alerte ou informatifs * * Copyright (C) 2017 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide 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 3 of the License, or * (at your option) any later version. * * Chrysalide 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 Chrysalide. If not, see . */ #include "logs.h" #include #include "../gui/core/panels.h" #include "../gui/panels/log.h" /* Conserve le niveau de filtre des messages */ static LogMessageType _verbosity = LMT_COUNT; /* Affiche un message dans le terminal courant. */ static void print_message_without_gui(LogMessageType, const char *); /****************************************************************************** * * * Paramètres : - * * * * Description : Fournit la verbosité des messages système. * * * * Retour : Plus faible niveau des types de message affichés. * * * * Remarques : - * * * ******************************************************************************/ LogMessageType get_log_verbosity(void) { return _verbosity; } /****************************************************************************** * * * Paramètres : level = plus faible niveau des types de message affichés. * * * * Description : Définit la verbosité des messages système. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void set_log_verbosity(LogMessageType level) { _verbosity = level; } /****************************************************************************** * * * Paramètres : type = espèce du message à ajouter. * * msg = message à faire apparaître à l'écran. * * * * Description : Affiche un message dans le journal des messages système. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void log_simple_message(LogMessageType type, const char *msg) { GPanelItem *item; /* Eventuel affichage présent */ if (type >= _verbosity) { item = get_panel_item_by_name(PANEL_LOG_ID); if (item != NULL) g_log_panel_add_message(G_LOG_PANEL(item), type, msg); else print_message_without_gui(type, msg); } } /****************************************************************************** * * * Paramètres : type = espèce du message à ajouter. * * fmt = format du message à faire apparaître à l'écran. * * ... = éventuels arguments venant compléter le message. * * * * Description : Affiche un message dans le journal des messages système. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void log_variadic_message(LogMessageType type, const char *fmt, ...) { size_t len; /* Taille tampon disponible */ char *buffer; /* Tampon du msg reconstitué */ int ret; /* Bilan d'une impression */ char *ptr; /* Nouvelle allocation */ va_list ap; /* Liste d'arguments variable */ len = VARIADIC_LOG_BUFSIZE; buffer = calloc(len, sizeof(char)); while (buffer != NULL) { va_start(ap, fmt); ret = vsnprintf(buffer, len, fmt, ap); va_end(ap); if (ret >= 0 && ret < len) break; else { if (ret > -1) len += 1; /* glibc 2.1 */ else len *= 2; /* glibc 2.0 */ if ((ptr = realloc(buffer, len)) == NULL) { free(buffer); buffer = NULL; } else buffer = ptr; } } if (buffer != NULL) { log_simple_message(type, buffer); free(buffer); } } /****************************************************************************** * * * Paramètres : type = espèce du message à ajouter. * * msg = message à faire apparaître à l'écran. * * * * Description : Affiche un message dans le terminal courant. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void print_message_without_gui(LogMessageType type, const char *msg) { printf("!! MSG :: %s\n", msg); }