1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

dnsp: Parse TXT records

This commit is contained in:
Kai Blin 2010-08-13 11:09:09 +02:00
parent da21f78099
commit 65d2cfdcf1
6 changed files with 66 additions and 1 deletions

View File

@ -40,6 +40,7 @@ interface dnsp
DNS_TYPE_HINFO = 0xD,
DNS_TYPE_MINFO = 0xE,
DNS_TYPE_MX = 0xF,
DNS_TYPE_TXT = 0x10,
DNS_TYPE_RP = 0x11,
DNS_TYPE_AFSDB = 0x12,
DNS_TYPE_X25 = 0x13,
@ -92,6 +93,7 @@ interface dnsp
[case(DNS_TYPE_CNAME)] dnsp_name cname;
[case(DNS_TYPE_SOA)] [flag(NDR_BIG_ENDIAN)] dnsp_soa soa;
[case(DNS_TYPE_MX)] [flag(NDR_BIG_ENDIAN)] dnsp_mx mx;
[case(DNS_TYPE_TXT)] dnsp_string txt;
[case(DNS_TYPE_PTR)] dnsp_name ptr;
[case(DNS_TYPE_AAAA)] ipv6address ip;
[case(DNS_TYPE_SRV)] [flag(NDR_BIG_ENDIAN)] dnsp_srv srv;

View File

@ -98,3 +98,55 @@ enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, const
return NDR_ERR_SUCCESS;
}
/*
print a dnsp_string
*/
_PUBLIC_ void ndr_print_dnsp_string(struct ndr_print *ndr, const char *name,
const char *dns_string)
{
ndr->print(ndr, "%-25s: %s", name, dns_string);
}
/*
pull a dnsp_string
*/
_PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_flags, const char **string)
{
uint8_t len;
uint32_t total_len;
char *ret;
NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &len));
ret = talloc_strdup(ndr->current_mem_ctx, "");
if (!ret) {
return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
}
total_len = 1;
ret = talloc_zero_array(ndr->current_mem_ctx, char, len+1);
if (!ret) {
return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
}
NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], len));
total_len = len;
(*string) = ret;
NDR_PULL_ALIGN(ndr, 1);
return NDR_ERR_SUCCESS;
}
enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string)
{
int total_len;
total_len = strlen(string) + 1;
if (total_len > 255) {
return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
"dns_name of length %d larger than 255", total_len);
}
NDR_CHECK(ndr_push_uint8(ndr, ndr_flags, (uint8_t)total_len));
NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len - 1));
NDR_PUSH_ALIGN(ndr, 1);
return NDR_ERR_SUCCESS;
}

View File

@ -23,3 +23,7 @@ void ndr_print_dnsp_name(struct ndr_print *ndr, const char *name,
const char *dns_name);
enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int ndr_flags, const char **name);
enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, const char *name);
void ndr_print_dnsp_string(struct ndr_print *ndr, const char *name,
const char *dns_string);
enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_flags, const char **string);
enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string);

View File

@ -76,7 +76,8 @@ my $scalar_alignment = {
'wrepl_nbt_name' => 4,
'ipv4address' => 4,
'ipv6address' => 4, #16?
'dnsp_name' => 1
'dnsp_name' => 1,
'dnsp_string' => 1
};
sub GetElementLevelTable($$)

View File

@ -931,6 +931,10 @@ sub ConvertObjectFromPythonData($$$$$$;$)
return;
}
if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "dnsp_string") {
$self->pidl("$target = PyString_AS_STRING($cvar);");
return;
}
if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "NTSTATUS") {
$self->pidl("$target = NT_STATUS(PyInt_AsLong($cvar));");
@ -1095,6 +1099,7 @@ sub ConvertScalarToPython($$$)
if ($ctypename eq "ipv4address") { return "PyString_FromString_check_null($cvar)"; }
if ($ctypename eq "ipv6address") { return "PyString_FromString_check_null($cvar)"; }
if ($ctypename eq "dnsp_name") { return "PyString_FromString_check_null($cvar)"; }
if ($ctypename eq "dnsp_string") { return "PyString_FromString_check_null($cvar)"; }
if ($ctypename eq "pointer") {
return "PyCObject_FromTallocPtr($cvar)";
}

View File

@ -59,6 +59,7 @@ my %scalars = (
"ipv4address" => "const char *",
"ipv6address" => "const char *",
"dnsp_name" => "const char *",
"dnsp_string" => "const char *",
);
my %aliases = (