summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/io.c102
-rw-r--r--src/common/io.h11
2 files changed, 110 insertions, 3 deletions
diff --git a/src/common/io.c b/src/common/io.c
index 2275cb4..23fad54 100644
--- a/src/common/io.c
+++ b/src/common/io.c
@@ -24,16 +24,118 @@
#include "io.h"
+#include <errno.h>
#include <libgen.h>
#include <malloc.h>
+#include <stdint.h>
#include <string.h>
#include <unistd.h>
+#include <sys/socket.h>
#include <sys/stat.h>
/******************************************************************************
* *
+* Paramètres : sockfd = flux ouvert en lecture. *
+* buf = données à recevoir. *
+* len = quantité de ces données. *
+* flags = options de réception. *
+* *
+* Description : Réceptionne des données depuis un flux réseau. *
+* *
+* Retour : true si toutes les données ont été reçues, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool safe_recv(int sockfd, const void *buf, size_t len, int flags)
+{
+ uint8_t *iter; /* Données en attente */
+ size_t remaining; /* Quantité restante */
+ ssize_t got; /* Données envoyées */
+
+ iter = (uint8_t *)buf;
+ remaining = len;
+
+ while (remaining > 0)
+ {
+ got = recv(sockfd, iter, remaining, MSG_NOSIGNAL | flags);
+ if (got == -1)
+ {
+ if (errno == EINTR) continue;
+ else
+ {
+ perror("recv");
+ break;
+ }
+ }
+
+ iter += got;
+ remaining -= got;
+
+ }
+
+ return (remaining == 0);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : sockfd = flux ouvert en écriture. *
+* buf = données à émettre. *
+* len = quantité de ces données. *
+* flags = options d'envoi. *
+* *
+* Description : Envoie des données au travers un flux réseau. *
+* *
+* Retour : true si toutes les données ont été émises, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool safe_send(int sockfd, const void *buf, size_t len, int flags)
+{
+ uint8_t *iter; /* Données en attente */
+ size_t remaining; /* Quantité restante */
+ ssize_t sent; /* Données envoyées */
+
+ iter = (uint8_t *)buf;
+ remaining = len;
+
+ while (remaining > 0)
+ {
+ sent = send(sockfd, iter, remaining, MSG_NOSIGNAL | flags);
+ if (sent == -1)
+ {
+ if (errno == EINTR) continue;
+ else
+ {
+ perror("send");
+ break;
+ }
+ }
+
+ iter += sent;
+ remaining -= sent;
+
+ }
+
+ return (remaining == 0);
+
+}
+
+
+
+
+
+
+
+/******************************************************************************
+* *
* Paramètres : path = chemin d'accès à valider. *
* *
* Description : S'assure qu'un chemin donné existe dans le système. *
diff --git a/src/common/io.h b/src/common/io.h
index 491d8d0..8dd38c8 100644
--- a/src/common/io.h
+++ b/src/common/io.h
@@ -25,14 +25,19 @@
#define _COMMON_IO_H
-
+#include <stdbool.h>
#include <sys/types.h>
#include <sys/socket.h>
-#define safe_recv recv
-#define safe_send send
+/* Réceptionne des données depuis un flux réseau. */
+bool safe_recv(int, const void *, size_t, int);
+
+/* Envoie des données au travers un flux réseau. */
+bool safe_send(int, const void *, size_t, int);
+
+
#define safe_read read