2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00
This commit is contained in:
Michael Graff
1998-12-01 21:39:00 +00:00
parent 9de9ae0839
commit e75eee3206

View File

@@ -1,4 +1,4 @@
/* $Id: socket.c,v 1.12 1998/12/01 17:58:34 explorer Exp $ */ /* $Id: socket.c,v 1.13 1998/12/01 21:39:00 explorer Exp $ */
#include "attribute.h" #include "attribute.h"
@@ -46,15 +46,15 @@
#define TRACE_SEND 0x0010 #define TRACE_SEND 0x0010
#define TRACE_MANAGER 0x0020 #define TRACE_MANAGER 0x0020
#if 1 #if 0
int trace_level = TRACE_CONNECT | TRACE_MANAGER; int trace_level = TRACE_CONNECT | TRACE_MANAGER;
#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))
#else #else
#define XTRACE(a) #define XTRACE(l, a)
#define XENTER(a) #define XENTER(l, a)
#define XEXIT(a) #define XEXIT(l, a)
#endif #endif
/* /*
@@ -211,10 +211,10 @@ make_nonblock(int fd)
UNEXPECTED_ERROR(__FILE__, __LINE__, UNEXPECTED_ERROR(__FILE__, __LINE__,
"fcntl(%d, F_SETFL, %d): %s", "fcntl(%d, F_SETFL, %d): %s",
fd, flags, strerror(errno)); fd, flags, strerror(errno));
return ISC_R_UNEXPECTED; return (ISC_R_UNEXPECTED);
} }
return ISC_R_SUCCESS; return (ISC_R_SUCCESS);
} }
/* /*
@@ -406,8 +406,6 @@ 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) {
free_socket(&sock); free_socket(&sock);
UNEXPECTED_ERROR(__FILE__, __LINE__,
"make_nonblock(%d)", sock->fd);
return (ISC_R_UNEXPECTED); return (ISC_R_UNEXPECTED);
} }
@@ -683,6 +681,8 @@ internal_accept(isc_task_t task, isc_event_t ev)
return (0); return (0);
} }
UNLOCK(&sock->lock);
/* /*
* The accept succeeded. Pull off the done event and set the * The accept succeeded. Pull off the done event and set the
* fd and other information in the socket descriptor here. These * fd and other information in the socket descriptor here. These
@@ -693,16 +693,14 @@ internal_accept(isc_task_t task, isc_event_t ev)
dev->newsocket->fd = fd; dev->newsocket->fd = fd;
XTRACE(TRACE_LISTEN, ("internal_accept: newsock %p, fd %d\n", /*
dev->newsocket, fd)); * Save away the remote address
*/
sock->addrlength = addrlen; dev->newsocket->addrlength = addrlen;
memcpy(&sock->address, &addr, addrlen); memcpy(&dev->newsocket->address, &addr, addrlen);
dev->addrlength = addrlen; dev->addrlength = addrlen;
memcpy(&dev->address, &addr, addrlen); memcpy(&dev->address, &addr, addrlen);
UNLOCK(&sock->lock);
/* /*
* It's safe to do this, since the done event's free routine will * It's safe to do this, since the done event's free routine will
* detach from the socket, so sock can't disappear out from under * detach from the socket, so sock can't disappear out from under
@@ -714,6 +712,9 @@ internal_accept(isc_task_t task, isc_event_t ev)
sock->manager->maxfd = fd; sock->manager->maxfd = fd;
UNLOCK(&sock->manager->lock); UNLOCK(&sock->manager->lock);
XTRACE(TRACE_LISTEN, ("internal_accept: newsock %p, fd %d\n",
dev->newsocket, fd));
send_ncdone_event(sock, &iev, &dev, ISC_R_SUCCESS); send_ncdone_event(sock, &iev, &dev, ISC_R_SUCCESS);
return (0); return (0);
@@ -783,13 +784,7 @@ internal_read(isc_task_t task, isc_event_t ev)
* we can. * we can.
*/ */
read_count = dev->region.length - dev->n; read_count = dev->region.length - dev->n;
if (sock->type == isc_socket_tcp) { if (sock->type == isc_socket_udp) {
cc = recv(sock->fd, dev->region.base + dev->n,
read_count, 0);
memcpy(&dev->address, &sock->address,
sock->addrlength);
dev->addrlength = sock->addrlength;
} else {
addrlen = sizeof(addr); addrlen = sizeof(addr);
cc = recvfrom(sock->fd, dev->region.base + dev->n, cc = recvfrom(sock->fd, dev->region.base + dev->n,
read_count, 0, read_count, 0,
@@ -797,6 +792,12 @@ internal_read(isc_task_t task, isc_event_t ev)
&addrlen); &addrlen);
memcpy(&dev->address, &addr, addrlen); memcpy(&dev->address, &addr, addrlen);
dev->addrlength = addrlen; dev->addrlength = addrlen;
} else {
cc = recv(sock->fd, dev->region.base + dev->n,
read_count, 0);
memcpy(&dev->address, &sock->address,
sock->addrlength);
dev->addrlength = sock->addrlength;
} }
XTRACE(TRACE_RECV, XTRACE(TRACE_RECV,
@@ -1364,6 +1365,7 @@ isc_socket_recv(isc_socket_t sock, isc_region_t region,
*/ */
if (EMPTY(sock->read_list)) { if (EMPTY(sock->read_list)) {
if (sock->type == isc_socket_udp) { if (sock->type == isc_socket_udp) {
ev->addrlength = sizeof(isc_sockaddr_t);
cc = recvfrom(sock->fd, ev->region.base, cc = recvfrom(sock->fd, ev->region.base,
ev->region.length, 0, ev->region.length, 0,
(struct sockaddr *)&ev->address, (struct sockaddr *)&ev->address,