diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-08-18 21:55:24 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-08-18 21:55:24 (GMT) |
commit | a0a7b6c1e05c78ae433f353d15e3366107b67d03 (patch) | |
tree | bca0b187778cf016c6131bfc982b08c67a38442b /src/common | |
parent | 161c0f8ab227af5033b1b6456607b9b9c3bc60df (diff) |
Inserted storages and collections into loaded binaries (first steps).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@389 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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 |