diff options
Diffstat (limited to 'src/common/io.c')
-rw-r--r-- | src/common/io.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/common/io.c b/src/common/io.c index 7bc4cc1..68659fb 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -37,6 +37,106 @@ /****************************************************************************** * * +* Paramètres : fd = flux ouvert en lecture. * +* buf = données à recevoir. * +* count = quantité de ces données. * +* * +* Description : Lit des données depuis un flux local. * +* * +* Retour : true si toutes les données ont été lues, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool safe_read(int fd, const void *buf, size_t count) +{ + uint8_t *iter; /* Données en attente */ + size_t remaining; /* Quantité restante */ + ssize_t got; /* Données envoyées */ + + iter = (uint8_t *)buf; + remaining = count; + + while (remaining > 0) + { + got = read(fd, iter, remaining); + + if (got == -1) + { + if (errno == EINTR) continue; + else + { + perror("read"); + break; + } + } + + if (got == 0) + break; + + iter += got; + remaining -= got; + + } + + return (remaining == 0); + +} + + +/****************************************************************************** +* * +* Paramètres : fd = flux ouvert en écriture. * +* buf = données à émettre. * +* count = quantité de ces données. * +* * +* Description : Ecrit des données dans un flux local. * +* * +* Retour : true si toutes les données ont été écrites, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool safe_write(int fd, const void *buf, size_t count) +{ + uint8_t *iter; /* Données en attente */ + size_t remaining; /* Quantité restante */ + ssize_t sent; /* Données envoyées */ + + iter = (uint8_t *)buf; + remaining = count; + + while (remaining > 0) + { + sent = write(fd, iter, remaining); + + if (sent == -1) + { + if (errno == EINTR) continue; + else + { + perror("write"); + break; + } + } + + if (sent == 0) + break; + + iter += sent; + remaining -= sent; + + } + + return (remaining == 0); + +} + + +/****************************************************************************** +* * * Paramètres : sockfd = flux ouvert en lecture. * * buf = données à recevoir. * * len = quantité de ces données. * |