summaryrefslogtreecommitdiff
path: root/lib/libc/asr/res_send_async.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/asr/res_send_async.c')
-rw-r--r--lib/libc/asr/res_send_async.c61
1 files changed, 13 insertions, 48 deletions
diff --git a/lib/libc/asr/res_send_async.c b/lib/libc/asr/res_send_async.c
index 7a91d190b83..2a661a12e95 100644
--- a/lib/libc/asr/res_send_async.c
+++ b/lib/libc/asr/res_send_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: res_send_async.c,v 1.16 2013/04/14 22:23:08 deraadt Exp $ */
+/* $OpenBSD: res_send_async.c,v 1.17 2013/04/30 12:02:39 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -49,8 +49,7 @@ static int ensure_ibuf(struct async *, size_t);
struct async *
-res_send_async(const unsigned char *buf, int buflen, unsigned char *ans,
- int anslen, struct asr *asr)
+res_send_async(const unsigned char *buf, int buflen, struct asr *asr)
{
struct asr_ctx *ac;
struct async *as;
@@ -67,17 +66,6 @@ res_send_async(const unsigned char *buf, int buflen, unsigned char *ans,
}
as->as_run = res_send_async_run;
- if (ans) {
- as->as.dns.flags |= ASYNC_EXTIBUF;
- as->as.dns.ibuf = ans;
- as->as.dns.ibufsize = anslen;
- as->as.dns.ibuflen = 0;
- } else {
- as->as.dns.ibuf = NULL;
- as->as.dns.ibufsize = 0;
- as->as.dns.ibuflen = 0;
- }
-
as->as.dns.flags |= ASYNC_EXTOBUF;
as->as.dns.obuf = (unsigned char *)buf;
as->as.dns.obuflen = buflen;
@@ -113,8 +101,7 @@ res_send_async(const unsigned char *buf, int buflen, unsigned char *ans,
* (ans == NULL).
*/
struct async *
-res_query_async(const char *name, int class, int type, unsigned char *ans,
- int anslen, struct asr *asr)
+res_query_async(const char *name, int class, int type, struct asr *asr)
{
struct asr_ctx *ac;
struct async *as;
@@ -122,15 +109,14 @@ res_query_async(const char *name, int class, int type, unsigned char *ans,
DPRINT("asr: res_query_async(\"%s\", %i, %i)\n", name, class, type);
ac = asr_use_resolver(asr);
- as = res_query_async_ctx(name, class, type, ans, anslen, ac);
+ as = res_query_async_ctx(name, class, type, ac);
asr_ctx_unref(ac);
return (as);
}
struct async *
-res_query_async_ctx(const char *name, int class, int type, unsigned char *ans,
- int anslen, struct asr_ctx *a_ctx)
+res_query_async_ctx(const char *name, int class, int type, struct asr_ctx *a_ctx)
{
struct async *as;
@@ -140,16 +126,6 @@ res_query_async_ctx(const char *name, int class, int type, unsigned char *ans,
return (NULL); /* errno set */
as->as_run = res_send_async_run;
- if (ans) {
- as->as.dns.flags |= ASYNC_EXTIBUF;
- as->as.dns.ibuf = ans;
- as->as.dns.ibufsize = anslen;
- } else {
- as->as.dns.ibuf = NULL;
- as->as.dns.ibufsize = 0;
- }
- as->as.dns.ibuflen = 0;
-
/* This adds a "." to name if it doesn't already has one.
* That's how res_query() behaves (through res_mkquery").
*/
@@ -478,15 +454,12 @@ udp_recv(struct async *as)
ssize_t n;
int save_errno;
- /* Allocate input buf if needed */
- if (as->as.dns.ibuf == NULL) {
- if (ensure_ibuf(as, PACKETSZ) == -1) {
- save_errno = errno;
- close(as->as_fd);
- errno = save_errno;
- as->as_fd = -1;
- return (-1);
- }
+ if (ensure_ibuf(as, PACKETSZ) == -1) {
+ save_errno = errno;
+ close(as->as_fd);
+ errno = save_errno;
+ as->as_fd = -1;
+ return (-1);
}
n = recv(as->as_fd, as->as.dns.ibuf, as->as.dns.ibufsize, 0);
@@ -664,22 +637,14 @@ close:
}
/*
- * Make sure the input buffer is at least "n" bytes long.
- * If not (or not allocated) allocated enough space, unless the
- * buffer is external (owned by the caller), in which case it fails.
+ * Make sure the input buffer is at least "n" bytes long, and allocate or
+ * extend it if necessary. Return 0 on success, or set errno and return -1.
*/
static int
ensure_ibuf(struct async *as, size_t n)
{
char *t;
- if (as->as.dns.flags & ASYNC_EXTIBUF) {
- if (n <= as->as.dns.ibufsize)
- return (0);
- errno = EINVAL;
- return (-1);
- }
-
if (as->as.dns.ibuf == NULL) {
as->as.dns.ibuf = malloc(n);
if (as->as.dns.ibuf == NULL)