summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/ndr_header.pm2
-rw-r--r--source4/build/pidl/typelist.pm4
-rw-r--r--source4/librpc/idl/idl_types.h5
-rw-r--r--source4/librpc/idl/spoolss.idl10
-rw-r--r--source4/librpc/ndr/ndr_string.c72
5 files changed, 87 insertions, 6 deletions
diff --git a/source4/build/pidl/ndr_header.pm b/source4/build/pidl/ndr_header.pm
index ddd4fa1eb3..f40810a84d 100644
--- a/source4/build/pidl/ndr_header.pm
+++ b/source4/build/pidl/ndr_header.pm
@@ -60,7 +60,7 @@ sub HeaderElement($)
pidl tabs();
HeaderType($element, $element->{TYPE}, "");
pidl " ";
- if ($element->{POINTERS} && $element->{TYPE} ne "string") {
+ if ($element->{POINTERS} && not $element->{TYPE} =~ "string") {
for (my($i)=$element->{POINTERS}; $i > 0; $i--) {
pidl "*";
}
diff --git a/source4/build/pidl/typelist.pm b/source4/build/pidl/typelist.pm
index d9d545f060..9045e86bfd 100644
--- a/source4/build/pidl/typelist.pm
+++ b/source4/build/pidl/typelist.pm
@@ -86,6 +86,10 @@ my $scalars = {
C_TYPE => "const char *",
NDR_ALIGN => 4 #???
},
+ "string_array" => {
+ C_TYPE => "const char **",
+ NDR_ALIGN => 4 #???
+ },
# time types
"time_t" => {
diff --git a/source4/librpc/idl/idl_types.h b/source4/librpc/idl/idl_types.h
index 65489100af..024b5632d3 100644
--- a/source4/librpc/idl/idl_types.h
+++ b/source4/librpc/idl/idl_types.h
@@ -81,6 +81,11 @@
*/
#define utf8string [flag(STR_UTF8|STR_NULLTERM)] string
+/*
+ a null terminated UCS2 string
+*/
+#define nstring_array [flag(STR_NULLTERM)] string_array
+
#define NDR_NOALIGN LIBNDR_FLAG_NOALIGN
#define NDR_REMAINING LIBNDR_FLAG_REMAINING
#define NDR_ALIGN2 LIBNDR_FLAG_ALIGN2
diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl
index 5d909b4bed..5d4e957f07 100644
--- a/source4/librpc/idl/spoolss.idl
+++ b/source4/librpc/idl/spoolss.idl
@@ -409,7 +409,7 @@
[relative] nstring *data_file;
[relative] nstring *config_file;
[relative] nstring *help_file;
- [relative] nstring *dependent_files; /* array */
+ [relative] nstring_array *dependent_files;
[relative] nstring *monitor_name;
[relative] nstring *default_datatype;
} spoolss_DriverInfo3;
@@ -422,10 +422,10 @@
[relative] nstring *data_file;
[relative] nstring *config_file;
[relative] nstring *help_file;
- [relative] nstring *dependent_files; /* array */
+ [relative] nstring_array *dependent_files;
[relative] nstring *monitor_name;
[relative] nstring *default_datatype;
- [relative] nstring *previous_names; /* array */
+ [relative] nstring_array *previous_names;
} spoolss_DriverInfo4;
typedef struct {
@@ -448,10 +448,10 @@
[relative] nstring *data_file;
[relative] nstring *config_file;
[relative] nstring *help_file;
- [relative] nstring *dependent_files; /* array */
+ [relative] nstring_array *dependent_files;
[relative] nstring *monitor_name;
[relative] nstring *default_datatype;
- [relative] nstring *previous_names; /* array */
+ [relative] nstring_array *previous_names;
NTTIME driver_data;
hyper driver_version;
[relative] nstring *manufacturer_name;
diff --git a/source4/librpc/ndr/ndr_string.c b/source4/librpc/ndr/ndr_string.c
index ee76508393..aa612eca38 100644
--- a/source4/librpc/ndr/ndr_string.c
+++ b/source4/librpc/ndr/ndr_string.c
@@ -497,3 +497,75 @@ uint32_t ndr_size_string(int ret, const char * const* string, int flags)
if(!(*string)) return ret;
return ret+strlen(*string)+1;
}
+
+/*
+ pull a general string array from the wire
+*/
+NTSTATUS ndr_pull_string_array(struct ndr_pull *ndr, int ndr_flags, const char ***_a)
+{
+ const char **a = *_a;
+ uint32_t count;
+
+ if (!(ndr_flags & NDR_SCALARS)) {
+ return NT_STATUS_OK;
+ }
+
+ for (count = 0;; count++) {
+ const char *s = NULL;
+ a = talloc_realloc(ndr, a, const char *, count + 2);
+ NT_STATUS_HAVE_NO_MEMORY(a);
+ a[count] = NULL;
+ a[count+1] = NULL;
+
+ NDR_CHECK(ndr_pull_string(ndr, ndr_flags, &s));
+ if (strcmp("", s)==0) {
+ a[count] = NULL;
+ break;
+ } else {
+ a[count] = s;
+ }
+ }
+
+ *_a =a;
+ return NT_STATUS_OK;
+}
+
+/*
+ push a general string array onto the wire
+*/
+NTSTATUS ndr_push_string_array(struct ndr_push *ndr, int ndr_flags, const char **a)
+{
+ uint32_t count;
+
+ if (!(ndr_flags & NDR_SCALARS)) {
+ return NT_STATUS_OK;
+ }
+
+ for (count = 0; a && a[count]; count++) {
+ NDR_CHECK(ndr_push_string(ndr, ndr_flags, a[count]));
+ }
+
+ NDR_CHECK(ndr_push_string(ndr, ndr_flags, ""));
+
+ return NT_STATUS_OK;
+}
+
+void ndr_print_string_array(struct ndr_print *ndr, const char *name, const char **a)
+{
+ uint32_t count;
+ uint32_t i;
+
+ for (count = 0; a && a[count]; count++) {}
+
+ ndr->print(ndr, "%s: ARRAY(%d)", name, count);
+ ndr->depth++;
+ for (i=0;i<count;i++) {
+ char *idx=NULL;
+ asprintf(&idx, "[%d]", i);
+ if (idx) {
+ ndr_print_string(ndr, idx, a[i]);
+ free(idx);
+ }
+ }
+ ndr->depth--;
+}