diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/io.c | 102 | ||||
-rw-r--r-- | src/common/io.h | 11 |
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 |