projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
change retry loop to test before decrementing
[unix-history]
/
usr
/
src
/
lib
/
libc
/
net
/
res_send.c
diff --git
a/usr/src/lib/libc/net/res_send.c
b/usr/src/lib/libc/net/res_send.c
index
d9f863c
..
6ecde76
100644
(file)
--- a/
usr/src/lib/libc/net/res_send.c
+++ b/
usr/src/lib/libc/net/res_send.c
@@
-5,25
+5,27
@@
* specifies the terms and conditions for redistribution.
*/
* specifies the terms and conditions for redistribution.
*/
-#if
ndef lint
-static char sccsid[] = "@(#)res_send.c 6.
4
(Berkeley) %G%";
-#endif not lint
+#if
defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)res_send.c 6.
11
(Berkeley) %G%";
+#endif
LIBC_SCCS and
not lint
/*
* Send query to name server and wait for reply.
*/
/*
* Send query to name server and wait for reply.
*/
-#include <sys/
types
.h>
+#include <sys/
param
.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <arpa/nameser.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <arpa/nameser.h>
-#include <
arpa/
resolv.h>
+#include <resolv.h>
extern int errno;
extern int errno;
+static int s = -1; /* socket used for communications */
+
#define KEEPOPEN (RES_USEVC|RES_STAYOPEN)
res_send(buf, buflen, answer, anslen)
#define KEEPOPEN (RES_USEVC|RES_STAYOPEN)
res_send(buf, buflen, answer, anslen)
@@
-34,7
+36,6
@@
res_send(buf, buflen, answer, anslen)
{
register int n;
int retry, v_circuit, resplen, ns;
{
register int n;
int retry, v_circuit, resplen, ns;
- static int s = -1;
int gotsomewhere = 0;
u_short id, len;
char *cp;
int gotsomewhere = 0;
u_short id, len;
char *cp;
@@
-58,12
+59,12
@@
res_send(buf, buflen, answer, anslen)
/*
* Send request, RETRY times, or until successful
*/
/*
* Send request, RETRY times, or until successful
*/
- for (retry = _res.retry;
--retry >= 0;
) {
+ for (retry = _res.retry;
retry > 0; retry--
) {
for (ns = 0; ns < _res.nscount; ns++) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("Querying server (# %d) address = %s\n", ns+1,
for (ns = 0; ns < _res.nscount; ns++) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("Querying server (# %d) address = %s\n", ns+1,
- inet_ntoa(_res.nsaddr_list[ns].sin_addr.s_addr));
+ inet_ntoa(_res.nsaddr_list[ns].sin_addr.s_addr));
#endif DEBUG
if (v_circuit) {
/*
#endif DEBUG
if (v_circuit) {
/*
@@
-74,15
+75,15
@@
res_send(buf, buflen, answer, anslen)
if (s < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
if (s < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("socket failed %d\n",errno
);
+ p
error("socket failed"
);
#endif DEBUG
continue;
}
#endif DEBUG
continue;
}
- if (connect(s, &(_res.nsaddr_list[ns]),
+ if (connect(s, &(_res.nsaddr_list[ns]),
sizeof(struct sockaddr)) < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
sizeof(struct sockaddr)) < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("connect failed %d\n",errno
);
+ p
error("connect failed"
);
#endif DEBUG
(void) close(s);
s = -1;
#endif DEBUG
(void) close(s);
s = -1;
@@
-92,12
+93,12
@@
res_send(buf, buflen, answer, anslen)
/*
* Send length & message
*/
/*
* Send length & message
*/
- len = htons(buflen);
- if (write(s,
&len, sizeof(len)) != sizeof(len)
||
-
write(s, buf, buflen) != buflen) {
+ len = htons(
(u_short)
buflen);
+ if (write(s,
(char *)&len, sizeof(len)) != sizeof(len)
||
+ write(s, buf, buflen) != buflen) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("write failed %d\n", errno
);
+ p
error("write failed"
);
#endif DEBUG
(void) close(s);
s = -1;
#endif DEBUG
(void) close(s);
s = -1;
@@
-108,29
+109,31
@@
res_send(buf, buflen, answer, anslen)
*/
cp = answer;
len = sizeof(short);
*/
cp = answer;
len = sizeof(short);
- while (len > 0 && (n = read(s, cp, len)) > 0) {
+ while (len > 0 &&
+ (n = read(s, (char *)cp, (int)len)) > 0) {
cp += n;
len -= n;
}
if (n <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
cp += n;
len -= n;
}
if (n <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("read failed %d\n", errno
);
+ p
error("read failed"
);
#endif DEBUG
(void) close(s);
s = -1;
continue;
}
cp = answer;
#endif DEBUG
(void) close(s);
s = -1;
continue;
}
cp = answer;
- resplen = len = ntohs(*(short *)cp);
- while (len > 0 && (n = read(s, cp, len)) > 0) {
+ resplen = len = ntohs(*(u_short *)cp);
+ while (len > 0 &&
+ (n = read(s, (char *)cp, (int)len)) > 0) {
cp += n;
len -= n;
}
if (n <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
cp += n;
len -= n;
}
if (n <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("read failed %d\n", errno
);
+ p
error("read failed"
);
#endif DEBUG
(void) close(s);
s = -1;
#endif DEBUG
(void) close(s);
s = -1;
@@
-147,9
+150,8
@@
res_send(buf, buflen, answer, anslen)
sizeof(struct sockaddr)) < 0 ||
send(s, buf, buflen, 0) != buflen) {
#ifdef DEBUG
sizeof(struct sockaddr)) < 0 ||
send(s, buf, buflen, 0) != buflen) {
#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- printf("connect/send errno = %d\n",
- errno);
+ if (_res.options & RES_DEBUG)
+ perror("connect");
#endif DEBUG
continue;
}
#endif DEBUG
continue;
}
@@
-157,17
+159,19
@@
res_send(buf, buflen, answer, anslen)
if (sendto(s, buf, buflen, 0, &_res.nsaddr_list[ns],
sizeof(struct sockaddr)) != buflen) {
#ifdef DEBUG
if (sendto(s, buf, buflen, 0, &_res.nsaddr_list[ns],
sizeof(struct sockaddr)) != buflen) {
#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- p
rintf("sendto errno = %d\n", errno
);
+ if (_res.options & RES_DEBUG)
+ p
error("sendto"
);
#endif DEBUG
continue;
}
#endif BSD
/*
#endif DEBUG
continue;
}
#endif BSD
/*
- * Wait for reply
+ * Wait for reply
*/
*/
- timeout.tv_sec =
- ((_res.retrans * _res.retry) / _res.nscount);
+ timeout.tv_sec = (_res.retrans << (_res.retry - retry))
+ / _res.nscount;
+ if (timeout.tv_sec <= 0)
+ timeout.tv_sec = 1;
timeout.tv_usec = 0;
wait:
dsmask = 1 << s;
timeout.tv_usec = 0;
wait:
dsmask = 1 << s;
@@
-175,7
+179,7
@@
wait:
if (n < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
if (n < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("select errno = %d\n", errno
);
+ p
error("select"
);
#endif DEBUG
continue;
}
#endif DEBUG
continue;
}
@@
-193,7
+197,7
@@
wait:
if ((resplen = recv(s, answer, anslen, 0)) <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
if ((resplen = recv(s, answer, anslen, 0)) <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
- p
rintf("recvfrom, errno=%d\n", errno
);
+ p
error("recvfrom"
);
#endif DEBUG
continue;
}
#endif DEBUG
continue;
}
@@
-220,7
+224,11
@@
wait:
#endif DEBUG
(void) close(s);
s = -1;
#endif DEBUG
(void) close(s);
s = -1;
- retry = _res.retry;
+ /*
+ * retry decremented on continue
+ * to desired starting value
+ */
+ retry = _res.retry + 1;
v_circuit = 1;
continue;
}
v_circuit = 1;
continue;
}
@@
-246,9
+254,25
@@
wait:
}
}
(void) close(s);
}
}
(void) close(s);
+ s = -1;
if (v_circuit == 0 && gotsomewhere == 0)
errno = ECONNREFUSED;
else
errno = ETIMEDOUT;
return (-1);
}
if (v_circuit == 0 && gotsomewhere == 0)
errno = ECONNREFUSED;
else
errno = ETIMEDOUT;
return (-1);
}
+
+/*
+ * This routine is for closing the socket if a virtual circuit is used and
+ * the program wants to close it. This provides support for endhostent()
+ * which expects to close the socket.
+ *
+ * This routine is not expected to be user visible.
+ */
+_res_close()
+{
+ if (s != -1) {
+ (void) close(s);
+ s = -1;
+ }
+}