summaryrefslogtreecommitdiff
path: root/src/analysis/db/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/db/client.c')
-rw-r--r--src/analysis/db/client.c99
1 files changed, 67 insertions, 32 deletions
diff --git a/src/analysis/db/client.c b/src/analysis/db/client.c
index 2a7aa03..309d9ed 100644
--- a/src/analysis/db/client.c
+++ b/src/analysis/db/client.c
@@ -353,11 +353,14 @@ bool g_db_client_start_remote(GDbClient *client, const char *host, unsigned shor
static bool g_db_client_start_common(GDbClient *client, const char *desc)
{
+ packed_buffer out_pbuf; /* Tampon d'émission */
+ bool status; /* Bilan d'une opération */
rle_string user; /* Nom d'utilisateur associé */
GChecksum *checksum; /* Empreinte MD5 à signer */
unsigned char md5_digest[16]; /* Empreinte MD5 calculée */
RSA *key; /* Clef pour la signature */
unsigned char sig[RSA_USED_SIZE]; /* Signature effectuée */
+ packed_buffer in_pbuf; /* Tampon de réception */
uint32_t data; /* Mot de données lues */
DBError error; /* Validation de la connexion */
@@ -372,19 +375,21 @@ static bool g_db_client_start_common(GDbClient *client, const char *desc)
* Tout ceci est à synchroniser avec la fonction g_db_server_listener().
*/
- if (!safe_send(client->fd, (uint32_t []) { htobe32(DBC_HELO) }, sizeof(uint32_t), MSG_MORE))
- goto gdcs_error;
+ init_packed_buffer(&out_pbuf);
- if (!safe_send(client->fd, (uint32_t []) { htobe32(CDB_PROTOCOL_VERSION) }, sizeof(uint32_t), MSG_MORE))
- goto gdcs_error;
+ status = extend_packed_buffer(&out_pbuf, (uint32_t []) { DBC_HELO }, sizeof(uint32_t), true);
+ if (!status) goto gdcs_error;
- if (!send_rle_string(&client->hash, client->fd, MSG_MORE))
- goto gdcs_error;
+ status = extend_packed_buffer(&out_pbuf, (uint32_t []) { CDB_PROTOCOL_VERSION }, sizeof(uint32_t), true);
+ if (!status) goto gdcs_error;
+
+ status = pack_rle_string(&client->hash, &out_pbuf);
+ if (!status) goto gdcs_error;
init_rle_string(&user, client->author);
- if (!send_rle_string(&user, client->fd, MSG_MORE))
- goto gdcs_error;
+ status = pack_rle_string(&user, &out_pbuf);
+ if (!status) goto gdcs_error;
checksum = g_checksum_new(G_CHECKSUM_MD5);
g_checksum_update(checksum, (guchar *)get_rle_string(&user), get_rle_length(&user));
@@ -399,8 +404,11 @@ static bool g_db_client_start_common(GDbClient *client, const char *desc)
RSA_free(key);
- if (!safe_send(client->fd, sig, RSA_USED_SIZE, 0))
- goto gdcs_error;
+ status = extend_packed_buffer(&out_pbuf, sig, RSA_USED_SIZE, false);
+ if (!status) goto gdcs_error;
+
+ status = send_packed_buffer(&out_pbuf, client->fd);
+ if (!status) goto gdcs_error;
/**
* Le serveur doit répondre pour un message type :
@@ -409,19 +417,22 @@ static bool g_db_client_start_common(GDbClient *client, const char *desc)
* ou 'DBE_WRONG_VERSION' ... 'DBE_LOADING_ERROR').
*/
- if (!safe_recv(client->fd, &data, sizeof(uint32_t), 0))
- goto gdcs_error;
+ status = recv_packed_buffer(&in_pbuf, client->fd);
+ if (!status) goto gdsc_error;
- if (be32toh(data) != DBC_WELCOME)
+ status = extract_packed_buffer(&in_pbuf, &data, sizeof(uint32_t), true);
+ if (!status) goto gdsc_error;
+
+ if (data != DBC_WELCOME)
{
log_variadic_message(LMT_ERROR, _("The server '%s' did not welcome us!"), desc);
- goto gdcs_error;
+ goto gdsc_error;
}
- if (!safe_recv(client->fd, &data, sizeof(uint32_t), 0))
- goto gdcs_error;
+ status = extract_packed_buffer(&in_pbuf, &data, sizeof(uint32_t), true);
+ if (!status) goto gdsc_error;
- error = be32toh(data);
+ error = data;
switch (error)
{
@@ -432,25 +443,25 @@ static bool g_db_client_start_common(GDbClient *client, const char *desc)
case DBE_WRONG_VERSION:
log_variadic_message(LMT_ERROR, _("The server '%s' does not use our protocol version (0x%08x)..."),
desc, CDB_PROTOCOL_VERSION);
- goto gdcs_error;
+ goto gdsc_error;
break;
case DBE_XML_VERSION_ERROR:
log_variadic_message(LMT_ERROR, _("The archive from the server '%s' does not use our protocol version (0x%08x)..."),
desc, CDB_PROTOCOL_VERSION);
- goto gdcs_error;
+ goto gdsc_error;
break;
case DBE_DB_LOADING_ERROR:
log_variadic_message(LMT_ERROR, _("The server '%s' got into troubles while loading the database...."),
desc);
- goto gdcs_error;
+ goto gdsc_error;
break;
default:
log_variadic_message(LMT_ERROR, _("The server '%s' has run into an error (%u)..."),
desc, error);
- goto gdcs_error;
+ goto gdsc_error;
break;
}
@@ -460,13 +471,22 @@ static bool g_db_client_start_common(GDbClient *client, const char *desc)
{
log_variadic_message(LMT_ERROR, _("Failed to start a listening thread for the server '%s'!"),
desc);
- goto gdcs_error;
+ goto gdsc_error;
}
+ exit_packed_buffer(&out_pbuf);
+ exit_packed_buffer(&in_pbuf);
+
return true;
+ gdsc_error:
+
+ exit_packed_buffer(&in_pbuf);
+
gdcs_error:
+ exit_packed_buffer(&out_pbuf);
+
unset_rle_string(&user);
close(client->fd);
@@ -493,7 +513,8 @@ static void *g_db_client_update(GDbClient *client)
{
struct pollfd fds; /* Surveillance des flux */
int ret; /* Bilan d'un appel */
- uint32_t val32; /* Valeur sur 32 bits */
+ packed_buffer in_pbuf; /* Tampon de réception */
+ uint32_t tmp32; /* Valeur sur 32 bits */
bool status; /* Bilan d'une opération */
uint32_t command; /* Commande de la requête */
DBError error; /* Bilan d'une commande passée */
@@ -515,19 +536,20 @@ static void *g_db_client_update(GDbClient *client)
if (fds.revents & (POLLIN | POLLPRI))
{
- status = safe_recv(fds.fd, &val32, sizeof(uint32_t), 0);
+ status = recv_packed_buffer(&in_pbuf, fds.fd);
if (!status) goto gdcu_bad_exchange;
- command = be32toh(val32);
+ status = extract_packed_buffer(&in_pbuf, &command, sizeof(uint32_t), true);
+ if (!status) goto gdcu_bad_exchange;
switch (command)
{
case DBC_SAVE:
- status = safe_recv(fds.fd, &val32, sizeof(uint32_t), 0);
+ status = extract_packed_buffer(&in_pbuf, &tmp32, sizeof(uint32_t), true);
if (!status) goto gdcu_bad_exchange;
- error = be32toh(val32);
+ error = tmp32;
if (error == DBE_NONE)
log_variadic_message(LMT_INFO, _("Archive saved for binary '%s'"),
@@ -540,13 +562,13 @@ static void *g_db_client_update(GDbClient *client)
case DBC_COLLECTION:
- status = safe_recv(fds.fd, &val32, sizeof(uint32_t), 0);
+ status = extract_packed_buffer(&in_pbuf, &tmp32, sizeof(uint32_t), true);
if (!status) goto gdcu_bad_exchange;
- collec = find_collection_in_list(client->collections, be32toh(val32));
+ collec = find_collection_in_list(client->collections, tmp32);
if (collec == NULL) goto gdcu_bad_exchange;
- status = g_db_collection_recv(collec, fds.fd, NULL);
+ status = g_db_collection_unpack(collec, &in_pbuf, NULL);
if (!status) goto gdcu_bad_exchange;
@@ -558,12 +580,16 @@ static void *g_db_client_update(GDbClient *client)
}
+ exit_packed_buffer(&in_pbuf);
+
continue;
gdcu_bad_exchange:
printf("Bad reception...\n");
+ exit_packed_buffer(&in_pbuf);
+
/* TODO : close conn */
;
@@ -689,15 +715,24 @@ bool g_db_client_save(GDbClient *client)
bool g_db_client_set_last_active(GDbClient *client, timestamp_t timestamp)
{
bool result; /* Bilan partiel à remonter */
+ packed_buffer out_pbuf; /* Tampon d'émission */
+
+ init_packed_buffer(&out_pbuf);
g_db_client_get_fd(client);
- result = safe_send(client->fd, (uint32_t []) { htobe32(DBC_SET_LAST_ACTIVE) }, sizeof(uint32_t), 0);
+ result = extend_packed_buffer(&out_pbuf, (uint32_t []) { DBC_SET_LAST_ACTIVE }, sizeof(uint32_t), true);
- result &= send_timestamp(&timestamp, client->fd, MSG_MORE);
+ if (result)
+ result = pack_timestamp(&timestamp, &out_pbuf);
g_db_client_put_fd(client);
+ if (result)
+ result = send_packed_buffer(&out_pbuf, client->fd);
+
+ exit_packed_buffer(&out_pbuf);
+
return result;
}