mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 15:45:25 +00:00
fix blocking fd problem; fix unlock problem; other minor fixes
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: socket.c,v 1.17 1998/12/05 00:28:12 explorer Exp $ */
|
/* $Id: socket.c,v 1.18 1998/12/05 01:44:38 halley Exp $ */
|
||||||
|
|
||||||
#include "attribute.h"
|
#include "attribute.h"
|
||||||
|
|
||||||
@@ -31,8 +31,15 @@
|
|||||||
* if they fail.
|
* if they fail.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LOCK(lp) do { XTRACE(TRACE_LOCK, ("%d locked socket %p\n", __LINE__, lp)); INSIST(isc_mutex_lock((lp)) == ISC_R_SUCCESS); } while (0)
|
#define LOCK(lp) do { \
|
||||||
#define UNLOCK(lp) do { XTRACE(TRACE_LOCK, ("%d unlocked socket %p\n", __LINE__, lp)); INSIST(isc_mutex_unlock((lp)) == ISC_R_SUCCESS); } while (0)
|
INSIST(isc_mutex_lock((lp)) == ISC_R_SUCCESS); \
|
||||||
|
XTRACE(TRACE_LOCK, ("%d locked socket %p\n", __LINE__, lp)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UNLOCK(lp) do { \
|
||||||
|
INSIST(isc_mutex_unlock((lp)) == ISC_R_SUCCESS); \
|
||||||
|
XTRACE(TRACE_LOCK, ("%d unlocked socket %p\n", __LINE__, lp)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define SOFT_ERROR(e) ((e) == EAGAIN || (e) == EWOULDBLOCK || (e) == EINTR)
|
#define SOFT_ERROR(e) ((e) == EAGAIN || (e) == EWOULDBLOCK || (e) == EINTR)
|
||||||
|
|
||||||
@@ -48,7 +55,7 @@
|
|||||||
#define TRACE_LOCK 0x0040
|
#define TRACE_LOCK 0x0040
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
int trace_level = TRACE_CONNECT | TRACE_MANAGER | TRACE_WATCHER | TRACE_LOCK;
|
int trace_level = 0xffffffff;
|
||||||
#define XTRACE(l, a) if (l & trace_level) printf a
|
#define XTRACE(l, a) if (l & trace_level) printf a
|
||||||
#define XENTER(l, a) if (l & trace_level) printf("ENTER %s\n", (a))
|
#define XENTER(l, a) if (l & trace_level) printf("ENTER %s\n", (a))
|
||||||
#define XEXIT(l, a) if (l & trace_level) printf("EXIT %s\n", (a))
|
#define XEXIT(l, a) if (l & trace_level) printf("EXIT %s\n", (a))
|
||||||
@@ -453,6 +460,8 @@ isc_socket_create(isc_socketmgr_t manager, isc_sockettype_t type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (make_nonblock(sock->fd) != ISC_R_SUCCESS) {
|
if (make_nonblock(sock->fd) != ISC_R_SUCCESS) {
|
||||||
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
|
"make_nonblock(%d) failed.", sock->fd);
|
||||||
free_socket(&sock);
|
free_socket(&sock);
|
||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
@@ -726,6 +735,9 @@ internal_accept(isc_task_t task, isc_event_t ev)
|
|||||||
* for the best, but log it. XXX This will have to be
|
* for the best, but log it. XXX This will have to be
|
||||||
* changed, thanks to broken OSs trying to overload what
|
* changed, thanks to broken OSs trying to overload what
|
||||||
* accept does.
|
* accept does.
|
||||||
|
*
|
||||||
|
* XXX we should log something. Consider if we really
|
||||||
|
* want to press on here. Need to catch fatal errors.
|
||||||
*/
|
*/
|
||||||
XTRACE(TRACE_LISTEN, ("internal_accept: accept returned %s\n",
|
XTRACE(TRACE_LISTEN, ("internal_accept: accept returned %s\n",
|
||||||
strerror(errno)));
|
strerror(errno)));
|
||||||
@@ -733,6 +745,13 @@ internal_accept(isc_task_t task, isc_event_t ev)
|
|||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
if (make_nonblock(fd) != ISC_R_SUCCESS) {
|
||||||
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
|
"make_nonblock(%d) failed.", fd);
|
||||||
|
close(fd);
|
||||||
|
UNLOCK(&sock->lock);
|
||||||
|
return (ISC_R_UNEXPECTED);
|
||||||
|
}
|
||||||
|
|
||||||
DEQUEUE(sock->accept_list, iev, link);
|
DEQUEUE(sock->accept_list, iev, link);
|
||||||
|
|
||||||
@@ -1470,6 +1489,7 @@ isc_socket_recv(isc_socket_t sock, isc_region_t region,
|
|||||||
if (iev == NULL) {
|
if (iev == NULL) {
|
||||||
/* no special free routine yet */
|
/* no special free routine yet */
|
||||||
isc_event_free((isc_event_t *)&ev);
|
isc_event_free((isc_event_t *)&ev);
|
||||||
|
UNLOCK(&sock->lock);
|
||||||
return (ISC_R_NOMEMORY);
|
return (ISC_R_NOMEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1521,7 +1541,7 @@ isc_socket_recv(isc_socket_t sock, isc_region_t region,
|
|||||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||||
"isc_socket_recv: %s",
|
"isc_socket_recv: %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
INSIST(cc >= 0);
|
INSIST(cc >= 0); /* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc == 0) {
|
if (cc == 0) {
|
||||||
@@ -1750,8 +1770,16 @@ isc_result_t
|
|||||||
isc_socket_bind(isc_socket_t sock, struct isc_sockaddr *sockaddr,
|
isc_socket_bind(isc_socket_t sock, struct isc_sockaddr *sockaddr,
|
||||||
int addrlen)
|
int addrlen)
|
||||||
{
|
{
|
||||||
|
int on = 1;
|
||||||
|
|
||||||
LOCK(&sock->lock);
|
LOCK(&sock->lock);
|
||||||
|
|
||||||
|
if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR,
|
||||||
|
&on, sizeof on) < 0) {
|
||||||
|
UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d) failed",
|
||||||
|
sock->fd);
|
||||||
|
/* Press on... */
|
||||||
|
}
|
||||||
if (bind(sock->fd, (struct sockaddr *)sockaddr, addrlen) < 0) {
|
if (bind(sock->fd, (struct sockaddr *)sockaddr, addrlen) < 0) {
|
||||||
UNLOCK(&sock->lock);
|
UNLOCK(&sock->lock);
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
|
Reference in New Issue
Block a user