bound_address_.clear();
}
+void
+IfaceMgr::handleExternalSocketError(SocketCallbackInfo& s) {
+ if (fd_event_handler_->hasError(s.socket_)) {
+ errno = 0;
+ if (fcntl(s.socket_, F_GETFD) < 0 && (errno == EBADF)) {
+ s.unusable_ = true;
+ isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.socket_);
+ }
+ isc_throw(SocketFDError, "unexpected socket fd: " << s.socket_ << " error: "
+ << strerror(errno));
+ }
+}
+
+void
+IfaceMgr::handleIfaceSocketError(util::FDEventHandlerPtr fd_event_handler, const SocketInfo& s) {
+ if (fd_event_handler->hasError(s.sockfd_)) {
+ errno = 0;
+ if (fcntl(s.sockfd_, F_GETFD) < 0 && (errno == EBADF)) {
+ isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.sockfd_);
+ }
+ isc_throw(SocketFDError, "unexpected socket fd: " << s.sockfd_ << " error: "
+ << strerror(errno));
+ } else {
+ int flag = 0;
+ socklen_t opt_size = sizeof(flag);
+ if (getsockopt(s.sockfd_, SOL_SOCKET, SO_ERROR,
+ (char *)&flag, &opt_size) < 0) {
+ isc_throw(BadValue, "Can't get socket fd: " << s.sockfd_ << " flags - error: "
+ << strerror(errno));
+ }
+ if (flag > 0) {
+ isc_throw(SocketFDError, "socket fd: " << s.sockfd_ << " error flags: " << flag);
+ }
+ }
+}
+
void
IfaceMgr::collectBoundAddresses() {
for (const IfacePtr& iface : ifaces_) {
ex_sock = s;
break;
}
- } else if (fd_event_handler_->hasError(s.socket_)) {
- errno = 0;
- if (fcntl(s.socket_, F_GETFD) < 0 && (errno == EBADF)) {
- s.unusable_ = true;
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.socket_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.socket_ << " error: "
- << strerror(errno));
+ } else {
+ handleExternalSocketError(s);
}
}
}
ex_sock = s;
break;
}
- } else if (fd_event_handler_->hasError(s.socket_)) {
- errno = 0;
- if (fcntl(s.socket_, F_GETFD) < 0 && (errno == EBADF)) {
- s.unusable_ = true;
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.socket_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.socket_ << " error: "
- << strerror(errno));
+ } else {
+ handleExternalSocketError(s);
}
}
}
if (fd_event_handler_->readReady(s.sockfd_)) {
candidate.reset(new SocketInfo(s));
break;
- } else if (fd_event_handler_->hasError(s.sockfd_)) {
- errno = 0;
- if (fcntl(s.sockfd_, F_GETFD) < 0 && (errno == EBADF)) {
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.sockfd_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.sockfd_ << " error: "
- << strerror(errno));
} else {
- int flag = 0;
- socklen_t opt_size = sizeof(flag);
- if (getsockopt(s.sockfd_, SOL_SOCKET, SO_ERROR,
- (char *)&flag, &opt_size) < 0) {
- isc_throw(BadValue, "Can't get socket fd: " << s.sockfd_ << " flags - error: "
- << strerror(errno));
- }
- if (flag > 0) {
- isc_throw(SocketFDError, "socket fd: " << s.sockfd_ << " error flags: " << flag);
- }
+ handleIfaceSocketError(fd_event_handler_, s);
}
}
if (candidate) {
ex_sock = s;
break;
}
- } else if (fd_event_handler_->hasError(s.socket_)) {
- errno = 0;
- if (fcntl(s.socket_, F_GETFD) < 0 && (errno == EBADF)) {
- s.unusable_ = true;
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.socket_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.socket_ << " error: "
- << strerror(errno));
+ } else {
+ handleExternalSocketError(s);
}
}
}
if (fd_event_handler_->readReady(s.sockfd_)) {
candidate.reset(new SocketInfo(s));
break;
- } else if (fd_event_handler_->hasError(s.sockfd_)) {
- errno = 0;
- if (fcntl(s.sockfd_, F_GETFD) < 0 && (errno == EBADF)) {
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.sockfd_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.sockfd_ << " error: "
- << strerror(errno));
} else {
- int flag = 0;
- socklen_t opt_size = sizeof(flag);
- if (getsockopt(s.sockfd_, SOL_SOCKET, SO_ERROR,
- (char *)&flag, &opt_size) < 0) {
- isc_throw(BadValue, "Can't get socket fd: " << s.sockfd_ << " flags - error: "
- << strerror(errno));
- }
- if (flag > 0) {
- isc_throw(SocketFDError, "socket fd: " << s.sockfd_ << " error flags: " << flag);
- }
+ handleIfaceSocketError(fd_event_handler_, s);
}
}
if (candidate) {
ex_sock = s;
break;
}
- } else if (fd_event_handler_->hasError(s.socket_)) {
- errno = 0;
- if (fcntl(s.socket_, F_GETFD) < 0 && (errno == EBADF)) {
- s.unusable_ = true;
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.socket_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.socket_ << " error: "
- << strerror(errno));
+ } else {
+ handleExternalSocketError(s);
}
}
}
if (dhcp_receiver_->shouldTerminate()) {
return;
}
- } else if (receiver_fd_event_handler_->hasError(s.sockfd_)) {
- errno = 0;
- if (fcntl(s.sockfd_, F_GETFD) < 0 && (errno == EBADF)) {
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.sockfd_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.sockfd_ << " error: "
- << strerror(errno));
} else {
- int flag = 0;
- socklen_t opt_size = sizeof(flag);
- if (getsockopt(s.sockfd_, SOL_SOCKET, SO_ERROR,
- (char *)&flag, &opt_size) < 0) {
- isc_throw(BadValue, "Can't get socket fd: " << s.sockfd_ << " flags - error: "
- << strerror(errno));
- }
- if (flag > 0) {
- isc_throw(SocketFDError, "socket fd: " << s.sockfd_ << " error flags: " << flag);
- }
+ handleIfaceSocketError(receiver_fd_event_handler_, s);
}
}
}
if (dhcp_receiver_->shouldTerminate()) {
return;
}
- } else if (receiver_fd_event_handler_->hasError(s.sockfd_)) {
- errno = 0;
- if (fcntl(s.sockfd_, F_GETFD) < 0 && (errno == EBADF)) {
- isc_throw(SocketFDError, "unexpected state (closed) for fd: " << s.sockfd_);
- }
- isc_throw(SocketFDError, "unexpected socket fd: " << s.sockfd_ << " error: "
- << strerror(errno));
} else {
- int flag = 0;
- socklen_t opt_size = sizeof(flag);
- if (getsockopt(s.sockfd_, SOL_SOCKET, SO_ERROR,
- (char *)&flag, &opt_size) < 0) {
- isc_throw(BadValue, "Can't get socket fd: " << s.sockfd_ << " flags - error: "
- << strerror(errno));
- }
- if (flag > 0) {
- isc_throw(SocketFDError, "socket fd: " << s.sockfd_ << " error flags: " << flag);
- }
+ handleIfaceSocketError(receiver_fd_event_handler_, s);
}
}
}