summaryrefslogtreecommitdiff
path: root/src/PortEventPoll.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-11-09 14:43:47 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-11-09 14:43:47 +0000
commit228b4c50d757b80efe493728a658ae145eaf67ef (patch)
treeaefd6e605ca52f6e4125f6e25d405e56a1ef681a /src/PortEventPoll.cc
parent02f725cab581063a0570402032f0b328e6f3a8a3 (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.cc19
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 {