[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Thu Jan 9 01:16:03 UTC 2020


The branch, master has been updated
       via  17e692a9fa6 s3-rpcclient: add clusapi_resume_node command.
       via  c9077f16283 s3-rpcclient: add clusapi_pause_node command.
       via  94157af2610 s3-rpcclient: give slightly better descriptions to clusapi commands
       via  c433dac5981 librpc: pidlify spoolss_EnumPerMachineConnections
       via  c9bebbcc464 librpc/ndr: provide infrastructure for NDR_SPOOLSS_{PUSH|PULL}_ENUM macros
       via  1038613878b librpc: better naming for NDR_SPOOLSS_{PUSH|PULL}_ENUM variants
       via  210a8f35b66 s4-torture: add test for spoolss_EnumPerMachineConnections
       via  0a76a7c3c25 s4-torture: add test for spoolss AddPerMachineConnection
       via  d642c9a2a8d s3-rpcclient: add delpermachineconnection command
       via  d3c2833f1bb s3-rpcclient: add addpermachineconnection command
       via  ce00972afc2 s3-rpcclient: add enumpermachineconnections command
       via  a340aecdd02 s3-rpcclient: properly check and initialize buffers in getdriverpackagepath
       via  479cf553970 librpc: add IDL for spoolss_EnumPerMachineConnections
       via  8ceddba1f3b s3-rpcclient: add cmd_spoolss_get_core_printer_drivers
       via  e17c8e1b405 librpc: fix IDL for spoolss_GetCorePrinterDrivers()
      from  ba53e284e68 s3: lib: dbwrap: Set rec->value_valid to avoid backtrace in `smbstatus`

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


- Log -----------------------------------------------------------------
commit 17e692a9fa6b1475855aef5e425c4e4d6b1fd3bc
Author: Günther Deschner <gd at samba.org>
Date:   Mon May 9 12:10:22 2016 +0200

    s3-rpcclient: add clusapi_resume_node command.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Thu Jan  9 01:15:34 UTC 2020 on sn-devel-184

commit c9077f16283bdc04068ee669baa99baca8238532
Author: Günther Deschner <gd at samba.org>
Date:   Mon May 9 12:07:47 2016 +0200

    s3-rpcclient: add clusapi_pause_node command.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 94157af26107fc12af5c10bedb4ca5af6eeed73e
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jan 8 17:25:13 2020 +0100

    s3-rpcclient: give slightly better descriptions to clusapi commands
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c433dac59818d580bdccb0d0e0daac71ccf01ee2
Author: Günther Deschner <gd at samba.org>
Date:   Mon Dec 23 16:53:37 2019 +0100

    librpc: pidlify spoolss_EnumPerMachineConnections
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c9bebbcc464e98abeeb008551657532a1831a96f
Author: Günther Deschner <gd at samba.org>
Date:   Tue Jan 7 14:58:15 2020 +0100

    librpc/ndr: provide infrastructure for NDR_SPOOLSS_{PUSH|PULL}_ENUM macros
    
    The new macros allow the same macro convenience for enum functions without
    level discriminator.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 1038613878b7c40d4d313697cc0e4e527582afdb
Author: Günther Deschner <gd at samba.org>
Date:   Mon Dec 23 16:50:28 2019 +0100

    librpc: better naming for NDR_SPOOLSS_{PUSH|PULL}_ENUM variants
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 210a8f35b66326263e8466a5b58dffa6e0405c56
Author: Günther Deschner <gd at samba.org>
Date:   Fri Dec 20 13:43:25 2019 +0100

    s4-torture: add test for spoolss_EnumPerMachineConnections
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0a76a7c3c258aa84fab96d03347f8e6e8d067fa8
Author: Günther Deschner <gd at samba.org>
Date:   Sun Sep 22 03:34:56 2019 +0200

    s4-torture: add test for spoolss AddPerMachineConnection
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d642c9a2a8df3002c30d420f3cd34b447a711212
Author: Günther Deschner <gd at samba.org>
Date:   Sun Sep 22 03:34:27 2019 +0200

    s3-rpcclient: add delpermachineconnection command
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d3c2833f1bb5622c438ec1c7b287e53fce83a6c2
Author: Günther Deschner <gd at samba.org>
Date:   Mon Dec 23 12:42:53 2019 +0100

    s3-rpcclient: add addpermachineconnection command
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ce00972afc205af4f93cde5c3e30a07ec222670c
Author: Günther Deschner <gd at samba.org>
Date:   Thu Dec 1 21:32:18 2016 +0100

    s3-rpcclient: add enumpermachineconnections command
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a340aecdd025352bd0cefc1be1aac7526dfe1748
Author: Günther Deschner <gd at samba.org>
Date:   Thu Dec 19 13:49:53 2019 +0100

    s3-rpcclient: properly check and initialize buffers in getdriverpackagepath
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 479cf55397062cf38d16d08e4c48b2d1e26ceb99
Author: Günther Deschner <gd at samba.org>
Date:   Thu Dec 1 21:31:52 2016 +0100

    librpc: add IDL for spoolss_EnumPerMachineConnections
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8ceddba1f3b1aad4c2935e5a1207277f591cace8
Author: Günther Deschner <gd at samba.org>
Date:   Mon Sep 19 17:03:44 2016 +0200

    s3-rpcclient: add cmd_spoolss_get_core_printer_drivers
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit e17c8e1b405690d7d38443c8f18c489fc98c1011
Author: Günther Deschner <gd at samba.org>
Date:   Tue Jan 7 15:52:40 2020 +0100

    librpc: fix IDL for spoolss_GetCorePrinterDrivers()
    
    The charset determination makes it more difficult to deal with the real
    REG_MULTI_SZ nature of that element.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 librpc/idl/spoolss.idl          |  22 +++-
 librpc/ndr/ndr_spoolss_buf.c    | 184 +++++++++++++++++++++++++----
 librpc/ndr/ndr_spoolss_buf.h    |   1 +
 selftest/knownfail              |   1 +
 source3/rpcclient/cmd_clusapi.c | 152 ++++++++++++++++++++++--
 source3/rpcclient/cmd_spoolss.c | 253 +++++++++++++++++++++++++++++++++++++++-
 source4/torture/rpc/spoolss.c   | 213 ++++++++++++++++++++++++++++++++-
 7 files changed, 782 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 9d294969a0a..afe60d2faf0 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -3066,7 +3066,25 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 
 	/******************/
 	/* Function: 0x57 */
-	[todo] WERROR spoolss_EnumPerMachineConnections(
+	[public,noopnum,noprint] WERROR _spoolss_EnumPerMachineConnections(
+		[in,unique] [string,charset(UTF16)] uint16 *server,
+		[in,unique] DATA_BLOB *buffer,
+		[in] uint32 offered,
+		[out,unique] DATA_BLOB *info,
+		[out,ref] uint32 *needed,
+		[out,ref] uint32 *count
+	);
+	[public,noopnum,noprint] void __spoolss_EnumPerMachineConnections(
+		[in] uint32 count,
+		[out] spoolss_PrinterInfo4 info[count]
+	);
+	[nopull,nopush] WERROR spoolss_EnumPerMachineConnections(
+		[in,unique] [string,charset(UTF16)] uint16 *server,
+		[in,unique] DATA_BLOB *buffer,
+		[in] uint32 offered,
+		[out,ref] uint32 *count,
+		[out,ref,size_is(,*count)] spoolss_PrinterInfo4 **info,
+		[out,ref] uint32 *needed
 	);
 
 	/******************/
@@ -3296,7 +3314,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 		[in,unique] [string,charset(UTF16)] uint16 *servername,
 		[in,ref] [string,charset(UTF16)] uint16 *architecture,
 		[in] uint32 core_driver_size,
-		[in,size_is(core_driver_size)] [charset(UTF16)] uint16 *core_driver_dependencies,
+		[in,size_is(core_driver_size)] uint16 *core_driver_dependencies,
 		[in] uint32 core_printer_driver_count,
 		[out,size_is(core_printer_driver_count)] spoolss_CorePrinterDriver *core_printer_drivers
 	);
diff --git a/librpc/ndr/ndr_spoolss_buf.c b/librpc/ndr/ndr_spoolss_buf.c
index a57f578fd45..393d7addeb5 100644
--- a/librpc/ndr/ndr_spoolss_buf.c
+++ b/librpc/ndr/ndr_spoolss_buf.c
@@ -36,13 +36,17 @@
 			"SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
 			(unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
 	}\
-	_r.in.level	= r->in.level;\
 	_r.in.buffer	= r->in.buffer;\
 	_r.in.offered	= r->in.offered;\
 	NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
 } while(0)
 
-#define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \
+#define NDR_SPOOLSS_PUSH_ENUM_IN_LEVEL(fn) do { \
+	_r.in.level     = r->in.level;\
+	NDR_SPOOLSS_PUSH_ENUM_IN(fn);\
+} while(0)
+
+#define NDR_SPOOLSS_PUSH_ENUM_OUT_LEVEL(fn) do { \
 	DATA_BLOB _data_blob_info = data_blob_null;\
 	struct ndr_push *_ndr_info = NULL;\
 	_r.in.level	= r->in.level;\
@@ -84,6 +88,58 @@
 	NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
 } while(0)
 
+#define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \
+	DATA_BLOB _data_blob_info = data_blob_null;\
+	struct ndr_push *_ndr_info = NULL;\
+	_r.in.buffer	= r->in.buffer;\
+	_r.in.offered	= r->in.offered;\
+	_r.out.info	= NULL;\
+	_r.out.needed	= r->out.needed;\
+	_r.out.count	= r->out.count;\
+	_r.out.result	= r->out.result;\
+	if (r->out.info && *r->out.info && !r->in.buffer) {\
+		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
+			"SPOOLSS Buffer: *r->out.info but there's no r->in.buffer");\
+	}\
+	if (r->in.buffer) {\
+		_ndr_info = ndr_push_init_ctx(ndr);\
+		NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
+		_ndr_info->flags= ndr->flags;\
+		if (r->out.info) {\
+			struct ndr_push *_subndr_info;\
+			struct __##fn __r;\
+			__r.in.count	= *r->out.count;\
+			__r.out.info	= *r->out.info;\
+			NDR_CHECK(ndr_push_subcontext_start(_ndr_info, &_subndr_info, 0, r->in.offered));\
+			NDR_CHECK(ndr_push___##fn(_subndr_info, flags, &__r)); \
+			NDR_CHECK(ndr_push_subcontext_end(_ndr_info, _subndr_info, 0, r->in.offered));\
+		}\
+		if (r->in.offered > _ndr_info->offset) {\
+			uint32_t _padding_len = r->in.offered - _ndr_info->offset;\
+			NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\
+		} else if (r->in.offered < _ndr_info->offset) {\
+			return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
+				"SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\
+				(unsigned)r->in.offered, (unsigned)_ndr_info->offset);\
+		}\
+		_data_blob_info = ndr_push_blob(_ndr_info);\
+		_r.out.info	= &_data_blob_info;\
+	}\
+	NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
+} while(0)
+
+#define NDR_SPOOLSS_PUSH_ENUM_LEVEL(fn,in,out) do { \
+	struct _##fn _r;\
+	if (flags & NDR_IN) {\
+		in;\
+		NDR_SPOOLSS_PUSH_ENUM_IN_LEVEL(fn);\
+	}\
+	if (flags & NDR_OUT) {\
+		out;\
+		NDR_SPOOLSS_PUSH_ENUM_OUT_LEVEL(fn);\
+	}\
+} while(0)
+
 #define NDR_SPOOLSS_PUSH_ENUM(fn,in,out) do { \
 	struct _##fn _r;\
 	if (flags & NDR_IN) {\
@@ -96,10 +152,8 @@
 	}\
 } while(0)
 
-#define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \
+#define NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn) do { \
 	ZERO_STRUCT(r->out);\
-	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
-	r->in.level	= _r.in.level;\
 	r->in.buffer	= _r.in.buffer;\
 	r->in.offered	= _r.in.offered;\
 	r->out.needed	= _r.out.needed;\
@@ -117,7 +171,18 @@
 	ZERO_STRUCTP(r->out.info);\
 } while(0)
 
-#define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
+#define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \
+	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
+	NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn); \
+} while(0)
+
+#define NDR_SPOOLSS_PULL_ENUM_IN_LEVEL(fn) do { \
+	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
+	r->in.level	= _r.in.level;\
+	NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn); \
+} while(0)
+
+#define NDR_SPOOLSS_PULL_ENUM_OUT_LEVEL(fn) do { \
 	_r.in.level	= r->in.level;\
 	_r.in.buffer	= r->in.buffer;\
 	_r.in.offered	= r->in.offered;\
@@ -153,6 +218,53 @@
 	}\
 } while(0)
 
+#define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
+	_r.in.buffer	= r->in.buffer;\
+	_r.in.offered	= r->in.offered;\
+	_r.out.needed	= r->out.needed;\
+	_r.out.count	= r->out.count;\
+	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
+	if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {\
+		NDR_PULL_ALLOC(ndr, r->out.info);\
+	}\
+	*r->out.info = NULL;\
+	r->out.needed	= _r.out.needed;\
+	r->out.count	= _r.out.count;\
+	r->out.result	= _r.out.result;\
+	if (_r.out.info) {\
+		struct ndr_pull *_ndr_info;\
+		NDR_PULL_ALLOC(ndr, *r->out.info);\
+		_ndr_info = ndr_pull_init_blob(_r.out.info, *r->out.info);\
+		NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
+		_ndr_info->flags= ndr->flags;\
+		if (r->in.offered != _ndr_info->data_size) {\
+			return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
+				"SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\
+				(unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\
+		}\
+		if (*r->out.needed <= _ndr_info->data_size) {\
+			struct __##fn __r;\
+			__r.in.count	= *r->out.count;\
+			__r.out.info	= NULL;\
+			NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\
+			*r->out.info	= __r.out.info;\
+		}\
+	}\
+} while(0)
+
+#define NDR_SPOOLSS_PULL_ENUM_LEVEL(fn,in,out) do { \
+	struct _##fn _r;\
+	if (flags & NDR_IN) {\
+		out;\
+		NDR_SPOOLSS_PULL_ENUM_IN_LEVEL(fn);\
+		in;\
+	}\
+	if (flags & NDR_OUT) {\
+		out;\
+		NDR_SPOOLSS_PULL_ENUM_OUT_LEVEL(fn);\
+	}\
+} while(0)
+
 #define NDR_SPOOLSS_PULL_ENUM(fn,in,out) do { \
 	struct _##fn _r;\
 	if (flags & NDR_IN) {\
@@ -209,7 +321,7 @@
 */
 enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinters *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinters,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrinters,{
 		_r.in.flags	= r->in.flags;
 		_r.in.server	= r->in.server;
 	},{
@@ -221,7 +333,7 @@ enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags,
 
 enum ndr_err_code ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinters *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinters,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrinters,{
 		r->in.flags	= _r.in.flags;
 		r->in.server	= _r.in.server;
 	},{
@@ -241,7 +353,7 @@ uint32_t ndr_size_spoolss_EnumPrinters_info(TALLOC_CTX *mem_ctx, uint32_t level,
 */
 enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, const struct spoolss_EnumJobs *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumJobs,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumJobs,{
 		_r.in.handle	= r->in.handle;
 		_r.in.firstjob	= r->in.firstjob;
 		_r.in.numjobs	= r->in.numjobs;
@@ -255,7 +367,7 @@ enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, con
 
 enum ndr_err_code ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, int flags, struct spoolss_EnumJobs *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumJobs,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumJobs,{
 		r->in.handle	= _r.in.handle;
 		r->in.firstjob	= _r.in.firstjob;
 		r->in.numjobs	= _r.in.numjobs;
@@ -277,7 +389,7 @@ uint32_t ndr_size_spoolss_EnumJobs_info(TALLOC_CTX *mem_ctx, uint32_t level, uin
 */
 enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterDrivers *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinterDrivers,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrinterDrivers,{
 		_r.in.server		= r->in.server;
 		_r.in.environment	= r->in.environment;
 	},{
@@ -289,7 +401,7 @@ enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int
 
 enum ndr_err_code ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDrivers *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinterDrivers,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrinterDrivers,{
 		r->in.server		= _r.in.server;
 		r->in.environment	= _r.in.environment;
 	},{
@@ -309,7 +421,7 @@ uint32_t ndr_size_spoolss_EnumPrinterDrivers_info(TALLOC_CTX *mem_ctx, uint32_t
 */
 enum ndr_err_code ndr_push_spoolss_EnumForms(struct ndr_push *ndr, int flags, const struct spoolss_EnumForms *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumForms,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumForms,{
 		_r.in.handle	= r->in.handle;
 	},{
 		_r.in.handle	= r->in.handle;
@@ -319,7 +431,7 @@ enum ndr_err_code ndr_push_spoolss_EnumForms(struct ndr_push *ndr, int flags, co
 
 enum ndr_err_code ndr_pull_spoolss_EnumForms(struct ndr_pull *ndr, int flags, struct spoolss_EnumForms *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumForms,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumForms,{
 		r->in.handle	= _r.in.handle;
 	},{
 		_r.in.handle	= r->in.handle;
@@ -337,7 +449,7 @@ uint32_t ndr_size_spoolss_EnumForms_info(TALLOC_CTX *mem_ctx, uint32_t level, ui
 */
 enum ndr_err_code ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, int flags, const struct spoolss_EnumPorts *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPorts,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPorts,{
 		_r.in.servername= r->in.servername;
 	},{
 		_r.in.servername= r->in.servername;
@@ -347,7 +459,7 @@ enum ndr_err_code ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, int flags, co
 
 enum ndr_err_code ndr_pull_spoolss_EnumPorts(struct ndr_pull *ndr, int flags, struct spoolss_EnumPorts *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPorts,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPorts,{
 		r->in.servername= _r.in.servername;
 	},{
 		_r.in.servername= r->in.servername;
@@ -365,7 +477,7 @@ uint32_t ndr_size_spoolss_EnumPorts_info(TALLOC_CTX *mem_ctx, uint32_t level, ui
 */
 enum ndr_err_code ndr_push_spoolss_EnumMonitors(struct ndr_push *ndr, int flags, const struct spoolss_EnumMonitors *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumMonitors,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumMonitors,{
 		_r.in.servername= r->in.servername;
 	},{
 		_r.in.servername= r->in.servername;
@@ -375,7 +487,7 @@ enum ndr_err_code ndr_push_spoolss_EnumMonitors(struct ndr_push *ndr, int flags,
 
 enum ndr_err_code ndr_pull_spoolss_EnumMonitors(struct ndr_pull *ndr, int flags, struct spoolss_EnumMonitors *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumMonitors,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumMonitors,{
 		r->in.servername= _r.in.servername;
 	},{
 		_r.in.servername= r->in.servername;
@@ -393,7 +505,7 @@ uint32_t ndr_size_spoolss_EnumMonitors_info(TALLOC_CTX *mem_ctx, uint32_t level,
 */
 enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcessors *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrintProcessors,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrintProcessors,{
 		_r.in.servername	= r->in.servername;
 		_r.in.environment	= r->in.environment;
 	},{
@@ -405,7 +517,7 @@ enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, int
 
 enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessors(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcessors *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrintProcessors,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrintProcessors,{
 		r->in.servername	= _r.in.servername;
 		r->in.environment	= _r.in.environment;
 	},{
@@ -426,7 +538,7 @@ uint32_t ndr_size_spoolss_EnumPrintProcessors_info(TALLOC_CTX *mem_ctx,
 */
 enum ndr_err_code ndr_push_spoolss_EnumPrintProcessorDataTypes(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcessorDataTypes *r)
 {
-	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrintProcessorDataTypes,{
+	NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes,{
 		_r.in.servername		= r->in.servername;
 		_r.in.print_processor_name	= r->in.print_processor_name;
 	},{
@@ -438,7 +550,7 @@ enum ndr_err_code ndr_push_spoolss_EnumPrintProcessorDataTypes(struct ndr_push *
 
 enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessorDataTypes(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcessorDataTypes *r)
 {
-	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrintProcessorDataTypes,{
+	NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes,{
 		r->in.servername		= _r.in.servername;
 		r->in.print_processor_name	= _r.in.print_processor_name;
 	},{
@@ -454,6 +566,34 @@ uint32_t ndr_size_spoolss_EnumPrintProcessorDataTypes_info(TALLOC_CTX *mem_ctx,
 	NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes);
 }
 
+/*
+  spoolss_EnumPerMachineConnections
+*/
+enum ndr_err_code ndr_push_spoolss_EnumPerMachineConnections(struct ndr_push *ndr, int flags, const struct spoolss_EnumPerMachineConnections *r)
+{
+	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPerMachineConnections,{
+		_r.in.server	= r->in.server;
+	},{
+		_r.in.server	= r->in.server;
+	});
+	return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_spoolss_EnumPerMachineConnections(struct ndr_pull *ndr, int flags, struct spoolss_EnumPerMachineConnections *r)
+{
+	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPerMachineConnections,{
+		r->in.server	= _r.in.server;
+	},{
+		_r.in.server	= r->in.server;
+	});
+	return NDR_ERR_SUCCESS;
+}
+
+uint32_t ndr_size_spoolss_EnumPerMachineConnections_info(TALLOC_CTX *mem_ctx, uint32_t count, struct spoolss_PrinterInfo4 *info)
+{
+	NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPerMachineConnections);
+}
+
 /*
   spoolss_EnumPrinterDataEx
 */
diff --git a/librpc/ndr/ndr_spoolss_buf.h b/librpc/ndr/ndr_spoolss_buf.h
index b0fde305c3e..2ede07ac79f 100644
--- a/librpc/ndr/ndr_spoolss_buf.h
+++ b/librpc/ndr/ndr_spoolss_buf.h
@@ -77,6 +77,7 @@ enum ndr_err_code ndr_push_spoolss_security_descriptor(struct ndr_push *ndr, int
 _PUBLIC_ void ndr_print_spoolss_Time(struct ndr_print *ndr, const char *name, const struct spoolss_Time *r);
 _PUBLIC_ uint32_t ndr_spoolss_PrinterEnumValues_align(enum winreg_Type type);
 
+uint32_t ndr_size_spoolss_EnumPerMachineConnections_info(TALLOC_CTX *mem_ctx, uint32_t count, struct spoolss_PrinterInfo4 *info);
 #undef _PRINTF_ATTRIBUTE
 #define _PRINTF_ATTRIBUTE(a1, a2)
 
diff --git a/selftest/knownfail b/selftest/knownfail
index 6a776b12ae9..c9ef0851172 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -216,6 +216,7 @@
 ^samba3.rpc.spoolss.printer.addprinterex.driver_info_winreg # knownfail or flapping?
 ^samba3.rpc.spoolss.printer.*.publish_toggle\(.*\)$ # needs spoolss AD member env
 ^samba3.rpc.spoolss.printer.*.log_jobinfo\(.*\)$ # not implemented yet
+^samba3.rpc.spoolss.printserver.*.addpermachineconnection\(.*\)$ # not implemented yet
 ^samba3.rpc.spoolss.printserver.*.add_processor\(.*\)$
 ^samba3.rpc.spoolss.printserver.*.get_core_printer_drivers\(.*\)$
 ^samba3.rpc.spoolss.printserver.*.get_printer_driver_package_path\(.*\)$
diff --git a/source3/rpcclient/cmd_clusapi.c b/source3/rpcclient/cmd_clusapi.c
index 33d3a1c016e..7f208a1ca1a 100644
--- a/source3/rpcclient/cmd_clusapi.c
+++ b/source3/rpcclient/cmd_clusapi.c
@@ -501,6 +501,116 @@ static WERROR cmd_clusapi_get_cluster_version2(struct rpc_pipe_client *cli,
 	return WERR_OK;
 }
 
+static WERROR cmd_clusapi_pause_node(struct rpc_pipe_client *cli,
+				     TALLOC_CTX *mem_ctx,
+				     int argc,
+				     const char **argv)
+{
+	struct dcerpc_binding_handle *b = cli->binding_handle;
+	NTSTATUS status;
+	const char *lpszNodeName = "CTDB_NODE_0";
+	WERROR Status;
+	struct policy_handle hNode;
+	WERROR rpc_status;
+	WERROR result, ignore;
+
+	if (argc >= 2) {
+		lpszNodeName = argv[1];
+	}
+
+	status = dcerpc_clusapi_OpenNode(b, mem_ctx,
+					 lpszNodeName,
+					 &Status,
+					 &rpc_status,
+					 &hNode);
+	if (!NT_STATUS_IS_OK(status)) {
+		return ntstatus_to_werror(status);
+	}
+
+	if (!W_ERROR_IS_OK(Status)) {
+		printf("Failed to open node %s\n", lpszNodeName);
+		printf("Status: %s\n", win_errstr(Status));
+		return Status;
+	}
+
+	status = dcerpc_clusapi_PauseNode(b, mem_ctx,
+					  hNode,
+					  &rpc_status,
+					  &result);
+	if (!NT_STATUS_IS_OK(status)) {
+		return ntstatus_to_werror(status);
+	}
+	if (!W_ERROR_IS_OK(result)) {
+		printf("Failed to pause node %s\n", lpszNodeName);
+		printf("Status: %s\n", win_errstr(result));
+		return result;
+	}
+
+	dcerpc_clusapi_CloseNode(b, mem_ctx,
+				 &hNode,
+				 &ignore);
+
+	printf("Cluster node %s has been paused\n", lpszNodeName);
+	printf("rpc_status: %s\n", win_errstr(rpc_status));
+
+	return WERR_OK;
+}
+
+static WERROR cmd_clusapi_resume_node(struct rpc_pipe_client *cli,
+				      TALLOC_CTX *mem_ctx,
+				      int argc,
+				      const char **argv)
+{
+	struct dcerpc_binding_handle *b = cli->binding_handle;
+	NTSTATUS status;
+	const char *lpszNodeName = "CTDB_NODE_0";
+	WERROR Status;
+	struct policy_handle hNode;
+	WERROR rpc_status;
+	WERROR result, ignore;
+
+	if (argc >= 2) {
+		lpszNodeName = argv[1];
+	}
+
+	status = dcerpc_clusapi_OpenNode(b, mem_ctx,
+					 lpszNodeName,
+					 &Status,
+					 &rpc_status,
+					 &hNode);
+	if (!NT_STATUS_IS_OK(status)) {
+		return ntstatus_to_werror(status);
+	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list