r3395: added support for "string32" type, to fix the fixed width string
authorAndrew Tridgell <tridge@samba.org>
Sat, 30 Oct 2004 23:19:09 +0000 (23:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:05:05 +0000 (13:05 -0500)
problem that tim found.

source/librpc/idl/idl_types.h
source/librpc/idl/spoolss.idl
source/librpc/ndr/libndr.h
source/librpc/ndr/ndr_basic.c

index d2d32245f3fd5b371f4c0b3a51ea141ff141d20e..d74523d8fbda5e6d29eb6495e83cf9fbbf853817 100644 (file)
@@ -5,6 +5,7 @@
 #define STR_NOTERM   LIBNDR_FLAG_STR_NOTERM
 #define STR_NULLTERM LIBNDR_FLAG_STR_NULLTERM
 #define STR_BYTESIZE LIBNDR_FLAG_STR_BYTESIZE
+#define STR_FIXLEN32 LIBNDR_FLAG_STR_FIXLEN32
 
 /*
   a UCS2 string prefixed with [size] [offset] [length], all 32 bits
 */
 #define nstring       [flag(STR_NULLTERM)]                  string
 
+/*
+  fixed length 32 character UCS-2 string
+*/
+#define string32       [flag(STR_FIXLEN32)]                 string
+
 /*
   an ascii string prefixed with [size] [offset] [length], all 32 bits
   null terminated
index 85e32a98e66c9e671bb73be49c62936c66bae4ef..88f3a09db70f8c82944da1ad9f4d4cae33e64471 100644 (file)
@@ -55,7 +55,7 @@
        } spoolss_PrinterInfo0;
 
        typedef struct {
-               uint16 devicename[32];
+               string32 devicename;
                uint16 specversion;
                uint16 driverversion;
                uint16 size;
@@ -74,7 +74,7 @@
                uint16 yresolution;
                uint16 ttoption;
                uint16 collate;
-               uint16 formname[32];
+               string32 formname;
                uint16 logpixels;
                uint32 bitsperpel;
                uint32 pelswidth;
index 306e480c98b45f4125cceac3817eec09302b4751..0efa4af19cd12291a9a20306bd4a8c4166bc7d9f 100644 (file)
@@ -96,7 +96,8 @@ struct ndr_print {
 #define LIBNDR_FLAG_STR_NULLTERM (1<<6)
 #define LIBNDR_FLAG_STR_SIZE2    (1<<7)
 #define LIBNDR_FLAG_STR_BYTESIZE (1<<8)
-#define LIBNDR_STRING_FLAGS      (0x1FC)
+#define LIBNDR_FLAG_STR_FIXLEN32 (1<<9)
+#define LIBNDR_STRING_FLAGS      (0x3FC)
 
 #define LIBNDR_FLAG_REF_ALLOC    (1<<10)
 #define LIBNDR_FLAG_REMAINING    (1<<11)
index 239b28e3e776dd56d81bbf0023f5692d222b9672..19db8c99a33c91a11731326820e8a21c8f07209a 100644 (file)
@@ -673,6 +673,22 @@ NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
                *s = as;
                break;
 
+       case LIBNDR_FLAG_STR_FIXLEN32:
+               len1 = 32;
+               NDR_PULL_NEED_BYTES(ndr, len1*byte_mul);
+               ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+                                           ndr->data+ndr->offset, 
+                                           len1*byte_mul,
+                                           (void **)&as);
+               if (ret == -1) {
+                       return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+                                             "Bad character conversion");
+               }
+               NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul));
+               *s = as;
+               break;
+
+
        default:
                return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x\n",
                                      ndr->flags & LIBNDR_STRING_FLAGS);
@@ -807,6 +823,18 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s)
                ndr->offset += c_len*byte_mul;
                break;
 
+       case LIBNDR_FLAG_STR_FIXLEN32:
+               NDR_PUSH_NEED_BYTES(ndr, byte_mul*32);
+               ret = convert_string(CH_UNIX, chset, 
+                                    s, s_len + 1,
+                                    ndr->data+ndr->offset, byte_mul*32);
+               if (ret == -1) {
+                       return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
+                                             "Bad character conversion");
+               }
+               ndr->offset += byte_mul*32;
+               break;
+
        default:
                return ndr_push_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x\n",
                                      ndr->flags & LIBNDR_STRING_FLAGS);