SCCS-vsn: lib/libc/net/res_mkquery.c 5.4
SCCS-vsn: lib/libc/net/res_send.c 5.5
-static char sccsid[] = "@(#)res_mkquery.c 5.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)res_mkquery.c 5.4 (Berkeley) %G%";
#endif not lint
#include <stdio.h>
#endif not lint
#include <stdio.h>
char *dnptrs[10], **dpp, **lastdnptr;
extern char *index();
char *dnptrs[10], **dpp, **lastdnptr;
extern char *index();
if (_res.options & RES_DEBUG)
printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
if (_res.options & RES_DEBUG)
printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
/*
* Initialize header fields.
*/
/*
* Initialize header fields.
*/
if ((_res.options & RES_DEFNAMES) && dname[0] != '\0' &&
index(dname, '.') == NULL) {
if (!(_res.options & RES_INIT))
if ((_res.options & RES_DEFNAMES) && dname[0] != '\0' &&
index(dname, '.') == NULL) {
if (!(_res.options & RES_INIT))
+ if (res_init() == -1)
+ return(-1);
if (_res.defdname[0] != '\0')
dname = sprintf(dnbuf, "%s.%s", dname, _res.defdname);
}
if (_res.defdname[0] != '\0')
dname = sprintf(dnbuf, "%s.%s", dname, _res.defdname);
}
-static char sccsid[] = "@(#)res_send.c 5.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)res_send.c 5.5 (Berkeley) %G%";
HEADER *hp = (HEADER *) buf;
HEADER *anhp = (HEADER *) answer;
HEADER *hp = (HEADER *) buf;
HEADER *anhp = (HEADER *) answer;
if (_res.options & RES_DEBUG) {
printf("res_send()\n");
p_query(buf);
}
if (_res.options & RES_DEBUG) {
printf("res_send()\n");
p_query(buf);
}
if (!(_res.options & RES_INIT))
if (!(_res.options & RES_INIT))
+ if (res_init() == -1) {
+ return(-1);
+ }
s = -1;
v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ;
id = hp->id;
s = -1;
v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ;
id = hp->id;
if (s < 0)
s = socket(AF_INET, SOCK_STREAM, 0);
if (connect(s, &_res.nsaddr, sizeof(_res.nsaddr)) < 0) {
if (s < 0)
s = socket(AF_INET, SOCK_STREAM, 0);
if (connect(s, &_res.nsaddr, sizeof(_res.nsaddr)) < 0) {
if (_res.options & RES_DEBUG)
printf("connect failed %d\n", errno);
if (_res.options & RES_DEBUG)
printf("connect failed %d\n", errno);
(void) close(s);
s = -1;
continue;
(void) close(s);
s = -1;
continue;
len = htons(buflen);
if (write(s, &len, sizeof(len)) != sizeof(len) ||
write(s, buf, buflen) != buflen) {
len = htons(buflen);
if (write(s, &len, sizeof(len)) != sizeof(len) ||
write(s, buf, buflen) != buflen) {
if (_res.options & RES_DEBUG)
printf("write failed %d\n", errno);
if (_res.options & RES_DEBUG)
printf("write failed %d\n", errno);
(void) close(s);
s = -1;
continue;
(void) close(s);
s = -1;
continue;
len -= n;
}
if (n <= 0) {
len -= n;
}
if (n <= 0) {
if (_res.options & RES_DEBUG)
printf("read failed %d\n", errno);
if (_res.options & RES_DEBUG)
printf("read failed %d\n", errno);
(void) close(s);
s = -1;
continue;
(void) close(s);
s = -1;
continue;
len -= n;
}
if (n <= 0) {
len -= n;
}
if (n <= 0) {
if (_res.options & RES_DEBUG)
printf("read failed %d\n", errno);
if (_res.options & RES_DEBUG)
printf("read failed %d\n", errno);
(void) close(s);
s = -1;
continue;
(void) close(s);
s = -1;
continue;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (sendto(s, buf, buflen, 0, &_res.nsaddr,
sizeof(_res.nsaddr)) != buflen) {
s = socket(AF_INET, SOCK_DGRAM, 0);
if (sendto(s, buf, buflen, 0, &_res.nsaddr,
sizeof(_res.nsaddr)) != buflen) {
if (_res.options & RES_DEBUG)
printf("sendto errno = %d\n", errno);
if (_res.options & RES_DEBUG)
printf("sendto errno = %d\n", errno);
dsmask = 1 << s;
n = select(s+1, &dsmask, 0, 0, &timeout);
if (n < 0) {
dsmask = 1 << s;
n = select(s+1, &dsmask, 0, 0, &timeout);
if (n < 0) {
if (_res.options & RES_DEBUG)
printf("select errno = %d\n", errno);
if (_res.options & RES_DEBUG)
printf("select errno = %d\n", errno);
continue;
}
if (n == 0) {
/*
* timeout
*/
continue;
}
if (n == 0) {
/*
* timeout
*/
if (_res.options & RES_DEBUG)
printf("timeout\n");
if (_res.options & RES_DEBUG)
printf("timeout\n");
continue;
}
if ((resplen = recvfrom(s, answer, anslen,
0, 0, 0)) <= 0) {
continue;
}
if ((resplen = recvfrom(s, answer, anslen,
0, 0, 0)) <= 0) {
if (_res.options & RES_DEBUG)
printf("recvfrom, errno=%d\n", errno);
if (_res.options & RES_DEBUG)
printf("recvfrom, errno=%d\n", errno);
continue;
}
if (id != anhp->id) {
/*
* response from old query, ignore it
*/
continue;
}
if (id != anhp->id) {
/*
* response from old query, ignore it
*/
if (_res.options & RES_DEBUG) {
printf("old answer:\n");
p_query(answer);
}
if (_res.options & RES_DEBUG) {
printf("old answer:\n");
p_query(answer);
}
continue;
}
if (!(_res.options & RES_IGNTC) && anhp->tc) {
/*
* get rest of answer
*/
continue;
}
if (!(_res.options & RES_IGNTC) && anhp->tc) {
/*
* get rest of answer
*/
if (_res.options & RES_DEBUG)
printf("truncated answer\n");
if (_res.options & RES_DEBUG)
printf("truncated answer\n");
(void) close(s);
s = -1;
retry = _res.retry;
(void) close(s);
s = -1;
retry = _res.retry;
if (_res.options & RES_DEBUG) {
printf("got answer:\n");
p_query(answer);
}
if (_res.options & RES_DEBUG) {
printf("got answer:\n");
p_query(answer);
}
(void) close(s);
return (resplen);
}
(void) close(s);
return (resplen);
}