[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-1236-gd86cb9b

Günther Deschner gd at samba.org
Wed Feb 25 20:19:17 GMT 2009


The branch, master has been updated
       via  d86cb9b52d8cdaa03f856665f56278836e6336d3 (commit)
       via  03efdcb7cb55f61d2b8cf419b25ed6d1eac1d3af (commit)
       via  820a1c1a17f3848fafd796a54e0b2eeb886aef2e (commit)
       via  6cd30a351a13822a557f20de3abe04bd8b2e3112 (commit)
       via  666cc916ebea618fbf7bfed99dbfff38326189fa (commit)
       via  a045dd063d24d004f66c3b11ca11ebf665639971 (commit)
       via  06d2604d9d1f77dddc1408233da48f0958bb24d0 (commit)
       via  b239a4ee76ec424f09a74ae65bbddeba71026141 (commit)
       via  92f05e3c96a412d50cf8733d393464acb1d702fd (commit)
       via  74232e323762abc8fbdc2a6a28c6e77b0020c304 (commit)
      from  f90250b54923588d756a02e76876fc66a6c68074 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d86cb9b52d8cdaa03f856665f56278836e6336d3
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 20:50:34 2009 +0100

    s3-rpcclient: support level 2 in spoolss_addform.
    
    Guenther

commit 03efdcb7cb55f61d2b8cf419b25ed6d1eac1d3af
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 21:08:13 2009 +0100

    s3-spoolss: make us pass the RPC-SPOOLSS torture test w.r.t. directory calls.
    
    Guenther

commit 820a1c1a17f3848fafd796a54e0b2eeb886aef2e
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 20:48:55 2009 +0100

    s3-spoolss: JOB_ACCESS_READ has moved to idl.
    
    Guenther

commit 6cd30a351a13822a557f20de3abe04bd8b2e3112
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 21:10:44 2009 +0100

    s4-smbtorture: expand RPC-SPOOLSS enumform and getform tests for level 2 forms.
    
    Guenther

commit 666cc916ebea618fbf7bfed99dbfff38326189fa
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 16:17:44 2009 +0100

    s4-smbtorture: add test_GetPrintProcessorDirectory to RPC-SPOOLSS.
    
    Guenther

commit a045dd063d24d004f66c3b11ca11ebf665639971
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 21:16:45 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit 06d2604d9d1f77dddc1408233da48f0958bb24d0
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 20:48:43 2009 +0100

    spoolss: add JOB_ACCESS_READ.
    
    Guenther

commit b239a4ee76ec424f09a74ae65bbddeba71026141
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 20:48:16 2009 +0100

    spoolss: add spoolss_AddFormInfo2.
    
    Guenther

commit 92f05e3c96a412d50cf8733d393464acb1d702fd
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 20:46:35 2009 +0100

    spoolss: fix spoolss_FormInfo2 (new in vista).
    
    keyword is an astring, not an nstring.
    
    Guenther

commit 74232e323762abc8fbdc2a6a28c6e77b0020c304
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 25 16:17:08 2009 +0100

    spoolss: windows ignores level in a spoolss_GetPrintProcessorDirectory query.
    
    Guenther

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

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c        |  236 ++++++++++++++++++++++++++++++++++-
 librpc/gen_ndr/ndr_spoolss.h        |    1 +
 librpc/gen_ndr/spoolss.h            |   17 +++-
 librpc/idl/spoolss.idl              |   21 +++-
 source3/include/rpc_spoolss.h       |    1 -
 source3/rpc_server/srv_spoolss_nt.c |   62 ++++------
 source3/rpcclient/cmd_spoolss.c     |   54 ++++++--
 source4/torture/rpc/spoolss.c       |  138 ++++++++++++++++-----
 8 files changed, 437 insertions(+), 93 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 25c9dc4..5717da9 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -11356,6 +11356,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorDirectoryInfo(struct n
 			break; }
 
 			default: {
+				NDR_CHECK(ndr_push_align(ndr, 4));
+				NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+				NDR_CHECK(ndr_push_spoolss_PrintProcessorDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
 			break; }
 
 		}
@@ -11390,6 +11393,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorDirectoryInfo(struct n
 			break; }
 
 			default: {
+				NDR_CHECK(ndr_pull_align(ndr, 4));
+				NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+				NDR_CHECK(ndr_pull_spoolss_PrintProcessorDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
 			break; }
 
 		}
@@ -11420,6 +11426,7 @@ _PUBLIC_ void ndr_print_spoolss_PrintProcessorDirectoryInfo(struct ndr_print *nd
 		break;
 
 		default:
+			ndr_print_spoolss_PrintProcessorDirectoryInfo1(ndr, "info1", &r->info1);
 		break;
 
 	}
@@ -12271,7 +12278,7 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int nd
 		NDR_CHECK(ndr_push_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
 		{
 			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
 			NDR_CHECK(ndr_push_relative_ptr1(ndr, r->keyword));
 			ndr->flags = _flags_save_string;
 		}
@@ -12303,7 +12310,7 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int nd
 		}
 		{
 			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
 			if (r->keyword) {
 				NDR_CHECK(ndr_push_relative_ptr2(ndr, r->keyword));
 				NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->keyword));
@@ -12361,7 +12368,7 @@ static enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int nd
 		NDR_CHECK(ndr_pull_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
 		{
 			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
 			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_keyword));
 			if (_ptr_keyword) {
 				NDR_PULL_ALLOC(ndr, r->keyword);
@@ -12417,7 +12424,7 @@ static enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int nd
 		}
 		{
 			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
 			if (r->keyword) {
 				uint32_t _relative_save_offset;
 				_relative_save_offset = ndr->offset;
@@ -12683,6 +12690,183 @@ _PUBLIC_ void ndr_print_spoolss_AddFormInfo1(struct ndr_print *ndr, const char *
 	ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_AddFormInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddFormInfo2 *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_push_align(ndr, 4));
+		NDR_CHECK(ndr_push_spoolss_FormFlags(ndr, NDR_SCALARS, r->flags));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->form_name));
+		NDR_CHECK(ndr_push_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
+		NDR_CHECK(ndr_push_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->keyword));
+		NDR_CHECK(ndr_push_spoolss_FormStringType(ndr, NDR_SCALARS, r->string_type));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->mui_dll));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ressource_id));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->display_name));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->lang_id));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+		if (r->form_name) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->form_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->form_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->form_name, ndr_charset_length(r->form_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		}
+		if (r->keyword) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->keyword, CH_DOS)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->keyword, CH_DOS)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->keyword, ndr_charset_length(r->keyword, CH_DOS), sizeof(uint8_t), CH_DOS));
+		}
+		if (r->mui_dll) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->mui_dll, CH_UTF16)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->mui_dll, CH_UTF16)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->mui_dll, ndr_charset_length(r->mui_dll, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		}
+		if (r->display_name) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->display_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->display_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->display_name, ndr_charset_length(r->display_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		}
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddFormInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddFormInfo2 *r)
+{
+	uint32_t _ptr_form_name;
+	TALLOC_CTX *_mem_save_form_name_0;
+	uint32_t _ptr_keyword;
+	TALLOC_CTX *_mem_save_keyword_0;
+	uint32_t _ptr_mui_dll;
+	TALLOC_CTX *_mem_save_mui_dll_0;
+	uint32_t _ptr_display_name;
+	TALLOC_CTX *_mem_save_display_name_0;
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_pull_align(ndr, 4));
+		NDR_CHECK(ndr_pull_spoolss_FormFlags(ndr, NDR_SCALARS, &r->flags));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_form_name));
+		if (_ptr_form_name) {
+			NDR_PULL_ALLOC(ndr, r->form_name);
+		} else {
+			r->form_name = NULL;
+		}
+		NDR_CHECK(ndr_pull_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
+		NDR_CHECK(ndr_pull_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_keyword));
+		if (_ptr_keyword) {
+			NDR_PULL_ALLOC(ndr, r->keyword);
+		} else {
+			r->keyword = NULL;
+		}
+		NDR_CHECK(ndr_pull_spoolss_FormStringType(ndr, NDR_SCALARS, &r->string_type));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_mui_dll));
+		if (_ptr_mui_dll) {
+			NDR_PULL_ALLOC(ndr, r->mui_dll);
+		} else {
+			r->mui_dll = NULL;
+		}
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ressource_id));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_display_name));
+		if (_ptr_display_name) {
+			NDR_PULL_ALLOC(ndr, r->display_name);
+		} else {
+			r->display_name = NULL;
+		}
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->lang_id));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+		if (r->form_name) {
+			_mem_save_form_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->form_name, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->form_name));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->form_name));
+			if (ndr_get_array_length(ndr, &r->form_name) > ndr_get_array_size(ndr, &r->form_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->form_name), ndr_get_array_length(ndr, &r->form_name));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->form_name), sizeof(uint16_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->form_name, ndr_get_array_length(ndr, &r->form_name), sizeof(uint16_t), CH_UTF16));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_form_name_0, 0);
+		}
+		if (r->keyword) {
+			_mem_save_keyword_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->keyword, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->keyword));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->keyword));
+			if (ndr_get_array_length(ndr, &r->keyword) > ndr_get_array_size(ndr, &r->keyword)) {
+				return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->keyword), ndr_get_array_length(ndr, &r->keyword));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->keyword), sizeof(uint8_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->keyword, ndr_get_array_length(ndr, &r->keyword), sizeof(uint8_t), CH_DOS));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_keyword_0, 0);
+		}
+		if (r->mui_dll) {
+			_mem_save_mui_dll_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->mui_dll, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->mui_dll));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->mui_dll));
+			if (ndr_get_array_length(ndr, &r->mui_dll) > ndr_get_array_size(ndr, &r->mui_dll)) {
+				return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->mui_dll), ndr_get_array_length(ndr, &r->mui_dll));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->mui_dll), sizeof(uint16_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->mui_dll, ndr_get_array_length(ndr, &r->mui_dll), sizeof(uint16_t), CH_UTF16));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_mui_dll_0, 0);
+		}
+		if (r->display_name) {
+			_mem_save_display_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->display_name, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->display_name));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->display_name));
+			if (ndr_get_array_length(ndr, &r->display_name) > ndr_get_array_size(ndr, &r->display_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->display_name), ndr_get_array_length(ndr, &r->display_name));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->display_name), sizeof(uint16_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->display_name, ndr_get_array_length(ndr, &r->display_name), sizeof(uint16_t), CH_UTF16));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_display_name_0, 0);
+		}
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddFormInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_AddFormInfo2 *r)
+{
+	ndr_print_struct(ndr, name, "spoolss_AddFormInfo2");
+	ndr->depth++;
+	ndr_print_spoolss_FormFlags(ndr, "flags", r->flags);
+	ndr_print_ptr(ndr, "form_name", r->form_name);
+	ndr->depth++;
+	if (r->form_name) {
+		ndr_print_string(ndr, "form_name", r->form_name);
+	}
+	ndr->depth--;
+	ndr_print_spoolss_FormSize(ndr, "size", &r->size);
+	ndr_print_spoolss_FormArea(ndr, "area", &r->area);
+	ndr_print_ptr(ndr, "keyword", r->keyword);
+	ndr->depth++;
+	if (r->keyword) {
+		ndr_print_string(ndr, "keyword", r->keyword);
+	}
+	ndr->depth--;
+	ndr_print_spoolss_FormStringType(ndr, "string_type", r->string_type);
+	ndr_print_ptr(ndr, "mui_dll", r->mui_dll);
+	ndr->depth++;
+	if (r->mui_dll) {
+		ndr_print_string(ndr, "mui_dll", r->mui_dll);
+	}
+	ndr->depth--;
+	ndr_print_uint32(ndr, "ressource_id", r->ressource_id);
+	ndr_print_ptr(ndr, "display_name", r->display_name);
+	ndr->depth++;
+	if (r->display_name) {
+		ndr_print_string(ndr, "display_name", r->display_name);
+	}
+	ndr->depth--;
+	ndr_print_uint32(ndr, "lang_id", r->lang_id);
+	ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_spoolss_AddFormInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_AddFormInfo *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
@@ -12693,6 +12877,10 @@ static enum ndr_err_code ndr_push_spoolss_AddFormInfo(struct ndr_push *ndr, int
 				NDR_CHECK(ndr_push_unique_ptr(ndr, r->info1));
 			break; }
 
+			case 2: {
+				NDR_CHECK(ndr_push_unique_ptr(ndr, r->info2));
+			break; }
+
 			default:
 				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
 		}
@@ -12706,6 +12894,12 @@ static enum ndr_err_code ndr_push_spoolss_AddFormInfo(struct ndr_push *ndr, int
 				}
 			break;
 
+			case 2:
+				if (r->info2) {
+					NDR_CHECK(ndr_push_spoolss_AddFormInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+				}
+			break;
+
 			default:
 				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
 		}
@@ -12718,6 +12912,7 @@ static enum ndr_err_code ndr_pull_spoolss_AddFormInfo(struct ndr_pull *ndr, int
 	int level;
 	uint32_t _level;
 	TALLOC_CTX *_mem_save_info1_0;
+	TALLOC_CTX *_mem_save_info2_0;
 	level = ndr_pull_get_switch_value(ndr, r);
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
@@ -12735,6 +12930,16 @@ static enum ndr_err_code ndr_pull_spoolss_AddFormInfo(struct ndr_pull *ndr, int
 				}
 			break; }
 
+			case 2: {
+				uint32_t _ptr_info2;
+				NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info2));
+				if (_ptr_info2) {
+					NDR_PULL_ALLOC(ndr, r->info2);
+				} else {
+					r->info2 = NULL;
+				}
+			break; }
+
 			default:
 				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
 		}
@@ -12750,6 +12955,15 @@ static enum ndr_err_code ndr_pull_spoolss_AddFormInfo(struct ndr_pull *ndr, int
 				}
 			break;
 
+			case 2:
+				if (r->info2) {
+					_mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
+					NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
+					NDR_CHECK(ndr_pull_spoolss_AddFormInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+					NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
+				}
+			break;
+
 			default:
 				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
 		}
@@ -12772,6 +12986,15 @@ _PUBLIC_ void ndr_print_spoolss_AddFormInfo(struct ndr_print *ndr, const char *n
 			ndr->depth--;
 		break;
 
+		case 2:
+			ndr_print_ptr(ndr, "info2", r->info2);
+			ndr->depth++;
+			if (r->info2) {
+				ndr_print_spoolss_AddFormInfo2(ndr, "info2", r->info2);
+			}
+			ndr->depth--;
+		break;
+
 		default:
 			ndr_print_bad_level(ndr, name, level);
 	}
@@ -14852,6 +15075,7 @@ _PUBLIC_ void ndr_print_spoolss_AccessRights(struct ndr_print *ndr, const char *
 	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_ACCESS_ADMINISTER", PRINTER_ACCESS_ADMINISTER, r);
 	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_ACCESS_USE", PRINTER_ACCESS_USE, r);
 	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "JOB_ACCESS_ADMINISTER", JOB_ACCESS_ADMINISTER, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "JOB_ACCESS_READ", JOB_ACCESS_READ, r);
 	ndr->depth--;
 }
 
@@ -17341,7 +17565,7 @@ static enum ndr_err_code ndr_push_spoolss_GetPrintProcessorDirectory(struct ndr_
 				struct ndr_push *_ndr_info;
 				NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
 				NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->out.info, r->in.level));
-				NDR_CHECK(ndr_push_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+				NDR_CHECK(ndr_push_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS, r->out.info));
 				NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
 			}
 		}
@@ -17435,7 +17659,7 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrintProcessorDirectory(struct ndr_
 				struct ndr_pull *_ndr_info;
 				NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
 				NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, r->out.info, r->in.level));
-				NDR_CHECK(ndr_pull_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+				NDR_CHECK(ndr_pull_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS, r->out.info));
 				NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
 			}
 			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h
index 5ecadc0..2e87754 100644
--- a/librpc/gen_ndr/ndr_spoolss.h
+++ b/librpc/gen_ndr/ndr_spoolss.h
@@ -351,6 +351,7 @@ enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int ndr_flags,
 void ndr_print_spoolss_FormInfo(struct ndr_print *ndr, const char *name, const union spoolss_FormInfo *r);
 size_t ndr_size_spoolss_FormInfo(const union spoolss_FormInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags);
 void ndr_print_spoolss_AddFormInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_AddFormInfo1 *r);
+void ndr_print_spoolss_AddFormInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_AddFormInfo2 *r);
 void ndr_print_spoolss_AddFormInfo(struct ndr_print *ndr, const char *name, const union spoolss_AddFormInfo *r);
 void ndr_print_spoolss_PortInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PortInfo1 *r);
 void ndr_print_spoolss_PortType(struct ndr_print *ndr, const char *name, uint32_t r);
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 4ecb2a7..e758153 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -970,7 +970,7 @@ struct spoolss_FormInfo2 {
 	const char * form_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 	struct spoolss_FormSize size;
 	struct spoolss_FormArea area;
-	const char * keyword;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+	const char * keyword;/* [relative,flag(LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM)] */
 	uint32_t string_type;
 	const char * mui_dll;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
 	uint32_t ressource_id;
@@ -990,8 +990,22 @@ struct spoolss_AddFormInfo1 {
 	struct spoolss_FormArea area;
 };
 
+struct spoolss_AddFormInfo2 {
+	enum spoolss_FormFlags flags;
+	const char *form_name;/* [unique,charset(UTF16)] */
+	struct spoolss_FormSize size;
+	struct spoolss_FormArea area;
+	const char *keyword;/* [unique,charset(DOS)] */
+	uint32_t string_type;
+	const char *mui_dll;/* [unique,charset(UTF16)] */
+	uint32_t ressource_id;
+	const char *display_name;/* [unique,charset(UTF16)] */
+	uint32_t lang_id;
+};
+
 union spoolss_AddFormInfo {
 	struct spoolss_AddFormInfo1 *info1;/* [unique,case] */
+	struct spoolss_AddFormInfo2 *info2;/* [unique,case(2)] */
 }/* [switch_type(uint32)] */;
 
 struct spoolss_PortInfo1 {
@@ -1248,6 +1262,7 @@ struct spoolss_UserLevelCtr {
 #define PRINTER_ACCESS_ADMINISTER ( 0x00000004 )
 #define PRINTER_ACCESS_USE ( 0x00000008 )
 #define JOB_ACCESS_ADMINISTER ( 0x00000010 )
+#define JOB_ACCESS_READ ( 0x00000020 )
 
 /* bitmap spoolss_DeleteDriverFlags */
 #define DPD_DELETE_UNUSED_FILES ( 0x00000001 )
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 5359fdf..2aebed5 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1021,7 +1021,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 
 	typedef [nodiscriminant,relative_base,gensize,public] union {
 		[case(1)] spoolss_PrintProcessorDirectoryInfo1 info1;
-		[default];
+		[default] spoolss_PrintProcessorDirectoryInfo1 info1;
 	} spoolss_PrintProcessorDirectoryInfo;
 
 	WERROR spoolss_GetPrintProcessorDirectory(
@@ -1248,7 +1248,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 		[relative] nstring *form_name;
 		spoolss_FormSize size;
 		spoolss_FormArea area;
-		[relative] nstring *keyword;
+		[relative] astring *keyword;
 		spoolss_FormStringType string_type;
 		[relative] nstring *mui_dll;
 		uint32 ressource_id;
@@ -1269,8 +1269,22 @@ import "misc.idl", "security.idl", "winreg.idl";
 		spoolss_FormArea area;
 	} spoolss_AddFormInfo1;
 
+	typedef struct {
+		spoolss_FormFlags flags;
+		[string,charset(UTF16)] uint16 *form_name;
+		spoolss_FormSize size;
+		spoolss_FormArea area;
+		[string,charset(DOS)] uint8 *keyword;
+		spoolss_FormStringType string_type;
+		[string,charset(UTF16)] uint16 *mui_dll;
+		uint32 ressource_id;
+		[string,charset(UTF16)] uint16 *display_name;
+		uint32 lang_id;
+	} spoolss_AddFormInfo2;
+
 	typedef [switch_type(uint32)] union {
 		[case(1)] spoolss_AddFormInfo1 *info1;
+		[case(2)] spoolss_AddFormInfo2 *info2;
 	} spoolss_AddFormInfo;
 
 	WERROR spoolss_AddForm(
@@ -1827,7 +1841,8 @@ import "misc.idl", "security.idl", "winreg.idl";
 		SERVER_ACCESS_ENUMERATE		= 0x00000002,
 		PRINTER_ACCESS_ADMINISTER	= 0x00000004,
 		PRINTER_ACCESS_USE		= 0x00000008,
-		JOB_ACCESS_ADMINISTER		= 0x00000010
+		JOB_ACCESS_ADMINISTER		= 0x00000010,
+		JOB_ACCESS_READ			= 0x00000020
 	} spoolss_AccessRights;
 
 	/* Access rights for print servers */
diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h
index c494fdd..1880331 100644
--- a/source3/include/rpc_spoolss.h
+++ b/source3/include/rpc_spoolss.h
@@ -123,7 +123,6 @@
 
 
 #define PRINTER_STATUS_OK               0x00000000
-#define JOB_ACCESS_READ			0x00000020
 
 /* JOB status codes. */
 
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 62301c0..2f89775 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -8180,28 +8180,21 @@ WERROR _spoolss_GetPrinterDriverDirectory(pipes_struct *p,
 		return WERR_INVALID_PARAM;
 	}
 
-	if (r->in.offered > MAX_RPC_DATA_SIZE) {
-		return WERR_INVALID_PARAM;
-	}
-
-	DEBUG(4,("_spoolss_GetPrinterDriverDirectory\n"));
+	DEBUG(5,("_spoolss_GetPrinterDriverDirectory: level %d\n",
+		r->in.level));
 
 	*r->out.needed = 0;
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list