/* Chrysalide - Outil d'analyse de fichiers binaires
* core.c - prototypes pour les informations de base pour tout élément ajouté
*
* Copyright (C) 2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* OpenIDA 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.
*
* OpenIDA 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 "core.h"
#include
#include
#include
#include
#include
#include
#include
#include "../../common/io.h"
/******************************************************************************
* *
* Paramètres : - *
* *
* Description : Détermine une fois pour toute la désignation de l'usager. *
* *
* Retour : Nom statique déterminé. *
* *
* Remarques : - *
* *
******************************************************************************/
const char *get_local_author_name(void)
{
static char result[MAX_DB_AUTHOR_LEN]; /* Désignation à retourner */
char *chrysalide_user; /* Eventuel nom spécifique */
char *logname; /* Nom depuis l'environnement */
char hostname[HOST_NAME_MAX]; /* Nom de la machine courante */
int ret; /* Bilan d'un appel */
if (result[0] == '\0')
{
chrysalide_user = getenv("CHRYSALIDE_USER");
if (chrysalide_user != NULL)
{
strncpy(result, chrysalide_user, MAX_DB_AUTHOR_LEN - 1);
result[MAX_DB_AUTHOR_LEN - 1] = '\0';
}
else
{
logname = getenv("LOGNAME");
if (logname == NULL)
logname = "";
ret = gethostname(hostname, HOST_NAME_MAX);
if (ret != 0)
hostname[0] = '\0';
if (logname != NULL && hostname[0] != '\0')
snprintf(result, MAX_DB_AUTHOR_LEN, "%s@%s", logname, hostname);
else if (logname != NULL && hostname[0] == '\0')
snprintf(result, MAX_DB_AUTHOR_LEN, "%s", logname);
else if (logname == NULL && hostname[0] != '\0')
snprintf(result, MAX_DB_AUTHOR_LEN, "@%s", hostname);
else
snprintf(result, MAX_DB_AUTHOR_LEN, "anonymous");
}
}
return result;
}
/******************************************************************************
* *
* Paramètres : info = informations à constituer. [OUT] *
* type = type de l'élément à mettre en place. *
* user = provenance des informations ou NULL si machine. *
* *
* Description : Initialise le coeur des informations d'un élément ajouté. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void init_core_db_info(core_db_info *info, uint64_t type, const char *user)
{
info->type = type;
strncpy(info->user, user, MAX_DB_AUTHOR_LEN - 1);
info->user[MAX_DB_AUTHOR_LEN - 1] = '\0';
info->created = time(NULL);
info->modified = info->created;
info->saved = 0;
}
/******************************************************************************
* *
* Paramètres : info = informations à constituer. [OUT] *
* type = type de l'élément, lu en avance de phase. *
* fd = flux ouvert en lecture pour l'importation. *
* *
* Description : Importe le coeur des informations d'un élément ajouté. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool load_core_db_info(core_db_info *info, uint64_t type, int fd)
{
ssize_t got; /* Quantité de données reçues */
uint64_t val64; /* Valeur sur 64 bits */
info->type = type;
got = safe_recv(fd, info->user, MAX_DB_AUTHOR_LEN, MSG_WAITALL);
if (got != MAX_DB_AUTHOR_LEN) return false;
info->user[MAX_DB_AUTHOR_LEN - 1] = '\0';
got = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL);
if (got != sizeof(uint64_t)) return false;
info->created = be64toh(val64);
got = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL);
if (got != sizeof(uint64_t)) return false;
info->modified = be64toh(val64);
info->saved = info->modified;
return true;
}
/******************************************************************************
* *
* Paramètres : info = informations à sauvegarer. *
* fd = flux ouvert en écriture pour l'exportation. *
* *
* Description : Exporte le coeur des informations d'un élément ajouté. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool store_core_db_info(core_db_info *info, int fd)
{
ssize_t got; /* Quantité de données reçues */
got = safe_send(fd, (uint64_t []) { htobe64(info->type) }, sizeof(uint64_t), MSG_WAITALL);
if (got != sizeof(uint64_t)) return false;
got = safe_send(fd, info->user, MAX_DB_AUTHOR_LEN, MSG_WAITALL);
if (got != MAX_DB_AUTHOR_LEN) return false;
got = safe_send(fd, (uint64_t []) { htobe64(info->created) }, sizeof(uint64_t), MSG_WAITALL);
if (got != sizeof(uint64_t)) return false;
got = safe_send(fd, (uint64_t []) { htobe64(info->modified) }, sizeof(uint64_t), MSG_WAITALL);
if (got != sizeof(uint64_t)) return false;
info->saved = time(NULL);
return true;
}