diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/io.c | 55 | ||||
-rw-r--r-- | src/common/io.h | 3 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/common/io.c b/src/common/io.c index 68659fb..f7d3e4c 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -87,6 +87,61 @@ bool safe_read(int fd, const void *buf, size_t count) /****************************************************************************** * * +* Paramètres : fd = flux ouvert en lecture. * +* buf = données à recevoir. * +* max = quantité maximale de ces données. * +* * +* Description : Lit des données depuis un flux local. * +* * +* Retour : Nombre d'octets lus, au pire 0 en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +ssize_t safe_read_partial(int fd, const void *buf, size_t max) +{ + ssize_t result; /* Quantité lue à remonter */ + uint8_t *iter; /* Données en attente */ + size_t remaining; /* Quantité restante */ + ssize_t got; /* Données envoyées */ + + result = 0; + + iter = (uint8_t *)buf; + remaining = max; + + while (remaining > 0) + { + got = read(fd, iter, remaining); + + if (got == -1) + { + if (errno == EINTR) continue; + else + { + perror("read"); + break; + } + } + + if (got == 0) + break; + + result += got; + + iter += got; + remaining -= got; + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : fd = flux ouvert en écriture. * * buf = données à émettre. * * count = quantité de ces données. * diff --git a/src/common/io.h b/src/common/io.h index e0316f7..35acd10 100644 --- a/src/common/io.h +++ b/src/common/io.h @@ -34,6 +34,9 @@ /* Lit des données depuis un flux local. */ bool safe_read(int, const void *, size_t); +/* Lit des données depuis un flux local. */ +ssize_t safe_read_partial(int, const void *, size_t); + /* Ecrit des données dans un flux local. */ bool safe_write(int, const void *, size_t); |