[SCM] Samba Shared Repository - branch v3-4-test updated - release-4-0-0alpha7-738-ged058b0

Günther Deschner gd at samba.org
Mon Apr 13 14:18:18 GMT 2009


The branch, v3-4-test has been updated
       via  ed058b0cdace655b3080a06a7b2a7c717c4e21c1 (commit)
       via  d9a6162532129f28514b186dfddb502e958d2031 (commit)
       via  8cf32e47823c624ed591eabd34531e2037e2e149 (commit)
       via  2b3eff6261767b9994b9efeee6c0c8dfc174b322 (commit)
       via  d264f7d1fd9020cd85e1ae822974e87c25eff759 (commit)
       via  8e15179c5c8e30548727cbc07c8292e97600eacf (commit)
       via  227ebae3ce2ddf3f65f3aeb446352912f1d3f906 (commit)
       via  9948d33049864436bb2bb9b444822458c19156c8 (commit)
       via  9f6d54aba0d3d0e0730c17d414a5231b8a46ede7 (commit)
       via  8303246b3025e6dbda3c8f7e49ae394fd676323f (commit)
      from  f13763ca4be49c08dfc533e39dd338b508ba4709 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit ed058b0cdace655b3080a06a7b2a7c717c4e21c1
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 15:20:47 2009 +0200

    s3-spoolss: Fix permission checks for _spoolss_AddForm,SetForm and DelForm.
    
    Found by smbtorture test.
    
    Guenther
    (cherry picked from commit 3ef0b8671ddf246e32b479443ce97851a671a1a8)

commit d9a6162532129f28514b186dfddb502e958d2031
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 16:02:02 2009 +0200

    s3: re-run make samba3-idl.
    
    Guenther
    (cherry picked from commit baeee974495d1be18c61f74ce49a93cd02eac538)

commit 8cf32e47823c624ed591eabd34531e2037e2e149
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 16:01:30 2009 +0200

    spoolss: add spoolss_DriverAttributes bitmask.
    
    Guenther
    (cherry picked from commit 63b22a74f69cbc5035e8875d656041b5da975f66)

commit 2b3eff6261767b9994b9efeee6c0c8dfc174b322
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 15:42:32 2009 +0200

    s3-spoolss: use enumprinterdrivers_level() for level 3 enum.
    
    Guenther
    (cherry picked from commit 97ffd709f85ca0ecd101aac614fea19151394677)

commit d264f7d1fd9020cd85e1ae822974e87c25eff759
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 15:40:39 2009 +0200

    s3-spoolss: use enumprinterdrivers_level() for level 2 enum.
    
    Guenther
    (cherry picked from commit 9b3d3e8aebac25c55b2bcfb3daf3ba3d7df9d280)

commit 8e15179c5c8e30548727cbc07c8292e97600eacf
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 15:31:52 2009 +0200

    s3-spoolss: use enumprinterdrivers_level() for level 1 enum.
    
    Guenther
    (cherry picked from commit f325c342031d11d6133d417bdf57d918f4f10981)

commit 227ebae3ce2ddf3f65f3aeb446352912f1d3f906
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 15:27:55 2009 +0200

    s3-spoolss: add generic enumprinterdrivers_level function.
    
    Guenther
    (cherry picked from commit 0393c99302dc12f18f06db83201f096624682ea2)

commit 9948d33049864436bb2bb9b444822458c19156c8
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 14:48:32 2009 +0200

    s4-smbtorture: use printerinfo level 1 name, not description in
    test_EnumPrinters_old().
    
    Guenther
    (cherry picked from commit 81aca44d30783d1c162498a257fc47cc44a649fb)

commit 9f6d54aba0d3d0e0730c17d414a5231b8a46ede7
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 14:16:04 2009 +0200

    s3: re-run make samba3-idl.
    
    Guenther
    (cherry picked from commit 609e401b976a99ad82e37c2c3617684c8bb3e6c4)

commit 8303246b3025e6dbda3c8f7e49ae394fd676323f
Author: Günther Deschner <gd at samba.org>
Date:   Mon Apr 13 14:15:21 2009 +0200

    spoolss: fix order of strings in PrinterInfo1 structs.
    
    Guenther
    (cherry picked from commit 3918ee88701942c35dc8ed957d507076ead8d3f5)

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c        |  170 ++++++++++++++-----------
 librpc/gen_ndr/ndr_spoolss.h        |    1 +
 librpc/gen_ndr/spoolss.h            |    7 +-
 librpc/idl/spoolss.idl              |   12 +-
 source3/rpc_server/srv_spoolss_nt.c |  243 ++++++++++++-----------------------
 source4/torture/rpc/spoolss.c       |   15 ++-
 6 files changed, 206 insertions(+), 242 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index f5b161a..d4195e4 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -771,13 +771,13 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->name));
+			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->description));
 			ndr->flags = _flags_save_string;
 		}
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->description));
+			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->name));
 			ndr->flags = _flags_save_string;
 		}
 		{
@@ -791,18 +791,18 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			if (r->name) {
-				NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name));
-				NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->name));
+			if (r->description) {
+				NDR_CHECK(ndr_push_relative_ptr2(ndr, r->description));
+				NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->description));
 			}
 			ndr->flags = _flags_save_string;
 		}
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			if (r->description) {
-				NDR_CHECK(ndr_push_relative_ptr2(ndr, r->description));
-				NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->description));
+			if (r->name) {
+				NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name));
+				NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->name));
 			}
 			ndr->flags = _flags_save_string;
 		}
@@ -821,10 +821,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo1 *r)
 {
-	uint32_t _ptr_name;
-	TALLOC_CTX *_mem_save_name_0;
 	uint32_t _ptr_description;
 	TALLOC_CTX *_mem_save_description_0;
+	uint32_t _ptr_name;
+	TALLOC_CTX *_mem_save_name_0;
 	uint32_t _ptr_comment;
 	TALLOC_CTX *_mem_save_comment_0;
 	if (ndr_flags & NDR_SCALARS) {
@@ -833,24 +833,24 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
-			if (_ptr_name) {
-				NDR_PULL_ALLOC(ndr, r->name);
-				NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->name, _ptr_name));
+			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_description));
+			if (_ptr_description) {
+				NDR_PULL_ALLOC(ndr, r->description);
+				NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->description, _ptr_description));
 			} else {
-				r->name = NULL;
+				r->description = NULL;
 			}
 			ndr->flags = _flags_save_string;
 		}
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_description));
-			if (_ptr_description) {
-				NDR_PULL_ALLOC(ndr, r->description);
-				NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->description, _ptr_description));
+			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
+			if (_ptr_name) {
+				NDR_PULL_ALLOC(ndr, r->name);
+				NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->name, _ptr_name));
 			} else {
-				r->description = NULL;
+				r->name = NULL;
 			}
 			ndr->flags = _flags_save_string;
 		}
@@ -871,14 +871,14 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			if (r->name) {
+			if (r->description) {
 				uint32_t _relative_save_offset;
 				_relative_save_offset = ndr->offset;
-				NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->name));
-				_mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-				NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
-				NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->name));
-				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
+				NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->description));
+				_mem_save_description_0 = NDR_PULL_GET_MEM_CTX(ndr);
+				NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
+				NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->description));
+				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
 				ndr->offset = _relative_save_offset;
 			}
 			ndr->flags = _flags_save_string;
@@ -886,14 +886,14 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
 		{
 			uint32_t _flags_save_string = ndr->flags;
 			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-			if (r->description) {
+			if (r->name) {
 				uint32_t _relative_save_offset;
 				_relative_save_offset = ndr->offset;
-				NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->description));
-				_mem_save_description_0 = NDR_PULL_GET_MEM_CTX(ndr);
-				NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
-				NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->description));
-				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
+				NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->name));
+				_mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+				NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
+				NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->name));
+				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
 				ndr->offset = _relative_save_offset;
 			}
 			ndr->flags = _flags_save_string;
@@ -922,18 +922,18 @@ _PUBLIC_ void ndr_print_spoolss_PrinterInfo1(struct ndr_print *ndr, const char *
 	ndr_print_struct(ndr, name, "spoolss_PrinterInfo1");
 	ndr->depth++;
 	ndr_print_spoolss_EnumPrinterFlags(ndr, "flags", r->flags);
-	ndr_print_ptr(ndr, "name", r->name);
-	ndr->depth++;
-	if (r->name) {
-		ndr_print_string(ndr, "name", r->name);
-	}
-	ndr->depth--;
 	ndr_print_ptr(ndr, "description", r->description);
 	ndr->depth++;
 	if (r->description) {
 		ndr_print_string(ndr, "description", r->description);
 	}
 	ndr->depth--;
+	ndr_print_ptr(ndr, "name", r->name);
+	ndr->depth++;
+	if (r->name) {
+		ndr_print_string(ndr, "name", r->name);
+	}
+	ndr->depth--;
 	ndr_print_ptr(ndr, "comment", r->comment);
 	ndr->depth++;
 	if (r->comment) {
@@ -5960,23 +5960,23 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo1(struct ndr_push *ndr,
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_push_align(ndr, 4));
 		NDR_CHECK(ndr_push_spoolss_EnumPrinterFlags(ndr, NDR_SCALARS, r->flags));
-		NDR_CHECK(ndr_push_unique_ptr(ndr, r->name));
 		NDR_CHECK(ndr_push_unique_ptr(ndr, r->description));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->name));
 		NDR_CHECK(ndr_push_unique_ptr(ndr, r->comment));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		if (r->name) {
-			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
-			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
-			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->name, ndr_charset_length(r->name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-		}
 		if (r->description) {
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->description, CH_UTF16)));
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->description, CH_UTF16)));
 			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->description, ndr_charset_length(r->description, CH_UTF16), sizeof(uint16_t), CH_UTF16));
 		}
+		if (r->name) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->name, ndr_charset_length(r->name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		}
 		if (r->comment) {
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->comment, CH_UTF16)));
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
@@ -5989,27 +5989,27 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo1(struct ndr_push *ndr,
 
 static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo1 *r)
 {
-	uint32_t _ptr_name;
-	TALLOC_CTX *_mem_save_name_0;
 	uint32_t _ptr_description;
 	TALLOC_CTX *_mem_save_description_0;
+	uint32_t _ptr_name;
+	TALLOC_CTX *_mem_save_name_0;
 	uint32_t _ptr_comment;
 	TALLOC_CTX *_mem_save_comment_0;
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_pull_align(ndr, 4));
 		NDR_CHECK(ndr_pull_spoolss_EnumPrinterFlags(ndr, NDR_SCALARS, &r->flags));
-		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
-		if (_ptr_name) {
-			NDR_PULL_ALLOC(ndr, r->name);
-		} else {
-			r->name = NULL;
-		}
 		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_description));
 		if (_ptr_description) {
 			NDR_PULL_ALLOC(ndr, r->description);
 		} else {
 			r->description = NULL;
 		}
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
+		if (_ptr_name) {
+			NDR_PULL_ALLOC(ndr, r->name);
+		} else {
+			r->name = NULL;
+		}
 		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_comment));
 		if (_ptr_comment) {
 			NDR_PULL_ALLOC(ndr, r->comment);
@@ -6018,18 +6018,6 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo1(struct ndr_pull *ndr,
 		}
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		if (r->name) {
-			_mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-			NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
-			NDR_CHECK(ndr_pull_array_size(ndr, &r->name));
-			NDR_CHECK(ndr_pull_array_length(ndr, &r->name));
-			if (ndr_get_array_length(ndr, &r->name) > ndr_get_array_size(ndr, &r->name)) {
-				return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->name), ndr_get_array_length(ndr, &r->name));
-			}
-			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t)));
-			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->name, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t), CH_UTF16));
-			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
-		}
 		if (r->description) {
 			_mem_save_description_0 = NDR_PULL_GET_MEM_CTX(ndr);
 			NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
@@ -6042,6 +6030,18 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo1(struct ndr_pull *ndr,
 			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->description, ndr_get_array_length(ndr, &r->description), sizeof(uint16_t), CH_UTF16));
 			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
 		}
+		if (r->name) {
+			_mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->name));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->name));
+			if (ndr_get_array_length(ndr, &r->name) > ndr_get_array_size(ndr, &r->name)) {
+				return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->name), ndr_get_array_length(ndr, &r->name));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->name, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t), CH_UTF16));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
+		}
 		if (r->comment) {
 			_mem_save_comment_0 = NDR_PULL_GET_MEM_CTX(ndr);
 			NDR_PULL_SET_MEM_CTX(ndr, r->comment, 0);
@@ -6063,18 +6063,18 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo1(struct ndr_print *ndr, const cha
 	ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo1");
 	ndr->depth++;
 	ndr_print_spoolss_EnumPrinterFlags(ndr, "flags", r->flags);
-	ndr_print_ptr(ndr, "name", r->name);
-	ndr->depth++;
-	if (r->name) {
-		ndr_print_string(ndr, "name", r->name);
-	}
-	ndr->depth--;
 	ndr_print_ptr(ndr, "description", r->description);
 	ndr->depth++;
 	if (r->description) {
 		ndr_print_string(ndr, "description", r->description);
 	}
 	ndr->depth--;
+	ndr_print_ptr(ndr, "name", r->name);
+	ndr->depth++;
+	if (r->name) {
+		ndr_print_string(ndr, "name", r->name);
+	}
+	ndr->depth--;
 	ndr_print_ptr(ndr, "comment", r->comment);
 	ndr->depth++;
 	if (r->comment) {
@@ -8372,6 +8372,28 @@ _PUBLIC_ void ndr_print_spoolss_AddDriverInfo4(struct ndr_print *ndr, const char
 	ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_DriverAttributes(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+	NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_DriverAttributes(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+	uint32_t v;
+	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+	*r = v;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverAttributes(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+	ndr_print_uint32(ndr, name, r);
+	ndr->depth++;
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_DRIVER_PACKAGE_AWARE", PRINTER_DRIVER_PACKAGE_AWARE, r);
+	ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_spoolss_AddDriverInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo6 *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
@@ -11255,7 +11277,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
 			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
 			ndr->flags = _flags_save_string;
 		}
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_attributes));
+		NDR_CHECK(ndr_push_spoolss_DriverAttributes(ndr, NDR_SCALARS, r->driver_attributes));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->config_version));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_version));
 	}
@@ -11384,7 +11406,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
 			}
 			ndr->flags = _flags_save_string;
 		}
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_attributes));
+		NDR_CHECK(ndr_pull_spoolss_DriverAttributes(ndr, NDR_SCALARS, &r->driver_attributes));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->config_version));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_version));
 	}
@@ -11503,7 +11525,7 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo5(struct ndr_print *ndr, const char *n
 		ndr_print_string(ndr, "config_file", r->config_file);
 	}
 	ndr->depth--;
-	ndr_print_uint32(ndr, "driver_attributes", r->driver_attributes);
+	ndr_print_spoolss_DriverAttributes(ndr, "driver_attributes", r->driver_attributes);
 	ndr_print_uint32(ndr, "config_version", r->config_version);
 	ndr_print_uint32(ndr, "driver_version", r->driver_version);
 	ndr->depth--;
diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h
index 0feb4a2..204aad8 100644
--- a/librpc/gen_ndr/ndr_spoolss.h
+++ b/librpc/gen_ndr/ndr_spoolss.h
@@ -310,6 +310,7 @@ void ndr_print_spoolss_DriverOSVersion(struct ndr_print *ndr, const char *name,
 void ndr_print_spoolss_AddDriverInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo2 *r);
 void ndr_print_spoolss_AddDriverInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo3 *r);
 void ndr_print_spoolss_AddDriverInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo4 *r);
+void ndr_print_spoolss_DriverAttributes(struct ndr_print *ndr, const char *name, uint32_t r);
 void ndr_print_spoolss_AddDriverInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo6 *r);
 void ndr_print_spoolss_AddDriverInfo8(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo8 *r);
 void ndr_print_spoolss_AddDriverInfo(struct ndr_print *ndr, const char *name, const union spoolss_AddDriverInfo *r);
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 8340b34..abd8300 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -290,8 +290,8 @@ struct spoolss_DeviceMode {
 
 struct spoolss_PrinterInfo1 {
 	uint32_t flags;
-	const char * name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 	const char * description;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+	const char * name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 	const char * comment;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 }/* [gensize,public] */;
 
@@ -636,8 +636,8 @@ struct spoolss_SetPrinterInfo0 {
 
 struct spoolss_SetPrinterInfo1 {
 	uint32_t flags;
-	const char *name;/* [unique,charset(UTF16)] */
 	const char *description;/* [unique,charset(UTF16)] */
+	const char *name;/* [unique,charset(UTF16)] */
 	const char *comment;/* [unique,charset(UTF16)] */
 };
 
@@ -775,6 +775,9 @@ struct spoolss_AddDriverInfo4 {
 	struct spoolss_StringArray *previous_names;/* [unique] */
 };
 
+/* bitmap spoolss_DriverAttributes */
+#define PRINTER_DRIVER_PACKAGE_AWARE ( 0x00000002 )
+
 struct spoolss_AddDriverInfo5 {
 	enum spoolss_DriverOSVersion version;
 	const char *driver_name;/* [unique,charset(UTF16)] */
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index a1bb95a..5b9f551 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -250,8 +250,8 @@ import "misc.idl", "security.idl", "winreg.idl";
 
 	typedef [public,gensize] struct {
 		spoolss_EnumPrinterFlags flags;
-		[relative] nstring *name;
 		[relative] nstring *description;
+		[relative] nstring *name;
 		[relative] nstring *comment;
 	} spoolss_PrinterInfo1;
 
@@ -684,8 +684,8 @@ import "misc.idl", "security.idl", "winreg.idl";
 
 	typedef struct {
 		spoolss_EnumPrinterFlags flags;
-		[string,charset(UTF16)] uint16 *name;
 		[string,charset(UTF16)] uint16 *description;
+		[string,charset(UTF16)] uint16 *name;
 		[string,charset(UTF16)] uint16 *comment;
 	} spoolss_SetPrinterInfo1;
 
@@ -836,6 +836,10 @@ import "misc.idl", "security.idl", "winreg.idl";
 		spoolss_StringArray *previous_names;
 	} spoolss_AddDriverInfo4;
 
+	typedef [bitmap32bit] bitmap {
+		PRINTER_DRIVER_PACKAGE_AWARE = 0x00000002
+	} spoolss_DriverAttributes;
+
 	typedef struct {
 		spoolss_DriverOSVersion version;
 		[string,charset(UTF16)] uint16 *driver_name;
@@ -843,7 +847,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 		[string,charset(UTF16)] uint16 *driver_path;
 		[string,charset(UTF16)] uint16 *data_file;
 		[string,charset(UTF16)] uint16 *config_file;
-		uint32 driver_attributes;
+		spoolss_DriverAttributes driver_attributes;
 		uint32 config_version;
 		uint32 driver_version;
 	} spoolss_AddDriverInfo5;
@@ -968,7 +972,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 		[relative] nstring *driver_path;
 		[relative] nstring *data_file;
 		[relative] nstring *config_file;
-		uint32 driver_attributes;
+		spoolss_DriverAttributes driver_attributes;
 		uint32 config_version;
 		uint32 driver_version;
 	} spoolss_DriverInfo5;
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 718f69f..3edfca9 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -6609,14 +6609,15 @@ WERROR _spoolss_SetJob(pipes_struct *p,
 }
 
 /****************************************************************************
- Enumerates all printer drivers at level 1.
+ Enumerates all printer drivers by level.
 ****************************************************************************/
 
-static WERROR enumprinterdrivers_level1(TALLOC_CTX *mem_ctx,
-					const char *servername,
-					const char *architecture,
-					union spoolss_DriverInfo **info_p,
-					uint32_t *count)
+static WERROR enumprinterdrivers_level(TALLOC_CTX *mem_ctx,
+				       const char *servername,
+				       const char *architecture,
+				       uint32_t level,
+				       union spoolss_DriverInfo **info_p,
+				       uint32_t *count_p)
 {
 	int i;
 	int ndrivers;
@@ -6624,9 +6625,11 @@ static WERROR enumprinterdrivers_level1(TALLOC_CTX *mem_ctx,
 	fstring *list = NULL;
 	NT_PRINTER_DRIVER_INFO_LEVEL driver;
 	union spoolss_DriverInfo *info = NULL;
+	uint32_t count = 0;
 	WERROR result = WERR_OK;
 
-	*count = 0;
+	*count_p = 0;
+	*info_p = NULL;
 
 	for (version=0; version<DRIVER_MAX_VERSION; version++) {
 		list = NULL;
@@ -6642,7 +6645,7 @@ static WERROR enumprinterdrivers_level1(TALLOC_CTX *mem_ctx,
 		if (ndrivers != 0) {
 			info = TALLOC_REALLOC_ARRAY(mem_ctx, info,
 						    union spoolss_DriverInfo,
-						    *count + ndrivers);
+						    count + ndrivers);
 			if (!info) {
 				DEBUG(0,("enumprinterdrivers_level1: "
 					"failed to enlarge driver info buffer!\n"));
@@ -6659,9 +6662,26 @@ static WERROR enumprinterdrivers_level1(TALLOC_CTX *mem_ctx,
 			if (!W_ERROR_IS_OK(result)) {
 				goto out;
 			}
-			result = fill_printer_driver_info1(info, &info[*count+i].info1,
-							   &driver, servername,
-							   architecture);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list