diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-11-09 14:43:47 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-11-09 14:43:47 +0000 |
| commit | 228b4c50d757b80efe493728a658ae145eaf67ef (patch) | |
| tree | aefd6e605ca52f6e4125f6e25d405e56a1ef681a /src/PortEventPoll.cc | |
| parent | 02f725cab581063a0570402032f0b328e6f3a8a3 (diff) | |
2010-11-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Capture errno right after system/library call to avoid it to get
overwritten. Use util::safeStrerror instead of strerror directly
because strerror might return NULL. We don't check errno for
std::fstream anymore.
* src/AbstractDiskWriter.cc
* src/CookieStorage.cc
* src/DHTAutoSaveCommand.cc
* src/DHTRoutingTableDeserializer.cc
* src/DHTRoutingTableSerializer.cc
* src/DefaultBtProgressInfoFile.cc
* src/EpollEventPoll.cc
* src/IteratableChunkChecksumValidator.cc
* src/KqueueEventPoll.cc
* src/Logger.cc
* src/MessageDigestHelper.cc
* src/PortEventPoll.cc
* src/SelectEventPoll.cc
* src/SocketCore.cc
* src/message.h
* src/util.cc
* src/util.h
Diffstat (limited to 'src/PortEventPoll.cc')
| -rw-r--r-- | src/PortEventPoll.cc | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/PortEventPoll.cc b/src/PortEventPoll.cc index 91335b15..cb3757cd 100644 --- a/src/PortEventPoll.cc +++ b/src/PortEventPoll.cc @@ -34,6 +34,7 @@ /* copyright --> */ #include "PortEventPoll.h" +#include <cerrno> #include <cstring> #include <algorithm> #include <numeric> @@ -41,6 +42,7 @@ #include "Command.h" #include "LogFactory.h" #include "Logger.h" +#include "util.h" namespace aria2 { @@ -85,9 +87,10 @@ PortEventPoll::~PortEventPoll() if(port_ != -1) { int r; while((r = close(port_)) == -1 && errno == EINTR); + int errNum = errno; if(r == -1) { logger_->error("Error occurred while closing port %d: %s", - port_, strerror(errno)); + port_, util::safeStrerror(errNum).c_str()); } } delete [] portEvents_; @@ -120,9 +123,10 @@ void PortEventPoll::poll(const struct timeval& tv) p->processEvents(pev.portev_events); int r = port_associate(port_, PORT_SOURCE_FD, pev.portev_object, p->getEvents().events, p); + int errNum = errno; if(r == -1) { logger_->error("port_associate failed for file descriptor %d: cause %s", - pev.portev_object, strerror(errno)); + pev.portev_object, util::safeStrerror(errNum).c_str()); } } } @@ -171,11 +175,13 @@ bool PortEventPoll::addEvents(sock_t socket, std::deque<SharedHandle<KSocketEntry> >::iterator i = std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry); int r = 0; + int errNum = 0; if(i != socketEntries_.end() && (*i) == socketEntry) { event.addSelf(*i); A2PortEvent pv = (*i)->getEvents(); r = port_associate(port_, PORT_SOURCE_FD, (*i)->getSocket(), pv.events, pv.socketEntry); + errNum = r; } else { socketEntries_.insert(i, socketEntry); if(socketEntries_.size() > portEventsSize_) { @@ -187,11 +193,12 @@ bool PortEventPoll::addEvents(sock_t socket, A2PortEvent pv = socketEntry->getEvents(); r = port_associate(port_, PORT_SOURCE_FD, socketEntry->getSocket(), pv.events, pv.socketEntry); + errNum = r; } if(r == -1) { if(logger_->debug()) { logger_->debug("Failed to add socket event %d:%s", - socket, strerror(errno)); + socket, util::safeStrerror(errNum).c_str()); } return false; } else { @@ -223,17 +230,21 @@ bool PortEventPoll::deleteEvents(sock_t socket, if(i != socketEntries_.end() && (*i) == socketEntry) { event.removeSelf(*i); int r = 0; + int errNum = 0; if((*i)->eventEmpty()) { r = port_dissociate(port_, PORT_SOURCE_FD, (*i)->getSocket()); + errNum = errno; socketEntries_.erase(i); } else { A2PortEvent pv = (*i)->getEvents(); r = port_associate(port_, PORT_SOURCE_FD, (*i)->getSocket(), pv.events, pv.socketEntry); + errNum = errno; } if(r == -1) { if(logger_->debug()) { - logger_->debug("Failed to delete socket event:%s", strerror(errno)); + logger_->debug("Failed to delete socket event:%s", + util::safeStrerror(errNum).c_str()); } return false; } else { |
