[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Dec 5 17:55:03 MST 2014


The branch, master has been updated
       via  ecd0e6e rwrap: Bump version to 1.1.0.
       via  5c0ada1 rwrap: Don't dereference NULL when skipping broken records.
       via  3b3fc1a rwrap: Support asking for A via CNAME
       via  f5c156a rwrap: Recursively add additional data
       via  aa78268 rwrap: Make the rwrap_fake_* functions only fake RRs.
       via  2782877 rwrap: CNAME record can recurse into A, AAAA or CNAME
       via  917c3f0 rwrap: SRV record can recurse into A or AAAA.
       via  0d128c5 rwrap: Use the rwrap_fake_rr structure instead of raw uint8_t pointers.
       via  154fa40 rwrap: Add data structures and functions to represent and manipulate RRs.
       via  253753c rwrap: Correctly calculate the response size and return it.
       via  849bfe0 rwrap: Handle trailing dot in dns names.
       via  dab427e rwrap: Compare dns names case insensitive.
       via  8bf949f lib: Add resolv_wrapper version 1.0.0.
       via  70bbb1d selftest: Add the normal dns name as an alias for the main DC.
       via  9cde3ae testprogs: Set functional domain level to 2003.
      from  a07af1b ctdb-tests: Need to drop public IPs in kill-failover tests

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ecd0e6e985ff8719963e31e1395b9ccbd38d94e1
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 3 15:45:10 2014 +0100

    rwrap: Bump version to 1.1.0.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Sat Dec  6 01:54:12 CET 2014 on sn-devel-104

commit 5c0ada1d570175498a4b97628b6f1dc45a72109a
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:09 2014 +0100

    rwrap: Don't dereference NULL when skipping broken records.
    
    CID: 83426
    CID: 83425
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Michael Adam <obnox at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3b3fc1a21830d136bc1e571d08913dbec5b06336
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:08 2014 +0100

    rwrap: Support asking for A via CNAME
    
    Adds support for querying for an A record using a name that only expands
    into a CNAME.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f5c156aac20b468b4324114515e1a951e1304713
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:07 2014 +0100

    rwrap: Recursively add additional data
    
    Change how we construct the fake answer such that the header and
    question are added first, then the answers and finally additional data.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit aa78268a49062d3bd1cb907828a250a01ebbd59a
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:06 2014 +0100

    rwrap: Make the rwrap_fake_* functions only fake RRs.
    
    The rwrap_fake_common() function did too much. Remove it and use
    separate functions to add fake header and question sections. The
    rwrap_fake_$RR functions will receive packet including the header and
    question and only add its RR data.
    
    This will allow recursive processing later.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 27828774c3633389b5ce5397d8e25fab2e278624
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:05 2014 +0100

    rwrap: CNAME record can recurse into A, AAAA or CNAME
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 917c3f08440c302511bdf06b5ac11b42630bdd28
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:04 2014 +0100

    rwrap: SRV record can recurse into A or AAAA.
    
    When querying for a SRV record, we'll need to include A or AAAA records
    in additional section. Therefore, keep querying the host file until we
    can either recurse the A/AAAA records or reach the recursion limit
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0d128c5443283dee86edce60325083647985fe02
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:03 2014 +0100

    rwrap: Use the rwrap_fake_rr structure instead of raw uint8_t pointers.
    
    Currently only one instance of the rwrap_fake_rr structure is used. Recursion
    will be implemented in a future patch.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 154fa401dc10e9d20f7296d23227c554dead2b44
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:45:02 2014 +0100

    rwrap: Add data structures and functions to represent and manipulate RRs.
    
    Adds a structure that, using unions represents all supported RRs. Add a
    bunch of utility functions that can be used to create these structures.
    
    Currently the functions are unused.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 253753ca5b641d067bff2056929241540badd66f
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 3 15:45:01 2014 +0100

    rwrap: Correctly calculate the response size and return it.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 849bfe09b8275c4f11258d5ecf530a56a6d7e883
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 3 15:45:00 2014 +0100

    rwrap: Handle trailing dot in dns names.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit dab427e94eb4f21582ee9211ba4d837e4ed024a3
Author: Jakub Hrozek <jakub.hrozek at gmail.com>
Date:   Wed Dec 3 15:44:59 2014 +0100

    rwrap: Compare dns names case insensitive.
    
    Signed-off-by: Jakub Hrozek <jakub.hrozek at gmail.com>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8bf949f343f8da7431d130395e3ac29e4be39889
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 3 15:44:58 2014 +0100

    lib: Add resolv_wrapper version 1.0.0.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 70bbb1dd3c8d118fd5a2ff01bd4aa4c00d34998e
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 3 15:44:57 2014 +0100

    selftest: Add the normal dns name as an alias for the main DC.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9cde3aec48852c2eb109bcdcf337659743067594
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 5 17:03:31 2014 +0100

    testprogs: Set functional domain level to 2003.
    
    The default changed to 2008r2 recently.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/resolv_wrapper/resolv_wrapper.c      | 1713 ++++++++++++++++++++++++++++++
 lib/resolv_wrapper/wscript               |   94 ++
 selftest/target/Samba4.pm                |    9 +-
 testprogs/blackbox/dbcheck-oldrelease.sh |    2 +-
 wscript                                  |    1 +
 wscript_build                            |    1 +
 6 files changed, 1817 insertions(+), 3 deletions(-)
 create mode 100644 lib/resolv_wrapper/resolv_wrapper.c
 create mode 100644 lib/resolv_wrapper/wscript


Changeset truncated at 500 lines:

diff --git a/lib/resolv_wrapper/resolv_wrapper.c b/lib/resolv_wrapper/resolv_wrapper.c
new file mode 100644
index 0000000..7211ad0
--- /dev/null
+++ b/lib/resolv_wrapper/resolv_wrapper.c
@@ -0,0 +1,1713 @@
+/*
+ * Copyright (c) 2014      Andreas Schneider <asn at samba.org>
+ * Copyright (c) 2014      Jakub Hrozek <jakub.hrozek at gmail.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/types.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+
+#include <resolv.h>
+
+/* GCC has printf type attribute check. */
+#ifdef HAVE_ATTRIBUTE_PRINTF_FORMAT
+#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
+#else
+#define PRINTF_ATTRIBUTE(a,b)
+#endif /* HAVE_ATTRIBUTE_PRINTF_FORMAT */
+
+#ifdef HAVE_DESTRUCTOR_ATTRIBUTE
+#define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
+#else
+#define DESTRUCTOR_ATTRIBUTE
+#endif /* HAVE_DESTRUCTOR_ATTRIBUTE */
+
+#ifndef RWRAP_DEFAULT_FAKE_TTL
+#define RWRAP_DEFAULT_FAKE_TTL 600
+#endif  /* RWRAP_DEFAULT_FAKE_TTL */
+
+enum rwrap_dbglvl_e {
+	RWRAP_LOG_ERROR = 0,
+	RWRAP_LOG_WARN,
+	RWRAP_LOG_DEBUG,
+	RWRAP_LOG_TRACE
+};
+
+#ifdef NDEBUG
+# define RWRAP_LOG(...)
+#else /* NDEBUG */
+
+static void rwrap_log(enum rwrap_dbglvl_e dbglvl, const char *func, const char *format, ...) PRINTF_ATTRIBUTE(3, 4);
+# define RWRAP_LOG(dbglvl, ...) rwrap_log((dbglvl), __func__, __VA_ARGS__)
+
+static void rwrap_log(enum rwrap_dbglvl_e dbglvl,
+		      const char *func,
+		      const char *format, ...)
+{
+	char buffer[1024];
+	va_list va;
+	const char *d;
+	unsigned int lvl = 0;
+	int pid = getpid();
+
+	d = getenv("RESOLV_WRAPPER_DEBUGLEVEL");
+	if (d != NULL) {
+		lvl = atoi(d);
+	}
+
+	va_start(va, format);
+	vsnprintf(buffer, sizeof(buffer), format, va);
+	va_end(va);
+
+	if (lvl >= dbglvl) {
+		switch (dbglvl) {
+			case RWRAP_LOG_ERROR:
+				fprintf(stderr,
+					"RWRAP_ERROR(%d) - %s: %s\n",
+					pid, func, buffer);
+				break;
+			case RWRAP_LOG_WARN:
+				fprintf(stderr,
+					"RWRAP_WARN(%d) - %s: %s\n",
+					pid, func, buffer);
+				break;
+			case RWRAP_LOG_DEBUG:
+				fprintf(stderr,
+					"RWRAP_DEBUG(%d) - %s: %s\n",
+					pid, func, buffer);
+				break;
+			case RWRAP_LOG_TRACE:
+				fprintf(stderr,
+					"RWRAP_TRACE(%d) - %s: %s\n",
+					pid, func, buffer);
+				break;
+		}
+	}
+}
+#endif /* NDEBUG RWRAP_LOG */
+
+#ifndef SAFE_FREE
+#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); (x)=NULL;} } while(0)
+#endif
+
+#define NEXT_KEY(buf, key) do {					\
+	(key) = (buf) ? strpbrk((buf), " \t") : NULL;		\
+	if ((key) != NULL) {					\
+		(key)[0] = '\0';				\
+		(key)++;					\
+	}							\
+	while ((key) != NULL					\
+	       && (isblank((int)(key)[0]))) {			\
+		(key)++;					\
+	}							\
+} while(0);
+
+#define RWRAP_MAX_RECURSION 5
+
+/* Priority and weight can be omitted from the hosts file, but need to be part
+ * of the output
+ */
+#define DFL_SRV_PRIO	1
+#define DFL_SRV_WEIGHT	100
+
+struct rwrap_srv_rrdata {
+	uint16_t port;
+	uint16_t prio;
+	uint16_t weight;
+	char hostname[MAXDNAME];
+};
+
+struct rwrap_soa_rrdata {
+	uint32_t serial;
+	uint32_t refresh;
+	uint32_t retry;
+	uint32_t expire;
+	uint32_t minimum;
+	char nameserver[MAXDNAME];
+	char mailbox[MAXDNAME];
+};
+
+struct rwrap_fake_rr {
+	union fake_rrdata {
+		struct in_addr a_rec;
+		struct in6_addr aaaa_rec;
+		struct rwrap_srv_rrdata srv_rec;
+		struct rwrap_soa_rrdata soa_rec;
+		char cname_rec[MAXDNAME];
+	} rrdata;
+
+	char key[MAXDNAME];
+	int type; /* ns_t_* */
+};
+
+static void rwrap_fake_rr_init(struct rwrap_fake_rr *rr, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; i++) {
+		rr[i].type = ns_t_invalid;
+	}
+}
+
+static int rwrap_create_fake_a_rr(const char *key,
+				  const char *value,
+				  struct rwrap_fake_rr *rr)
+{
+	int ok;
+
+	ok = inet_pton(AF_INET, value, &rr->rrdata.a_rec);
+	if (!ok) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Failed to convert [%s] to binary\n", value);
+		return -1;
+	}
+
+	memcpy(rr->key, key, strlen(key) + 1);
+	rr->type = ns_t_a;
+	return 0;
+}
+
+static int rwrap_create_fake_aaaa_rr(const char *key,
+				     const char *value,
+				     struct rwrap_fake_rr *rr)
+{
+	int ok;
+
+	ok = inet_pton(AF_INET6, value, &rr->rrdata.aaaa_rec);
+	if (!ok) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Failed to convert [%s] to binary\n", value);
+		return -1;
+	}
+
+	memcpy(rr->key, key, strlen(key) + 1);
+	rr->type = ns_t_aaaa;
+	return 0;
+}
+
+static int rwrap_create_fake_srv_rr(const char *key,
+				    const char *value,
+				    struct rwrap_fake_rr *rr)
+{
+	char *str_prio;
+	char *str_weight;
+	char *str_port;
+	const char *hostname;
+
+	/* parse the value into priority, weight, port and hostname
+	 * and check the validity */
+	hostname = value;
+	NEXT_KEY(hostname, str_port);
+	NEXT_KEY(str_port, str_prio);
+	NEXT_KEY(str_prio, str_weight);
+	if (str_port == NULL || hostname == NULL) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Malformed SRV entry [%s]\n", value);
+		return -1;
+	}
+
+	if (str_prio) {
+		rr->rrdata.srv_rec.prio = atoi(str_prio);
+	} else {
+		rr->rrdata.srv_rec.prio = DFL_SRV_PRIO;
+	}
+	if (str_weight) {
+		rr->rrdata.srv_rec.weight = atoi(str_weight);
+	} else {
+		rr->rrdata.srv_rec.weight = DFL_SRV_WEIGHT;
+	}
+	rr->rrdata.srv_rec.port = atoi(str_port);
+	memcpy(rr->rrdata.srv_rec.hostname , hostname, strlen(hostname) + 1);
+
+	memcpy(rr->key, key, strlen(key) + 1);
+	rr->type = ns_t_srv;
+	return 0;
+}
+
+static int rwrap_create_fake_soa_rr(const char *key,
+				    const char *value,
+				    struct rwrap_fake_rr *rr)
+{
+	const char *nameserver;
+	char *mailbox;
+	char *str_serial;
+	char *str_refresh;
+	char *str_retry;
+	char *str_expire;
+	char *str_minimum;
+
+	/* parse the value into nameserver, mailbox, serial, refresh,
+	 * retry, expire, minimum and check the validity
+	 */
+	nameserver = value;
+	NEXT_KEY(nameserver, mailbox);
+	NEXT_KEY(mailbox, str_serial);
+	NEXT_KEY(str_serial, str_refresh);
+	NEXT_KEY(str_refresh, str_retry);
+	NEXT_KEY(str_retry, str_expire);
+	NEXT_KEY(str_expire, str_minimum);
+	if (nameserver == NULL || mailbox == NULL || str_serial == NULL ||
+	    str_refresh == NULL || str_retry == NULL || str_expire == NULL ||
+	    str_minimum == NULL) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Malformed SOA entry [%s]\n", value);
+		return -1;
+	}
+
+	memcpy(rr->rrdata.soa_rec.nameserver, nameserver, strlen(nameserver)+1);
+	memcpy(rr->rrdata.soa_rec.mailbox, mailbox, strlen(mailbox)+1);
+
+	rr->rrdata.soa_rec.serial = atoi(str_serial);
+	rr->rrdata.soa_rec.refresh = atoi(str_refresh);
+	rr->rrdata.soa_rec.retry = atoi(str_retry);
+	rr->rrdata.soa_rec.expire = atoi(str_expire);
+	rr->rrdata.soa_rec.minimum = atoi(str_minimum);
+
+	memcpy(rr->key, key, strlen(key) + 1);
+	rr->type = ns_t_soa;
+	return 0;
+}
+
+static int rwrap_create_fake_cname_rr(const char *key,
+				      const char *value,
+				      struct rwrap_fake_rr *rr)
+{
+	memcpy(rr->rrdata.cname_rec , value, strlen(value) + 1);
+	memcpy(rr->key, key, strlen(key) + 1);
+	rr->type = ns_t_cname;
+	return 0;
+}
+
+/* Prepares a fake header with a single response. Advances header_blob */
+static ssize_t rwrap_fake_header(uint8_t **header_blob, size_t remaining,
+			         size_t ancount, size_t arcount)
+{
+	uint8_t *hb;
+	HEADER *h;
+
+	if (remaining < NS_HFIXEDSZ) {
+		RWRAP_LOG(RWRAP_LOG_ERROR, "Buffer too small!\n");
+		return -1;
+	}
+
+	hb = *header_blob;
+	memset(hb, 0, NS_HFIXEDSZ);
+
+	h = (HEADER *) hb;
+	h->id = res_randomid();		/* random query ID */
+	h->qr = 1;			/* response flag */
+	h->rd = 1;			/* recursion desired */
+	h->ra = 1;			/* resursion available */
+
+	h->qdcount = htons(1);		/* no. of questions */
+	h->ancount = htons(ancount);	/* no. of answers */
+	h->arcount = htons(arcount);	/* no. of add'tl records */
+
+	hb += NS_HFIXEDSZ;		/* move past the header */
+	*header_blob = hb;
+
+	return NS_HFIXEDSZ;
+}
+
+static ssize_t rwrap_fake_question(const char *question,
+				   uint16_t type,
+				   uint8_t **question_ptr,
+				   size_t remaining)
+{
+	uint8_t *qb = *question_ptr;
+	int n;
+
+	n = ns_name_compress(question, qb, remaining, NULL, NULL);
+	if (n < 0) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Failed to compress [%s]\n", question);
+		return -1;
+	}
+
+	qb += n;
+	remaining -= n;
+
+	if (remaining < 2 * sizeof(uint16_t)) {
+		RWRAP_LOG(RWRAP_LOG_ERROR, "Buffer too small!\n");
+		return -1;
+	}
+
+	NS_PUT16(type, qb);
+	NS_PUT16(ns_c_in, qb);
+
+	*question_ptr = qb;
+	return n + 2 * sizeof(uint16_t);
+}
+
+static ssize_t rwrap_fake_rdata_common(uint16_t type,
+				       size_t rdata_size,
+				       const char *key,
+				       size_t remaining,
+				       uint8_t **rdata_ptr)
+{
+	uint8_t *rd = *rdata_ptr;
+	ssize_t written = 0;
+
+	written = ns_name_compress(key, rd, remaining, NULL, NULL);
+	if (written < 0) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Failed to compress [%s]\n", key);
+		return -1;
+	}
+	rd += written;
+	remaining -= written;
+
+	if (remaining < 3 * sizeof(uint16_t) + sizeof(uint32_t)) {
+		RWRAP_LOG(RWRAP_LOG_ERROR, "Buffer too small\n");
+		return -1;
+	}
+
+	NS_PUT16(type, rd);
+	NS_PUT16(ns_c_in, rd);
+	NS_PUT32(RWRAP_DEFAULT_FAKE_TTL, rd);
+	NS_PUT16(rdata_size, rd);
+
+	if (remaining < rdata_size) {
+		RWRAP_LOG(RWRAP_LOG_ERROR, "Buffer too small\n");
+		return -1;
+	}
+
+	*rdata_ptr = rd;
+	return written + 3 * sizeof(uint16_t) + sizeof(uint32_t) + rdata_size;
+}
+
+static ssize_t rwrap_fake_a(struct rwrap_fake_rr *rr,
+			    uint8_t *answer_ptr,
+			    size_t anslen)
+{
+	uint8_t *a = answer_ptr;
+	ssize_t resp_size;
+
+	if (rr == NULL || rr->type != ns_t_a) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Malformed record, no or wrong value!\n");
+		return -1;
+	}
+	RWRAP_LOG(RWRAP_LOG_TRACE, "Adding A RR");
+
+	resp_size = rwrap_fake_rdata_common(ns_t_a, sizeof(struct in_addr), rr->key,
+					    anslen, &a);
+	if (resp_size < 0) {
+		return -1;
+	}
+
+	memcpy(a, &rr->rrdata.a_rec, sizeof(struct in_addr));
+
+	return resp_size;
+}
+
+static ssize_t rwrap_fake_aaaa(struct rwrap_fake_rr *rr,
+			       uint8_t *answer,
+			       size_t anslen)
+{
+	uint8_t *a = answer;
+	ssize_t resp_size;
+
+	if (rr == NULL || rr->type != ns_t_aaaa) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Malformed record, no or wrong value!\n");
+		return -1;
+	}
+	RWRAP_LOG(RWRAP_LOG_TRACE, "Adding AAAA RR");
+
+	resp_size = rwrap_fake_rdata_common(ns_t_aaaa, sizeof(struct in6_addr),
+					    rr->key, anslen, &a);
+	if (resp_size < 0) {
+		return -1;
+	}
+
+	memcpy(a, &rr->rrdata.aaaa_rec, sizeof(struct in6_addr));
+
+	return resp_size;
+}
+
+static ssize_t rwrap_fake_srv(struct rwrap_fake_rr *rr,
+			      uint8_t *answer,
+			      size_t anslen)
+{
+	uint8_t *a = answer;
+	ssize_t resp_size;
+	size_t rdata_size;
+	unsigned char hostname_compressed[MAXDNAME];
+	ssize_t compressed_len;
+
+	if (rr == NULL || rr->type != ns_t_srv) {
+		RWRAP_LOG(RWRAP_LOG_ERROR,
+			  "Malformed record, no or wrong value!\n");
+		return -1;
+	}
+	RWRAP_LOG(RWRAP_LOG_TRACE, "Adding SRV RR");
+	rdata_size = 3 * sizeof(uint16_t);
+
+	/* Prepare the data to write */
+	compressed_len = ns_name_compress(rr->rrdata.srv_rec.hostname,
+					  hostname_compressed, MAXDNAME,
+					  NULL, NULL);
+	if (compressed_len < 0) {
+		return -1;
+	}
+	rdata_size += compressed_len;
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list