dnsp: Parse TXT records
authorKai Blin <kai@samba.org>
Fri, 13 Aug 2010 09:09:09 +0000 (11:09 +0200)
committerKai Blin <kai@samba.org>
Mon, 4 Oct 2010 18:59:59 +0000 (20:59 +0200)
librpc/idl/dnsp.idl
librpc/ndr/ndr_dnsp.c
librpc/ndr/ndr_dnsp.h
pidl/lib/Parse/Pidl/NDR.pm
pidl/lib/Parse/Pidl/Samba4/Python.pm
pidl/lib/Parse/Pidl/Typelist.pm

index a4a175aea4290181bd54fe2dc5feec14787818e3..af904d09c119e2126948d2084e4a7d036ad563c3 100644 (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;
index f777591f259436b6a7a0a7ce69ef841a7dea5667..256638aed3399e585aec6f44fd451cc1c28bfddf 100644 (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;
+}
index 07952cb8ce925611807d95a6a41c9c5f56a26d6e..67f952ccb389dbbb6c5ffa4fccff1d95e9122c89 100644 (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);
index 4961cda99e56aaef7b939f4600dc4d067b9b8b21..b5dd2aaf9cdc969129f032d1285ccdb942d4ac6f 100644 (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($$)
index 3318229f0e2d62329f397e945d758b37062f9688..cf554f5c0cf3d97f361fd61d4cba75cd3cade26b 100644 (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)";
        }
index b841e622094d11572c94f291f9a640b1bf8c8f8f..00204a3cfc0b3a4eef5a1b08adf5b66eee6ed8fe 100644 (file)
@@ -59,6 +59,7 @@ my %scalars = (
        "ipv4address"   => "const char *",
        "ipv6address"   => "const char *",
        "dnsp_name"     => "const char *",
+       "dnsp_string"   => "const char *",
 );
 
 my %aliases = (