summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/db/cdb.c4
-rw-r--r--src/common/io.c55
-rw-r--r--src/common/io.h3
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);