diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/db/cdb.c | 4 | ||||
-rw-r--r-- | src/common/io.c | 55 | ||||
-rw-r--r-- | src/common/io.h | 3 |
3 files changed, 60 insertions, 2 deletions
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index 78f2aa8..3199308 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -539,9 +539,9 @@ DBError g_cdb_archive_write(const GCdbArchive *archive) goto afta_error; } - for (len = safe_read(fd, buffer, ARCHIVE_RBUF_SIZE); + for (len = safe_read_partial(fd, buffer, ARCHIVE_RBUF_SIZE); len > 0; - len = safe_read(fd, buffer, ARCHIVE_RBUF_SIZE)) + len = safe_read_partial(fd, buffer, ARCHIVE_RBUF_SIZE)) { if (archive_write_data(out, buffer, len) != len) goto afta_error; 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); |