1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-01 04:58:35 +03:00

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@gmail.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
Jakub Hrozek 2014-12-03 15:45:02 +01:00 committed by Andrew Bartlett
parent 253753ca5b
commit 154fa401dc

View File

@ -141,6 +141,179 @@ static void rwrap_log(enum rwrap_dbglvl_e dbglvl,
} \
} while(0);
/* 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,
@ -346,13 +519,6 @@ static ssize_t rwrap_fake_aaaa(const char *key,
return resp_size;
}
/*
* 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
static ssize_t rwrap_fake_srv(const char *key,
const char *value,
uint8_t *answer,