summaryrefslogtreecommitdiff
path: root/src/common/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/io.c')
-rw-r--r--src/common/io.c100
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. *