r8050: - make use of more [value()] properties
authorStefan Metzmacher <metze@samba.org>
Fri, 1 Jul 2005 11:04:33 +0000 (11:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:02 +0000 (13:19 -0500)
- the out subcontext's need to have a fixed size of r->in.offered,
  to make windows clients happy

metze
(This used to be commit 054e1ca434b2f81de199eeb41cb6233524fc5779)

source4/include/structs.h
source4/librpc/idl/spoolss.idl
source4/librpc/ndr/ndr_spoolss_buf.c
source4/torture/rpc/spoolss.c

index b83c342e898caf68b19de16d2a3fc69e400d5e7f..502180e96663c86bb8d7e2731b87a74279f4fc28 100644 (file)
@@ -72,6 +72,8 @@ struct spoolss_EndPagePrinter;
 struct spoolss_WritePrinter;
 struct spoolss_ReadPrinter;
 
+struct spoolss_DeviceMode;
+
 struct ntptr_context;
 struct ntptr_GenericHandle;
 
index 87a909b22fdc82448dd767bebd0c98e0e984ec5e..0dec162763dbfe39a98d68591a8f1d6a8b17f13f 100644 (file)
@@ -56,7 +56,7 @@
                uint32 unknown29;
        } spoolss_PrinterInfo0;
 
-       typedef struct {
+       typedef [gensize] struct {
                string32 devicename;
                uint16 specversion;
                uint16 driverversion;
        /******************/
        /* Function: 0x01 */
        typedef struct {
-               uint32 size;
-               [subcontext(4),subcontext_size(size)] spoolss_DeviceMode *devmode;
+               [value(_ndr_size_spoolss_DeviceMode(devmode, ndr->flags))] uint32 _ndr_size;
+               [subcontext(4),subcontext_size(_ndr_size)] spoolss_DeviceMode *devmode;
        } spoolss_DevmodeContainer;
 
        WERROR spoolss_OpenPrinter(
                [in]     uint32 level,
                [in]     DATA_BLOB *buffer,
                [in]     uint32 offered,
-               [out,subcontext(4),switch_is(level)] spoolss_JobInfo *info,
+               [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_JobInfo *info,
                [out]    uint32 needed
        );
 
                [default];
        } spoolss_SetPrinterInfo;
 
-       typedef struct {
-               uint32 size;
-               [subcontext(4),subcontext_size(size)] security_descriptor *sd;
-       } spoolss_SecDescContainer;
-
        WERROR spoolss_SetPrinter(
                [in,ref] policy_handle *handle,
                [in] uint32 level,
                [in,switch_is(level)] spoolss_SetPrinterInfo info,
                [in] spoolss_DevmodeContainer devmode_ctr,
-               [in] spoolss_SecDescContainer secdesc_ctr,
+               [in] sec_desc_buf secdesc_ctr,
                [in] spoolss_PrinterControl command
        );
 
                [in]     uint32 level,
                [in]     DATA_BLOB *buffer,
                [in]     uint32 offered,
-               [out,subcontext(4),switch_is(level)] spoolss_PrinterInfo *info,
+               [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_PrinterInfo *info,
                [out]    uint32 needed
        );
 
                [in] uint32 level,
                [in] DATA_BLOB *buffer,
                [in] uint32 offered,
-               [out,subcontext(4),switch_is(level)] spoolss_DriverDirectoryInfo *info,
+               [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_DriverDirectoryInfo *info,
                [out] uint32 needed
        );
 
                [in]     unistr value_name,
                [in]     uint32 offered,
                [out]    spoolss_PrinterDataType type,
-               [out,subcontext(4),switch_is(type)] spoolss_PrinterData data,
+               [out,subcontext(4),subcontext_size(offered),switch_is(type)] spoolss_PrinterData data,
                [out]    uint32 needed
        );
 
                [in] uint32 level,
                [in] DATA_BLOB *buffer,
                [in] uint32 offered,
-               [out,subcontext(4),switch_is(level)] spoolss_FormInfo *info,
+               [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_FormInfo *info,
                [out] uint32 needed
        );
 
index 594c56dda35eac8c4b84d62a9608322977cf6129..d9f9522eda29c3a83d5ae411d6b37c68fe3e442b 100644 (file)
@@ -523,3 +523,9 @@ NTSTATUS ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const
        }
        return NT_STATUS_OK;
 }
+
+uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, uint32_t flags)
+{
+       if (!devmode) return 0;
+       return ndr_size_spoolss_DeviceMode(devmode,flags);
+}
index fcbec4e561f43a229b0c012028488e50fc3259ca..07a8addada52f0bfbaee6d33e53d9b71fd0559d8 100644 (file)
@@ -100,7 +100,6 @@ static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx)
 
        op.in.printername       = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p));
        op.in.datatype          = NULL;
-       op.in.devmode_ctr.size  = 0;
        op.in.devmode_ctr.devmode= NULL;
        op.in.access_mask       = 0;
        op.out.handle           = &ctx->server_handle;
@@ -1328,9 +1327,7 @@ static BOOL test_PausePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        r.in.handle             = handle;
        r.in.level              = 0;
        r.in.info.info1         = NULL;
-       r.in.devmode_ctr.size   = 0;
        r.in.devmode_ctr.devmode= NULL;
-       r.in.secdesc_ctr.size   = 0;
        r.in.secdesc_ctr.sd     = NULL;
        r.in.command            = SPOOLSS_PRINTER_CONTROL_PAUSE;
 
@@ -1360,9 +1357,7 @@ static BOOL test_ResumePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        r.in.handle             = handle;
        r.in.level              = 0;
        r.in.info.info1         = NULL;
-       r.in.devmode_ctr.size   = 0;
        r.in.devmode_ctr.devmode= NULL;
-       r.in.secdesc_ctr.size   = 0;
        r.in.secdesc_ctr.sd     = NULL;
        r.in.command            = SPOOLSS_PRINTER_CONTROL_RESUME;
 
@@ -1663,7 +1658,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
        op.in.printername       = name;
        op.in.datatype          = NULL;
-       op.in.devmode_ctr.size  = 0;
        op.in.devmode_ctr.devmode= NULL;
        op.in.access_mask       = 0;
        op.out.handle           = &handle;
@@ -1686,7 +1680,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
        opEx.in.printername             = name;
        opEx.in.datatype                = NULL;
-       opEx.in.devmode_ctr.size        = 0;
        opEx.in.devmode_ctr.devmode     = NULL;
        opEx.in.access_mask             = 0;
        opEx.in.level                   = 1;
@@ -1744,7 +1737,6 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
        r.in.printername        = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name);
        r.in.datatype           = NULL;
-       r.in.devmode_ctr.size   = 0;
        r.in.devmode_ctr.devmode= NULL;
        r.in.access_mask        = SEC_FLAG_MAXIMUM_ALLOWED;
        r.out.handle            = &handle;
@@ -1794,7 +1786,6 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        }
 
        r.in.datatype           = NULL;
-       r.in.devmode_ctr.size   = 0;
        r.in.devmode_ctr.devmode= NULL;
        r.in.access_mask        = SEC_FLAG_MAXIMUM_ALLOWED;
        r.in.level              = 1;