ndr: Implement push function for IPv6 addresses
authorKai Blin <kai@samba.org>
Wed, 29 Sep 2010 03:33:54 +0000 (20:33 -0700)
committerKai Blin <kai@samba.org>
Mon, 4 Oct 2010 18:59:59 +0000 (20:59 +0200)
Thanks to Julien Kerihuel for providing the patch that pushed me to
finish my own IPv6 patches.

librpc/ndr/libndr.h
librpc/ndr/ndr_basic.c
pidl/lib/Parse/Pidl/Samba4/Python.pm

index 93d95cf398f4ce65c7df30556e3d8a4685beec99..c110b76ae55f9e5333fe42fbe1626f1eab95ba40 100644 (file)
@@ -189,6 +189,7 @@ enum ndr_err_code {
        NDR_ERR_RANGE,
        NDR_ERR_TOKEN,
        NDR_ERR_IPV4ADDRESS,
+       NDR_ERR_IPV6ADDRESS,
        NDR_ERR_INVALID_POINTER,
        NDR_ERR_UNREAD_BYTES,
        NDR_ERR_NDR64
index aa49898dd03937c7f804c915c9a496f693ab4fcb..31a8b9de6dc5fcfb5c4dfe66021268df8e154171 100644 (file)
@@ -876,14 +876,21 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ipv6address(struct ndr_pull *ndr, int ndr_fl
 */
 _PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, int ndr_flags, const char *address)
 {
-       uint32_t addr;
+       uint8_t addr[IPV6_BYTES];
+       int ret;
+
        if (!is_ipaddress(address)) {
-               return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
+               return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS,
                                      "Invalid IPv6 address: '%s'",
                                      address);
        }
-       addr = inet_addr(address);
-       NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
+       ret = inet_pton(AF_INET6, address, addr);
+       if (ret <= 0) {
+               return NDR_ERR_IPV6ADDRESS;
+       }
+
+       NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
+
        return NDR_ERR_SUCCESS;
 }
 
index b494ec9b98baece83b2f0ca4624c020aadebd82b..3318229f0e2d62329f397e945d758b37062f9688 100644 (file)
@@ -921,6 +921,11 @@ sub ConvertObjectFromPythonData($$$$$$;$)
                return;
        }
 
+       if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "ipv6address") {
+               $self->pidl("$target = PyString_AsString($cvar);");
+               return;
+       }
+
        if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "dnsp_name") {
                $self->pidl("$target = PyString_AS_STRING($cvar);");
                return;
@@ -1088,6 +1093,7 @@ sub ConvertScalarToPython($$$)
        # Not yet supported
        if ($ctypename eq "string_array") { return "PyCObject_FromTallocPtr($cvar)"; }
        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 "pointer") {
                return "PyCObject_FromTallocPtr($cvar)";