/* Chrysalide - Outil d'analyse de fichiers binaires * rlestr.c - encodage par plage unique d'une chaîne de caractères * * Copyright (C) 2014 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 Foobar. If not, see . */ #include "timestamp.h" #include #include #include #include #include "../../../common/io.h" /****************************************************************************** * * * Paramètres : timestamp = horodatage à initialiser. [OUT] * * * * Description : Obtient un horodatage initialisé au moment même. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void init_timestamp(timestamp_t *timestamp) { struct timespec info; /* Détails sur l'époque */ clock_gettime(CLOCK_REALTIME, &info); *timestamp = info.tv_sec * 1000000 + info.tv_nsec / 1000; } /****************************************************************************** * * * Paramètres : stamp = horodatage d'un élément à tester. * * limit = horodatage en limite d'activité (incluse). * * * * Description : Définit si un horodatage est plus récent qu'un autre ou non. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ bool timestamp_is_younger(timestamp_t stamp, timestamp_t limit) { if (limit == TIMESTAMP_ALL_ACTIVE) return true; if (limit == TIMESTAMP_ALL_INACTIVE) return false; return (stamp <= limit); } /****************************************************************************** * * * Paramètres : t1 = première chaîne à comparer. * * t2 = seconde chaîne à comparer. * * * * Description : Effectue la comparaison entre deux horodatages. * * * * Retour : Résultat de la comparaison : -1, 0 ou 1. * * * * Remarques : - * * * ******************************************************************************/ int cmp_timestamp(const timestamp_t *t1, const timestamp_t *t2) { int result; /* Bilan à retourner */ if (*t1 < *t2) result = -1; else if (*t1 > *t2) result = 1; else result = 0; return result; } /****************************************************************************** * * * Paramètres : timestamp = informations à constituer. [OUT] * * fd = flux ouvert en lecture pour l'importation. * * flags = éventuelles options de réception supplémentaires.* * * * Description : Importe la définition d'un horodatage. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool recv_timestamp(timestamp_t *timestamp, int fd, int flags) { uint64_t val64; /* Valeur sur 64 bits */ bool status; /* Bilan d'une opération */ status = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL | flags); if (!status) return false; *timestamp = be64toh(val64); return true; } /****************************************************************************** * * * Paramètres : timestamp = informations à sauvegarer. * * fd = flux ouvert en écriture pour l'exportation. * * flags = éventuelles options d'envoi supplémentaires. * * * * Description : Exporte la définition d'un horodatage. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool send_timestamp(const timestamp_t *timestamp, int fd, int flags) { bool status; /* Bilan d'une opération */ status = safe_send(fd, (uint64_t []) { htobe64(*timestamp) }, sizeof(uint64_t), flags); if (!status) return false; return true; } /* ---------------------------------------------------------------------------------- */ /* MANIPULATIONS AVEC UNE BASE DE DONNEES */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : timestamp = horodatage aux informations inutiles. * * name = désignation personnalisée du champ dans la BD. * * values = couples de champs et de valeurs à lier. [OUT] * * count = nombre de ces couples. [OUT] * * * * Description : Constitue les champs destinés à une insertion / modification.* * * * Retour : Bilan de l'opération : succès ou non. * * * * Remarques : - * * * ******************************************************************************/ bool prepare_db_statement_for_timestamp(const timestamp_t *timestamp, const char *name, bound_value **values, size_t *count) { bound_value *value; /* Valeur à éditer / définir */ *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); value = &(*values)[*count - 1]; value->cname = name; value->built_name = false; value->type = SQLITE_INT64; value->integer64 = *timestamp; return true; } /****************************************************************************** * * * Paramètres : timestamp = horodatage aux informations inutiles. * * name = désignation personnalisée du champ dans la BD. * * values = tableau d'éléments à compléter. [OUT] * * count = nombre de descriptions renseignées. [OUT] * * * * Description : Décrit les colonnes utiles à un horodatage. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool setup_load_of_timestamp(const timestamp_t *timestamp, const char *name, bound_value **values, size_t *count) { bound_value *value; /* Valeur à éditer / définir */ *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); value = &(*values)[*count - 1]; value->cname = name; value->built_name = false; value->type = SQLITE_INT64; return true; } /****************************************************************************** * * * Paramètres : timestamp = horodatage à compléter. * * name = désignation personnalisée du champ dans la BD. * * values = tableau d'éléments à consulter. * * count = nombre de descriptions renseignées. * * * * Description : Charge les valeurs utiles pour un horodatage. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool load_timestamp(timestamp_t *timestamp, const char *name, const bound_value *values, size_t count) { const bound_value *value; /* Valeur à intégrer */ value = find_bound_value(values, count, name); if (value == NULL) return false; if (value->type != SQLITE_INT64) return false; *timestamp = value->integer64; return true; }