2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-02 15:45:25 +00:00

isc_sockaddr_t now has a length; dev->result was not set in internal_connect()

This commit is contained in:
Bob Halley
1999-07-07 02:05:08 +00:00
parent c8e5c5f5b4
commit a86239c7cd

View File

@@ -157,7 +157,6 @@ struct isc_socket {
rwintev_t *wiev; /* allocated send intev */ rwintev_t *wiev; /* allocated send intev */
cnintev_t *ciev; /* allocated accept intev */ cnintev_t *ciev; /* allocated accept intev */
isc_sockaddr_t address; /* remote address */ isc_sockaddr_t address; /* remote address */
int addrlength; /* remote addrlen */
}; };
#define SOCKET_MANAGER_MAGIC 0x494f6d67U /* IOmg */ #define SOCKET_MANAGER_MAGIC 0x494f6d67U /* IOmg */
@@ -395,8 +394,6 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
ISC_LIST_INIT(sock->accept_list); ISC_LIST_INIT(sock->accept_list);
sock->addrlength = 0;
sock->recv_result = ISC_R_SUCCESS; sock->recv_result = ISC_R_SUCCESS;
sock->send_result = ISC_R_SUCCESS; sock->send_result = ISC_R_SUCCESS;
@@ -778,7 +775,6 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
isc_socket_newconnev_t *dev; isc_socket_newconnev_t *dev;
intev_t *iev = (intev_t *)ev; intev_t *iev = (intev_t *)ev;
struct sockaddr addr;
ISC_SOCKADDR_LEN_T addrlen; ISC_SOCKADDR_LEN_T addrlen;
int fd; int fd;
isc_result_t result = ISC_R_SUCCESS; isc_result_t result = ISC_R_SUCCESS;
@@ -828,8 +824,9 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
* EAGAIN or EINTR, simply poke the watcher to watch this socket * EAGAIN or EINTR, simply poke the watcher to watch this socket
* again. * again.
*/ */
addrlen = sizeof(addr); addrlen = sizeof dev->newsocket->address.type;
fd = accept(sock->fd, &addr, &addrlen); fd = accept(sock->fd, &dev->newsocket->address.type.sa, &addrlen);
dev->newsocket->address.length = addrlen;
if (fd < 0) { if (fd < 0) {
if (SOFT_ERROR(errno)) { if (SOFT_ERROR(errno)) {
select_poke(sock->manager, sock->fd); select_poke(sock->manager, sock->fd);
@@ -886,10 +883,7 @@ internal_accept(isc_task_t *task, isc_event_t *ev)
/* /*
* Save away the remote address * Save away the remote address
*/ */
dev->newsocket->addrlength = addrlen; dev->address = dev->newsocket->address;
memcpy(&dev->newsocket->address, &addr, addrlen);
dev->addrlength = addrlen;
memcpy(&dev->address, &addr, addrlen);
LOCK(&manager->lock); LOCK(&manager->lock);
manager->fds[fd] = dev->newsocket; manager->fds[fd] = dev->newsocket;
@@ -923,7 +917,6 @@ internal_recv(isc_task_t *task, isc_event_t *ev)
isc_socket_t *sock; isc_socket_t *sock;
int cc; int cc;
size_t read_count; size_t read_count;
struct sockaddr addr;
ISC_SOCKADDR_LEN_T addrlen; ISC_SOCKADDR_LEN_T addrlen;
/* /*
@@ -981,26 +974,18 @@ internal_recv(isc_task_t *task, isc_event_t *ev)
*/ */
read_count = dev->region.length - dev->n; read_count = dev->region.length - dev->n;
if (sock->type == isc_socket_udp) { if (sock->type == isc_socket_udp) {
addrlen = sizeof(addr); addrlen = sizeof dev->address.type;
cc = recvfrom(sock->fd, cc = recvfrom(sock->fd,
ISC_SOCKDATA_CAST(dev->region.base ISC_SOCKDATA_CAST(dev->region.base
+ dev->n), + dev->n),
read_count, 0, read_count, 0,
(struct sockaddr *)&addr, &dev->address.type.sa, &addrlen);
&addrlen); dev->address.length = addrlen;
if (cc >= 0) {
memcpy(&dev->address, &addr, addrlen);
dev->addrlength = addrlen;
}
} else { } else {
cc = recv(sock->fd, cc = recv(sock->fd,
ISC_SOCKDATA_CAST(dev->region.base + dev->n), ISC_SOCKDATA_CAST(dev->region.base + dev->n),
read_count, 0); read_count, 0);
if (cc >= 0) { dev->address = sock->address;
memcpy(&dev->address, &sock->address,
(size_t)sock->addrlength);
dev->addrlength = sock->addrlength;
}
} }
XTRACE(TRACE_RECV, XTRACE(TRACE_RECV,
@@ -1182,8 +1167,8 @@ internal_send(isc_task_t *task, isc_event_t *ev)
ISC_SOCKDATA_CAST(dev->region.base ISC_SOCKDATA_CAST(dev->region.base
+ dev->n), + dev->n),
write_count, 0, write_count, 0,
(struct sockaddr *)&dev->address, &dev->address.type.sa,
(int)dev->addrlength); (int)dev->address.length);
else else
cc = send(sock->fd, cc = send(sock->fd,
@@ -1731,14 +1716,14 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
if (EMPTY(sock->recv_list)) { if (EMPTY(sock->recv_list)) {
if (sock->type == isc_socket_udp) { if (sock->type == isc_socket_udp) {
ISC_SOCKADDR_LEN_T addrlen; ISC_SOCKADDR_LEN_T addrlen;
dev->addrlength = sizeof(isc_sockaddr_t);
addrlen = (ISC_SOCKADDR_LEN_T)dev->addrlength; addrlen = (ISC_SOCKADDR_LEN_T)
(sizeof dev->address.type);
cc = recvfrom(sock->fd, cc = recvfrom(sock->fd,
ISC_SOCKDATA_CAST(dev->region.base), ISC_SOCKDATA_CAST(dev->region.base),
dev->region.length, 0, dev->region.length, 0,
(struct sockaddr *)&dev->address, &dev->address.type.sa, &addrlen);
&addrlen); dev->address.length = (unsigned int)addrlen;
dev->addrlength = (unsigned int)addrlen;
} else { } else {
/* /*
* recv() is used on TCP sockets, since some OSs * recv() is used on TCP sockets, since some OSs
@@ -1750,7 +1735,6 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
ISC_SOCKDATA_CAST(dev->region.base), ISC_SOCKDATA_CAST(dev->region.base),
dev->region.length, 0); dev->region.length, 0);
dev->address = sock->address; dev->address = sock->address;
dev->addrlength = sock->addrlength;
} }
if (cc < 0) { if (cc < 0) {
@@ -1861,20 +1845,19 @@ isc_result_t
isc_socket_send(isc_socket_t *sock, isc_region_t *region, isc_socket_send(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
return (isc_socket_sendto(sock, region, task, action, arg, NULL, 0)); return (isc_socket_sendto(sock, region, task, action, arg, NULL));
} }
isc_result_t isc_result_t
isc_socket_sendto(isc_socket_t *sock, isc_region_t *region, isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, void *arg, isc_task_t *task, isc_taskaction_t action, void *arg,
isc_sockaddr_t *address, unsigned int addrlen) isc_sockaddr_t *address)
{ {
isc_socketevent_t *dev; isc_socketevent_t *dev;
rwintev_t *iev; rwintev_t *iev;
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
isc_task_t *ntask = NULL; isc_task_t *ntask = NULL;
int cc; int cc;
ISC_SOCKADDR_LEN_T addrlength = (ISC_SOCKADDR_LEN_T)addrlen;
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
@@ -1919,19 +1902,13 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
* If the write queue is empty, try to do the I/O right now. * If the write queue is empty, try to do the I/O right now.
*/ */
if (sock->type == isc_socket_udp) { if (sock->type == isc_socket_udp) {
INSIST(addrlength > 0 || sock->addrlength > 0); if (address != NULL)
if (addrlength > 0) {
dev->address = *address; dev->address = *address;
dev->addrlength = addrlength; else
} else if (sock->addrlength > 0) {
dev->address = sock->address; dev->address = sock->address;
dev->addrlength = sock->addrlength;
}
} else if (sock->type == isc_socket_tcp) { } else if (sock->type == isc_socket_tcp) {
INSIST(address == NULL); INSIST(address == NULL);
INSIST(addrlength == 0);
dev->address = sock->address; dev->address = sock->address;
dev->addrlength = sock->addrlength;
} }
if (EMPTY(sock->send_list)) { if (EMPTY(sock->send_list)) {
@@ -1939,8 +1916,8 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
cc = sendto(sock->fd, cc = sendto(sock->fd,
ISC_SOCKDATA_CAST(dev->region.base), ISC_SOCKDATA_CAST(dev->region.base),
dev->region.length, 0, dev->region.length, 0,
(struct sockaddr *)&dev->address, &dev->address.type.sa,
(int)dev->addrlength); (int)dev->address.length);
else if (sock->type == isc_socket_tcp) else if (sock->type == isc_socket_tcp)
cc = send(sock->fd, cc = send(sock->fd,
ISC_SOCKDATA_CAST(dev->region.base), ISC_SOCKDATA_CAST(dev->region.base),
@@ -2043,8 +2020,7 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
} }
isc_result_t isc_result_t
isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr, isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr)
int addrlen)
{ {
int on = 1; int on = 1;
@@ -2056,7 +2032,7 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
sock->fd); sock->fd);
/* Press on... */ /* Press on... */
} }
if (bind(sock->fd, (struct sockaddr *)sockaddr, addrlen) < 0) { if (bind(sock->fd, &sockaddr->type.sa, sockaddr->length) < 0) {
UNLOCK(&sock->lock); UNLOCK(&sock->lock);
switch (errno) { switch (errno) {
case EACCES: case EACCES:
@@ -2194,7 +2170,7 @@ isc_socket_accept(isc_socket_t *sock,
} }
isc_result_t isc_result_t
isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen, isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
isc_socket_connev_t *dev; isc_socket_connev_t *dev;
@@ -2244,8 +2220,7 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, int addrlen,
* outstanding, and it might happen to complete. * outstanding, and it might happen to complete.
*/ */
sock->address = *addr; sock->address = *addr;
sock->addrlength = addrlen; cc = connect(sock->fd, &addr->type.sa, addr->length);
cc = connect(sock->fd, (struct sockaddr *)addr, addrlen);
if (cc < 0) { if (cc < 0) {
if (SOFT_ERROR(errno) || errno == EINPROGRESS) if (SOFT_ERROR(errno) || errno == EINPROGRESS)
goto queue; goto queue;
@@ -2400,7 +2375,8 @@ internal_connect(isc_task_t *task, isc_event_t *ev)
strerror(errno)); strerror(errno));
break; break;
} }
} } else
dev->result = ISC_R_SUCCESS;
UNLOCK(&sock->lock); UNLOCK(&sock->lock);
@@ -2412,22 +2388,14 @@ internal_connect(isc_task_t *task, isc_event_t *ev)
} }
isc_result_t isc_result_t
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp, isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp)
int *lengthp)
{ {
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
REQUIRE(addressp != NULL); REQUIRE(addressp != NULL);
REQUIRE(lengthp != NULL);
LOCK(&sock->lock); LOCK(&sock->lock);
if (*lengthp < sock->addrlength) { *addressp = sock->address;
UNLOCK(&sock->lock);
return (ISC_R_NOSPACE);
}
memcpy(addressp, &sock->address, (size_t)sock->addrlength);
*lengthp = sock->addrlength;
UNLOCK(&sock->lock); UNLOCK(&sock->lock);
@@ -2435,33 +2403,23 @@ isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp,
} }
isc_result_t isc_result_t
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp, isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp)
int *lengthp)
{ {
isc_sockaddr_t addr;
ISC_SOCKADDR_LEN_T len; ISC_SOCKADDR_LEN_T len;
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
REQUIRE(addressp != NULL); REQUIRE(addressp != NULL);
REQUIRE(lengthp != NULL);
LOCK(&sock->lock); LOCK(&sock->lock);
len = sizeof(addr); len = sizeof addressp->type;
if (getsockname(sock->fd, (struct sockaddr *)&addr, &len) < 0) { if (getsockname(sock->fd, &addressp->type.sa, &len) < 0) {
UNEXPECTED_ERROR(__FILE__, __LINE__, UNEXPECTED_ERROR(__FILE__, __LINE__,
"getsockname: %s", strerror(errno)); "getsockname: %s", strerror(errno));
UNLOCK(&sock->lock); UNLOCK(&sock->lock);
return (ISC_R_UNEXPECTED); return (ISC_R_UNEXPECTED);
} }
addressp->length = (unsigned int)len;
if ((unsigned int)*lengthp < (unsigned int)len) {
UNLOCK(&sock->lock);
return (ISC_R_NOSPACE);
}
memcpy(addressp, &sock->address, (size_t)len);
*lengthp = (unsigned int)len;
UNLOCK(&sock->lock); UNLOCK(&sock->lock);