summaryrefslogtreecommitdiff
path: root/lib/Handle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Handle.cc')
-rw-r--r--lib/Handle.cc30
1 files changed, 23 insertions, 7 deletions
diff --git a/lib/Handle.cc b/lib/Handle.cc
index 8108285..4824b43 100644
--- a/lib/Handle.cc
+++ b/lib/Handle.cc
@@ -2,14 +2,15 @@
#include <unistd.h>
#include <string.h>
#include <errno.h>
+#include <fcntl.h>
#include "Handle.h"
#include "config.h"
-Handle::Handle(const Handle & nh) : h(dup(nh.h)), closed(false) { }
+Handle::Handle(const Handle & nh) : h(dup(nh.h)), closed(false), nonblock(false) { }
Handle::~Handle() {
if (h != -1) {
- ::close(h);
+ close(h);
}
}
@@ -25,6 +26,7 @@ ssize_t Handle::write(const void *buf, size_t count) throw (IOException) {
do {
done = true;
+ errno = 0;
if ((r = ::write(h, buf, count)) < 0) {
if ((!errno) || (errno = EAGAIN)) {
// Avant de déclarer une erreur, on vérifie si ce n'est pas un
@@ -35,10 +37,13 @@ ssize_t Handle::write(const void *buf, size_t count) throw (IOException) {
if (full) {
throw IOException(GetName(), IO_WRITE, count);
} else {
- sleep(1);
done = false;
full = true;
- tr += r;
+ if (nonblock) {
+ return 0;
+ } else {
+ sleep(1);
+ }
}
} else {
throw IOException(GetName(), IO_WRITE, count);
@@ -56,6 +61,7 @@ ssize_t Handle::write(const void *buf, size_t count) throw (IOException) {
ssize_t Handle::read(void *buf, size_t count) throw (IOException) {
ssize_t r;
+ errno = 0;
if ((r = ::read(h, buf, count)) < 0) {
if ((!errno) || (errno = EAGAIN)) {
// Avant de déclarer une erreur, on vérifie si ce n'est pas un
@@ -67,6 +73,7 @@ ssize_t Handle::read(void *buf, size_t count) throw (IOException) {
}
if (!r) {
+ close(h);
closed = true;
}
@@ -77,6 +84,15 @@ bool Handle::IsClosed(void) {
return closed;
}
+bool Handle::IsNonBlock(void) {
+ return nonblock;
+}
+
+void Handle::SetNonBlock(void) {
+ nonblock = true;
+ fcntl(h, F_SETFL, O_NONBLOCK);
+}
+
Handle & operator<<(Handle & h, const String & s) {
char * p;
@@ -91,9 +107,9 @@ Handle & operator>>(Handle & h, String & s) {
int i = 0, r;
while ((r = h.read(&(t[i]), 1)) && (i != (BUFSIZ - 1))) {
- // Il y a souvent des \r\n dans les sockets par exemple.
- // On ignore le \r pour ne garder que le \n, standard sous
- // Unix.
+ // Il y a souvent des \r\n dans les sockets par exemple,
+ // ou bien en lisant des fichiers au format MS-DOS. On
+ // ignore le \r pour ne garder que le \n, standard sous Unix.
if (t[i] == '\r') {
continue;
}