diff options
Diffstat (limited to 'lib/Handle.cc')
-rw-r--r-- | lib/Handle.cc | 30 |
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; } |