misc: mark winreg_Data little-endian except for a REG_DWORD_BIG_ENDIAN.
authorGünther Deschner <gd@samba.org>
Fri, 27 Nov 2009 10:18:30 +0000 (11:18 +0100)
committerKarolin Seeger <kseeger@samba.org>
Mon, 30 Nov 2009 15:09:36 +0000 (16:09 +0100)
Guenther

librpc/gen_ndr/misc.h
librpc/gen_ndr/ndr_misc.c
librpc/idl/misc.idl

index 8d7ae55ad73e31bd5131a9df1a5ca1db00aadaa5..e3851ce47ef10adf53d69ff06f5c26b69e0238d2 100644 (file)
@@ -89,6 +89,6 @@ union winreg_Data {
        uint32_t value;/* [case(REG_DWORD)] */
        const char ** string_array;/* [flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_MULTI_SZ)] */
        DATA_BLOB data;/* [flag(LIBNDR_FLAG_REMAINING),default] */
-}/* [nodiscriminant,public] */;
+}/* [public,nodiscriminant,flag(LIBNDR_FLAG_LITTLE_ENDIAN)] */;
 
 #endif /* _HEADER_misc */
index a5563d4298563830bbe83a750b31d632f3b73c3f..45872d62027d23459d4b79467302148407e737ba 100644 (file)
@@ -205,76 +205,105 @@ _PUBLIC_ void ndr_print_winreg_Type(struct ndr_print *ndr, const char *name, enu
 
 _PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_flags, const union winreg_Data *r)
 {
-       if (ndr_flags & NDR_SCALARS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               switch (level) {
-                       case REG_NONE: {
-                       break; }
-
-                       case REG_SZ: {
-                               {
-                                       uint32_t _flags_save_string = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string));
-                                       ndr->flags = _flags_save_string;
-                               }
-                       break; }
-
-                       case REG_BINARY: {
-                               {
-                                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
-                                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->binary));
-                                       ndr->flags = _flags_save_DATA_BLOB;
-                               }
-                       break; }
-
-                       case REG_DWORD: {
-                               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value));
-                       break; }
-
-                       case REG_MULTI_SZ: {
-                               {
-                                       uint32_t _flags_save_string_array = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                                       NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
-                                       ndr->flags = _flags_save_string_array;
-                               }
-                       break; }
-
-                       default: {
-                               {
-                                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
-                                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->data));
-                                       ndr->flags = _flags_save_DATA_BLOB;
-                               }
-                       break; }
-
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       switch (level) {
+                               case REG_NONE: {
+                               break; }
+
+                               case REG_SZ: {
+                                       {
+                                               uint32_t _flags_save_string = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string));
+                                               ndr->flags = _flags_save_string;
+                                       }
+                               break; }
+
+                               case REG_EXPAND_SZ: {
+                                       {
+                                               uint32_t _flags_save_string = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string));
+                                               ndr->flags = _flags_save_string;
+                                       }
+                               break; }
+
+                               case REG_BINARY: {
+                                       {
+                                               uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
+                                               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->binary));
+                                               ndr->flags = _flags_save_DATA_BLOB;
+                                       }
+                               break; }
+
+                               case REG_DWORD: {
+                                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value));
+                               break; }
+
+                               case REG_DWORD_BIG_ENDIAN: {
+                                       {
+                                               uint32_t _flags_save_uint32 = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
+                                               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value));
+                                               ndr->flags = _flags_save_uint32;
+                                       }
+                               break; }
+
+                               case REG_MULTI_SZ: {
+                                       {
+                                               uint32_t _flags_save_string_array = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
+                                               ndr->flags = _flags_save_string_array;
+                                       }
+                               break; }
+
+                               default: {
+                                       {
+                                               uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
+                                               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->data));
+                                               ndr->flags = _flags_save_DATA_BLOB;
+                                       }
+                               break; }
+
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               switch (level) {
-                       case REG_NONE:
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       switch (level) {
+                               case REG_NONE:
+                               break;
 
-                       case REG_SZ:
-                       break;
+                               case REG_SZ:
+                               break;
 
-                       case REG_BINARY:
-                       break;
+                               case REG_EXPAND_SZ:
+                               break;
 
-                       case REG_DWORD:
-                       break;
+                               case REG_BINARY:
+                               break;
 
-                       case REG_MULTI_SZ:
-                       break;
+                               case REG_DWORD:
+                               break;
 
-                       default:
-                       break;
+                               case REG_DWORD_BIG_ENDIAN:
+                               break;
 
+                               case REG_MULTI_SZ:
+                               break;
+
+                               default:
+                               break;
+
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        return NDR_ERR_SUCCESS;
 }
@@ -282,108 +311,150 @@ _PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_fl
 _PUBLIC_ enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int ndr_flags, union winreg_Data *r)
 {
        int level;
-       level = ndr_pull_get_switch_value(ndr, r);
-       if (ndr_flags & NDR_SCALARS) {
-               switch (level) {
-                       case REG_NONE: {
-                       break; }
-
-                       case REG_SZ: {
-                               {
-                                       uint32_t _flags_save_string = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string));
-                                       ndr->flags = _flags_save_string;
-                               }
-                       break; }
-
-                       case REG_BINARY: {
-                               {
-                                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
-                                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->binary));
-                                       ndr->flags = _flags_save_DATA_BLOB;
-                               }
-                       break; }
-
-                       case REG_DWORD: {
-                               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value));
-                       break; }
-
-                       case REG_MULTI_SZ: {
-                               {
-                                       uint32_t _flags_save_string_array = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                                       NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
-                                       ndr->flags = _flags_save_string_array;
-                               }
-                       break; }
-
-                       default: {
-                               {
-                                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
-                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
-                                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->data));
-                                       ndr->flags = _flags_save_DATA_BLOB;
-                               }
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       switch (level) {
+                               case REG_NONE: {
+                               break; }
+
+                               case REG_SZ: {
+                                       {
+                                               uint32_t _flags_save_string = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string));
+                                               ndr->flags = _flags_save_string;
+                                       }
+                               break; }
+
+                               case REG_EXPAND_SZ: {
+                                       {
+                                               uint32_t _flags_save_string = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string));
+                                               ndr->flags = _flags_save_string;
+                                       }
+                               break; }
+
+                               case REG_BINARY: {
+                                       {
+                                               uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
+                                               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->binary));
+                                               ndr->flags = _flags_save_DATA_BLOB;
+                                       }
+                               break; }
+
+                               case REG_DWORD: {
+                                       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value));
+                               break; }
+
+                               case REG_DWORD_BIG_ENDIAN: {
+                                       {
+                                               uint32_t _flags_save_uint32 = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
+                                               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value));
+                                               ndr->flags = _flags_save_uint32;
+                                       }
+                               break; }
+
+                               case REG_MULTI_SZ: {
+                                       {
+                                               uint32_t _flags_save_string_array = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
+                                               ndr->flags = _flags_save_string_array;
+                                       }
+                               break; }
+
+                               default: {
+                                       {
+                                               uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                                               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
+                                               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->data));
+                                               ndr->flags = _flags_save_DATA_BLOB;
+                                       }
+                               break; }
+
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       switch (level) {
+                               case REG_NONE:
+                               break;
+
+                               case REG_SZ:
+                               break;
+
+                               case REG_EXPAND_SZ:
+                               break;
+
+                               case REG_BINARY:
+                               break;
+
+                               case REG_DWORD:
+                               break;
 
+                               case REG_DWORD_BIG_ENDIAN:
+                               break;
+
+                               case REG_MULTI_SZ:
+                               break;
+
+                               default:
+                               break;
+
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
-       if (ndr_flags & NDR_BUFFERS) {
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name, const union winreg_Data *r)
+{
+       int level;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "winreg_Data");
                switch (level) {
                        case REG_NONE:
                        break;
 
                        case REG_SZ:
+                               ndr_print_string(ndr, "string", r->string);
+                       break;
+
+                       case REG_EXPAND_SZ:
+                               ndr_print_string(ndr, "string", r->string);
                        break;
 
                        case REG_BINARY:
+                               ndr_print_DATA_BLOB(ndr, "binary", r->binary);
                        break;
 
                        case REG_DWORD:
+                               ndr_print_uint32(ndr, "value", r->value);
+                       break;
+
+                       case REG_DWORD_BIG_ENDIAN:
+                               ndr_print_uint32(ndr, "value", r->value);
                        break;
 
                        case REG_MULTI_SZ:
+                               ndr_print_string_array(ndr, "string_array", r->string_array);
                        break;
 
                        default:
+                               ndr_print_DATA_BLOB(ndr, "data", r->data);
                        break;
 
                }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name, const union winreg_Data *r)
-{
-       int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "winreg_Data");
-       switch (level) {
-               case REG_NONE:
-               break;
-
-               case REG_SZ:
-                       ndr_print_string(ndr, "string", r->string);
-               break;
-
-               case REG_BINARY:
-                       ndr_print_DATA_BLOB(ndr, "binary", r->binary);
-               break;
-
-               case REG_DWORD:
-                       ndr_print_uint32(ndr, "value", r->value);
-               break;
-
-               case REG_MULTI_SZ:
-                       ndr_print_string_array(ndr, "string_array", r->string_array);
-               break;
-
-               default:
-                       ndr_print_DATA_BLOB(ndr, "data", r->data);
-               break;
-
+               ndr->flags = _flags_save_UNION;
        }
 }
 
index d00c2fcd27652b9951de0db148309a3ee168651c..4a53872e39befcae03c498abf3bb2483906a66da 100644 (file)
@@ -59,11 +59,13 @@ interface misc
                REG_QWORD                      = 11
        } winreg_Type;
 
-       typedef [nodiscriminant,public] union {
+       typedef [nodiscriminant,public,flag(NDR_LITTLE_ENDIAN)] union {
                [case(REG_NONE)];
                [case(REG_SZ)] nstring string;
+               [case(REG_EXPAND_SZ)] nstring string;
                [case(REG_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary;
                [case(REG_DWORD)] uint32 value;
+               [case(REG_DWORD_BIG_ENDIAN),flag(NDR_BIG_ENDIAN)] uint32 value;
                [case(REG_MULTI_SZ)] nstring_array string_array;
                [default,flag(NDR_REMAINING)] DATA_BLOB data;
        } winreg_Data;