Merge branch 'master' of ssh://git.samba.org/data/git/samba into wspp-schema
authorAndrew Bartlett <abartlet@samba.org>
Sun, 8 Mar 2009 05:16:11 +0000 (16:16 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 8 Mar 2009 05:16:11 +0000 (16:16 +1100)
51 files changed:
librpc/gen_ndr/cli_spoolss.c
librpc/gen_ndr/cli_spoolss.h
librpc/gen_ndr/ndr_drsblobs.c
librpc/gen_ndr/ndr_spoolss.c
librpc/gen_ndr/ndr_spoolss.h
librpc/gen_ndr/spoolss.h
librpc/gen_ndr/srv_spoolss.c
librpc/idl/spoolss.idl
librpc/ndr/ndr_spoolss_buf.c
librpc/ndr/ndr_spoolss_buf.h
pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
source3/client/clitar.c
source3/include/passdb.h
source3/include/proto.h
source3/include/rpc_spoolss.h
source3/lib/errmap_unix.c
source3/libsmb/cliconnect.c
source3/libsmb/clidfs.c
source3/libsmb/clientgen.c
source3/libsmb/smb_signing.c
source3/locking/locking.c
source3/modules/onefs_open.c
source3/passdb/pdb_interface.c
source3/passdb/pdb_ldap.c
source3/passdb/pdb_smbpasswd.c
source3/passdb/pdb_tdb.c
source3/rpc_client/cli_spoolss.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_samr_nt.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpcclient/cmd_spoolss.c
source3/script/tests/test_smbtorture_s3.sh
source3/smbd/aio.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/utils/net.c
source3/utils/net_rpc_printer.c
source3/utils/net_sam.c
source3/utils/pdbedit.c
source3/winbindd/winbindd.c
source3/winbindd/winbindd_cm.c
source3/winbindd/winbindd_passdb.c
source4/libcli/util/errormap.c
source4/ntptr/simple_ldb/ntptr_simple_ldb.c
source4/rpc_server/spoolss/dcesrv_spoolss.c
source4/selftest/tests.sh
source4/torture/rpc/samba3rpc.c
source4/torture/rpc/spoolss.c
source4/torture/rpc/spoolss_win.c

index 2aa42b93bfb092a9d79aaa135877c5f9d367fe0b..2e0582e088c7c8cbde18bee4cdd34dbf2eeb1e7a 100644 (file)
@@ -14,7 +14,7 @@ NTSTATUS rpccli_spoolss_EnumPrinters(struct rpc_pipe_client *cli,
                                     DATA_BLOB *buffer /* [in] [unique] */,
                                     uint32_t offered /* [in]  */,
                                     uint32_t *count /* [out] [ref] */,
-                                    union spoolss_PrinterInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                    union spoolss_PrinterInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                     uint32_t *needed /* [out] [ref] */,
                                     WERROR *werror)
 {
@@ -52,9 +52,7 @@ NTSTATUS rpccli_spoolss_EnumPrinters(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -231,7 +229,7 @@ NTSTATUS rpccli_spoolss_EnumJobs(struct rpc_pipe_client *cli,
                                 DATA_BLOB *buffer /* [in] [unique] */,
                                 uint32_t offered /* [in]  */,
                                 uint32_t *count /* [out] [ref] */,
-                                union spoolss_JobInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                union spoolss_JobInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                 uint32_t *needed /* [out] [ref] */,
                                 WERROR *werror)
 {
@@ -270,9 +268,7 @@ NTSTATUS rpccli_spoolss_EnumJobs(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -526,7 +522,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterDrivers(struct rpc_pipe_client *cli,
                                           DATA_BLOB *buffer /* [in] [unique] */,
                                           uint32_t offered /* [in]  */,
                                           uint32_t *count /* [out] [ref] */,
-                                          union spoolss_DriverInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                          union spoolss_DriverInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                           uint32_t *needed /* [out] [ref] */,
                                           WERROR *werror)
 {
@@ -564,9 +560,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterDrivers(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -779,7 +773,7 @@ NTSTATUS rpccli_spoolss_EnumPrintProcessors(struct rpc_pipe_client *cli,
                                            DATA_BLOB *buffer /* [in] [unique] */,
                                            uint32_t offered /* [in]  */,
                                            uint32_t *count /* [out] [ref] */,
-                                           union spoolss_PrintProcessorInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                           union spoolss_PrintProcessorInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                            uint32_t *needed /* [out] [ref] */,
                                            WERROR *werror)
 {
@@ -817,9 +811,7 @@ NTSTATUS rpccli_spoolss_EnumPrintProcessors(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -1699,7 +1691,7 @@ NTSTATUS rpccli_spoolss_EnumForms(struct rpc_pipe_client *cli,
                                  DATA_BLOB *buffer /* [in] [unique] */,
                                  uint32_t offered /* [in]  */,
                                  uint32_t *count /* [out] [ref] */,
-                                 union spoolss_FormInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                 union spoolss_FormInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                  uint32_t *needed /* [out] [ref] */,
                                  WERROR *werror)
 {
@@ -1736,9 +1728,7 @@ NTSTATUS rpccli_spoolss_EnumForms(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -1756,7 +1746,7 @@ NTSTATUS rpccli_spoolss_EnumPorts(struct rpc_pipe_client *cli,
                                  DATA_BLOB *buffer /* [in] [unique] */,
                                  uint32_t offered /* [in]  */,
                                  uint32_t *count /* [out] [ref] */,
-                                 union spoolss_PortInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                 union spoolss_PortInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                  uint32_t *needed /* [out] [ref] */,
                                  WERROR *werror)
 {
@@ -1793,9 +1783,7 @@ NTSTATUS rpccli_spoolss_EnumPorts(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -1813,7 +1801,7 @@ NTSTATUS rpccli_spoolss_EnumMonitors(struct rpc_pipe_client *cli,
                                     DATA_BLOB *buffer /* [in] [unique] */,
                                     uint32_t offered /* [in]  */,
                                     uint32_t *count /* [out] [ref] */,
-                                    union spoolss_MonitorInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                    union spoolss_MonitorInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                     uint32_t *needed /* [out] [ref] */,
                                     WERROR *werror)
 {
@@ -1850,9 +1838,7 @@ NTSTATUS rpccli_spoolss_EnumMonitors(struct rpc_pipe_client *cli,
 
        /* Return variables */
        *count = *r.out.count;
-       if (info && r.out.info) {
-               memcpy(info, r.out.info, *count * sizeof(*info));
-       }
+       *info = *r.out.info;
        *needed = *r.out.needed;
 
        /* Return result */
@@ -2445,12 +2431,25 @@ NTSTATUS rpccli_spoolss_DeletePrintProvidor(struct rpc_pipe_client *cli,
 
 NTSTATUS rpccli_spoolss_EnumPrintProcDataTypes(struct rpc_pipe_client *cli,
                                               TALLOC_CTX *mem_ctx,
+                                              const char *servername /* [in] [unique,charset(UTF16)] */,
+                                              const char *print_processor_name /* [in] [unique,charset(UTF16)] */,
+                                              uint32_t level /* [in]  */,
+                                              DATA_BLOB *buffer /* [in] [unique] */,
+                                              uint32_t offered /* [in]  */,
+                                              uint32_t *count /* [out] [ref] */,
+                                              union spoolss_PrintProcDataTypesInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
+                                              uint32_t *needed /* [out] [ref] */,
                                               WERROR *werror)
 {
        struct spoolss_EnumPrintProcDataTypes r;
        NTSTATUS status;
 
        /* In parameters */
+       r.in.servername = servername;
+       r.in.print_processor_name = print_processor_name;
+       r.in.level = level;
+       r.in.buffer = buffer;
+       r.in.offered = offered;
 
        if (DEBUGLEVEL >= 10) {
                NDR_PRINT_IN_DEBUG(spoolss_EnumPrintProcDataTypes, &r);
@@ -2475,6 +2474,9 @@ NTSTATUS rpccli_spoolss_EnumPrintProcDataTypes(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
+       *count = *r.out.count;
+       *info = *r.out.info;
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
index 83b2e28729ec4292cf39ba2fbb7ffa059d64b233..3aebf3308ebe783066acf7e26231a55fa7a880b7 100644 (file)
@@ -9,7 +9,7 @@ NTSTATUS rpccli_spoolss_EnumPrinters(struct rpc_pipe_client *cli,
                                     DATA_BLOB *buffer /* [in] [unique] */,
                                     uint32_t offered /* [in]  */,
                                     uint32_t *count /* [out] [ref] */,
-                                    union spoolss_PrinterInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                    union spoolss_PrinterInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                     uint32_t *needed /* [out] [ref] */,
                                     WERROR *werror);
 NTSTATUS rpccli_spoolss_OpenPrinter(struct rpc_pipe_client *cli,
@@ -46,7 +46,7 @@ NTSTATUS rpccli_spoolss_EnumJobs(struct rpc_pipe_client *cli,
                                 DATA_BLOB *buffer /* [in] [unique] */,
                                 uint32_t offered /* [in]  */,
                                 uint32_t *count /* [out] [ref] */,
-                                union spoolss_JobInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                union spoolss_JobInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                 uint32_t *needed /* [out] [ref] */,
                                 WERROR *werror);
 NTSTATUS rpccli_spoolss_AddPrinter(struct rpc_pipe_client *cli,
@@ -86,7 +86,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterDrivers(struct rpc_pipe_client *cli,
                                           DATA_BLOB *buffer /* [in] [unique] */,
                                           uint32_t offered /* [in]  */,
                                           uint32_t *count /* [out] [ref] */,
-                                          union spoolss_DriverInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                          union spoolss_DriverInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                           uint32_t *needed /* [out] [ref] */,
                                           WERROR *werror);
 NTSTATUS rpccli_spoolss_GetPrinterDriver(struct rpc_pipe_client *cli,
@@ -123,7 +123,7 @@ NTSTATUS rpccli_spoolss_EnumPrintProcessors(struct rpc_pipe_client *cli,
                                            DATA_BLOB *buffer /* [in] [unique] */,
                                            uint32_t offered /* [in]  */,
                                            uint32_t *count /* [out] [ref] */,
-                                           union spoolss_PrintProcessorInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                           union spoolss_PrintProcessorInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                            uint32_t *needed /* [out] [ref] */,
                                            WERROR *werror);
 NTSTATUS rpccli_spoolss_GetPrintProcessorDirectory(struct rpc_pipe_client *cli,
@@ -245,7 +245,7 @@ NTSTATUS rpccli_spoolss_EnumForms(struct rpc_pipe_client *cli,
                                  DATA_BLOB *buffer /* [in] [unique] */,
                                  uint32_t offered /* [in]  */,
                                  uint32_t *count /* [out] [ref] */,
-                                 union spoolss_FormInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                 union spoolss_FormInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                  uint32_t *needed /* [out] [ref] */,
                                  WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumPorts(struct rpc_pipe_client *cli,
@@ -255,7 +255,7 @@ NTSTATUS rpccli_spoolss_EnumPorts(struct rpc_pipe_client *cli,
                                  DATA_BLOB *buffer /* [in] [unique] */,
                                  uint32_t offered /* [in]  */,
                                  uint32_t *count /* [out] [ref] */,
-                                 union spoolss_PortInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                 union spoolss_PortInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                  uint32_t *needed /* [out] [ref] */,
                                  WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumMonitors(struct rpc_pipe_client *cli,
@@ -265,7 +265,7 @@ NTSTATUS rpccli_spoolss_EnumMonitors(struct rpc_pipe_client *cli,
                                     DATA_BLOB *buffer /* [in] [unique] */,
                                     uint32_t offered /* [in]  */,
                                     uint32_t *count /* [out] [ref] */,
-                                    union spoolss_MonitorInfo *info /* [out] [unique,switch_is(level),size_is(*count)] */,
+                                    union spoolss_MonitorInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
                                     uint32_t *needed /* [out] [ref] */,
                                     WERROR *werror);
 NTSTATUS rpccli_spoolss_AddPort(struct rpc_pipe_client *cli,
@@ -315,6 +315,14 @@ NTSTATUS rpccli_spoolss_DeletePrintProvidor(struct rpc_pipe_client *cli,
                                            WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumPrintProcDataTypes(struct rpc_pipe_client *cli,
                                               TALLOC_CTX *mem_ctx,
+                                              const char *servername /* [in] [unique,charset(UTF16)] */,
+                                              const char *print_processor_name /* [in] [unique,charset(UTF16)] */,
+                                              uint32_t level /* [in]  */,
+                                              DATA_BLOB *buffer /* [in] [unique] */,
+                                              uint32_t offered /* [in]  */,
+                                              uint32_t *count /* [out] [ref] */,
+                                              union spoolss_PrintProcDataTypesInfo **info /* [out] [ref,switch_is(level),size_is(,*count)] */,
+                                              uint32_t *needed /* [out] [ref] */,
                                               WERROR *werror);
 NTSTATUS rpccli_spoolss_ResetPrinter(struct rpc_pipe_client *cli,
                                     TALLOC_CTX *mem_ctx,
index ee7c9933c21c529b84d1f7d5501b0658910be6c8..426ade259c72ef1354cec3f26ab90f159769b812 100644 (file)
@@ -1856,7 +1856,6 @@ _PUBLIC_ void ndr_print_package_PrimaryKerberosKey4(struct ndr_print *ndr, const
 static enum ndr_err_code ndr_push_package_PrimaryKerberosCtr4(struct ndr_push *ndr, int ndr_flags, const struct package_PrimaryKerberosCtr4 *r)
 {
        uint32_t cntr_keys_0;
-       uint32_t cntr_service_keys_0;
        uint32_t cntr_old_keys_0;
        uint32_t cntr_older_keys_0;
        if (ndr_flags & NDR_SCALARS) {
index f82f42e146c3ce2e616d4250d2d4c850145143ee..3d1237cc8be4261ddfa2055c6d82a2a06a67f6ab 100644 (file)
@@ -13749,7 +13749,7 @@ _PUBLIC_ size_t ndr_size_spoolss_DriverDirectoryInfo(const union spoolss_DriverD
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverDirectoryInfo, ic);
 }
 
-static enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcessorInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcessorInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -13774,7 +13774,7 @@ static enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo1(struct ndr_push *n
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcessorInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcessorInfo1 *r)
 {
        uint32_t _ptr_print_processor_name;
        TALLOC_CTX *_mem_save_print_processor_name_0;
@@ -13826,6 +13826,11 @@ _PUBLIC_ void ndr_print_spoolss_PrintProcessorInfo1(struct ndr_print *ndr, const
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_PrintProcessorInfo1(const struct spoolss_PrintProcessorInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PrintProcessorInfo1, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcessorInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -14765,7 +14770,7 @@ _PUBLIC_ void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -14793,7 +14798,7 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo1 *r)
 {
        uint32_t _ptr_form_name;
        TALLOC_CTX *_mem_save_form_name_0;
@@ -14851,6 +14856,11 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_FormInfo1(const struct spoolss_FormInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_FormInfo1, ic);
+}
+
 static enum ndr_err_code ndr_push_spoolss_FormStringType(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -14875,7 +14885,7 @@ _PUBLIC_ void ndr_print_spoolss_FormStringType(struct ndr_print *ndr, const char
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo2 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -14951,7 +14961,7 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo2 *r)
 {
        uint32_t _ptr_form_name;
        TALLOC_CTX *_mem_save_form_name_0;
@@ -15120,6 +15130,11 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_FormInfo2(const struct spoolss_FormInfo2 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_FormInfo2, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_FormInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -15612,7 +15627,7 @@ _PUBLIC_ void ndr_print_spoolss_AddFormInfo(struct ndr_print *ndr, const char *n
        }
 }
 
-static enum ndr_err_code ndr_push_spoolss_PortInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -15637,7 +15652,7 @@ static enum ndr_err_code ndr_push_spoolss_PortInfo1(struct ndr_push *ndr, int nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_PortInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo1 *r)
 {
        uint32_t _ptr_port_name;
        TALLOC_CTX *_mem_save_port_name_0;
@@ -15689,6 +15704,11 @@ _PUBLIC_ void ndr_print_spoolss_PortInfo1(struct ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_PortInfo1(const struct spoolss_PortInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PortInfo1, ic);
+}
+
 static enum ndr_err_code ndr_push_spoolss_PortType(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -15714,7 +15734,7 @@ _PUBLIC_ void ndr_print_spoolss_PortType(struct ndr_print *ndr, const char *name
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo2 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -15771,7 +15791,7 @@ static enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo2 *r)
 {
        uint32_t _ptr_port_name;
        TALLOC_CTX *_mem_save_port_name_0;
@@ -15897,6 +15917,11 @@ _PUBLIC_ void ndr_print_spoolss_PortInfo2(struct ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_PortInfo2(const struct spoolss_PortInfo2 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PortInfo2, ic);
+}
+
 static enum ndr_err_code ndr_push_spoolss_PortStatus(struct ndr_push *ndr, int ndr_flags, enum spoolss_PortStatus r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -15959,7 +15984,7 @@ _PUBLIC_ void ndr_print_spoolss_PortSeverity(struct ndr_print *ndr, const char *
        ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
-static enum ndr_err_code ndr_push_spoolss_PortInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo3 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo3 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -15986,7 +16011,7 @@ static enum ndr_err_code ndr_push_spoolss_PortInfo3(struct ndr_push *ndr, int nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_PortInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo3 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo3 *r)
 {
        uint32_t _ptr_status_string;
        TALLOC_CTX *_mem_save_status_string_0;
@@ -16042,7 +16067,12 @@ _PUBLIC_ void ndr_print_spoolss_PortInfo3(struct ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_PortInfoFF(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfoFF *r)
+_PUBLIC_ size_t ndr_size_spoolss_PortInfo3(const struct spoolss_PortInfo3 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PortInfo3, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfoFF(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfoFF *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -16068,7 +16098,7 @@ static enum ndr_err_code ndr_push_spoolss_PortInfoFF(struct ndr_push *ndr, int n
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_PortInfoFF(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfoFF *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfoFF(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfoFF *r)
 {
        uint32_t _ptr_port_name;
        TALLOC_CTX *_mem_save_port_name_0;
@@ -16122,6 +16152,11 @@ _PUBLIC_ void ndr_print_spoolss_PortInfoFF(struct ndr_print *ndr, const char *na
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_PortInfoFF(const struct spoolss_PortInfoFF *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PortInfoFF, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PortInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -16278,7 +16313,7 @@ _PUBLIC_ void ndr_print_spoolss_PortInfo(struct ndr_print *ndr, const char *name
        }
 }
 
-static enum ndr_err_code ndr_push_spoolss_MonitorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -16303,7 +16338,7 @@ static enum ndr_err_code ndr_push_spoolss_MonitorInfo1(struct ndr_push *ndr, int
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_MonitorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo1 *r)
 {
        uint32_t _ptr_monitor_name;
        TALLOC_CTX *_mem_save_monitor_name_0;
@@ -16355,7 +16390,12 @@ _PUBLIC_ void ndr_print_spoolss_MonitorInfo1(struct ndr_print *ndr, const char *
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo2 *r)
+_PUBLIC_ size_t ndr_size_spoolss_MonitorInfo1(const struct spoolss_MonitorInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_MonitorInfo1, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo2 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -16410,7 +16450,7 @@ static enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, int
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo2 *r)
 {
        uint32_t _ptr_monitor_name;
        TALLOC_CTX *_mem_save_monitor_name_0;
@@ -16532,6 +16572,11 @@ _PUBLIC_ void ndr_print_spoolss_MonitorInfo2(struct ndr_print *ndr, const char *
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_MonitorInfo2(const struct spoolss_MonitorInfo2 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_MonitorInfo2, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_MonitorInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -16640,6 +16685,172 @@ _PUBLIC_ void ndr_print_spoolss_MonitorInfo(struct ndr_print *ndr, const char *n
        }
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcDataTypesInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       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_array));
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->name_array) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name_array));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->name_array));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcDataTypesInfo1 *r)
+{
+       uint32_t _ptr_name_array;
+       TALLOC_CTX *_mem_save_name_array_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       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_array));
+                       if (_ptr_name_array) {
+                               NDR_PULL_ALLOC(ndr, r->name_array);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->name_array, _ptr_name_array));
+                       } else {
+                               r->name_array = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->name_array) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->name_array));
+                               _mem_save_name_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->name_array, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->name_array));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_array_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrintProcDataTypesInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PrintProcDataTypesInfo1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_PrintProcDataTypesInfo1");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "name_array", r->name_array);
+       ndr->depth++;
+       if (r->name_array) {
+               ndr_print_string(ndr, "name_array", r->name_array);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_PrintProcDataTypesInfo1(const struct spoolss_PrintProcDataTypesInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PrintProcDataTypesInfo1, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcDataTypesInfo *r)
+{
+       uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
+       if (ndr_flags & NDR_SCALARS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 1: {
+                               NDR_CHECK(ndr_push_align(ndr, 4));
+                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, r));
+               switch (level) {
+                       case 1:
+                               NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_PrintProcDataTypesInfo *r)
+{
+       uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);
+       int level;
+       level = ndr_pull_get_switch_value(ndr, r);
+       if (ndr_flags & NDR_SCALARS) {
+               switch (level) {
+                       case 1: {
+                               NDR_CHECK(ndr_pull_align(ndr, 4));
+                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+               switch (level) {
+                       case 1:
+                               NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrintProcDataTypesInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcDataTypesInfo *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_PrintProcDataTypesInfo");
+       switch (level) {
+               case 1:
+                       ndr_print_spoolss_PrintProcDataTypesInfo1(ndr, "info1", &r->info1);
+               break;
+
+               default:
+               break;
+
+       }
+}
+
 static enum ndr_err_code ndr_push_spoolss_PrinterChangeFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -18374,7 +18585,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumPrinters(struct ndr_pull *ndr,
 
 _PUBLIC_ void ndr_print_spoolss_EnumPrinters(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrinters *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumPrinters");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -18409,20 +18620,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinters(struct ndr_print *ndr, const char *
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_PrinterInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_PrinterInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -18953,7 +19167,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumJobs(struct ndr_pull *ndr, int
 
 _PUBLIC_ void ndr_print_spoolss_EnumJobs(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumJobs *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumJobs");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -18987,20 +19201,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumJobs(struct ndr_print *ndr, const char *name
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_JobInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_JobInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -19642,7 +19859,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumPrinterDrivers(struct ndr_pull
 
 _PUBLIC_ void ndr_print_spoolss_EnumPrinterDrivers(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrinterDrivers *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumPrinterDrivers");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -19682,20 +19899,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDrivers(struct ndr_print *ndr, const
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_DriverInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_DriverInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -20340,7 +20560,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumPrintProcessors(struct ndr_pul
 
 _PUBLIC_ void ndr_print_spoolss_EnumPrintProcessors(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrintProcessors *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumPrintProcessors");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -20380,20 +20600,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcessors(struct ndr_print *ndr, const
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_PrintProcessorInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_PrintProcessorInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -22167,7 +22390,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumForms(struct ndr_pull *ndr, in
 
 _PUBLIC_ void ndr_print_spoolss_EnumForms(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumForms *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumForms");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -22199,20 +22422,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumForms(struct ndr_print *ndr, const char *nam
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_FormInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_FormInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -22387,7 +22613,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumPorts(struct ndr_pull *ndr, in
 
 _PUBLIC_ void ndr_print_spoolss_EnumPorts(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPorts *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumPorts");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -22421,20 +22647,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumPorts(struct ndr_print *ndr, const char *nam
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_PortInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_PortInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -22609,7 +22838,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumMonitors(struct ndr_pull *ndr,
 
 _PUBLIC_ void ndr_print_spoolss_EnumMonitors(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumMonitors *r)
 {
-       uint32_t cntr_info_1;
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumMonitors");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -22643,20 +22872,23 @@ _PUBLIC_ void ndr_print_spoolss_EnumMonitors(struct ndr_print *ndr, const char *
                ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
-               if (r->out.info) {
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
                        ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
-                               char *idx_1=NULL;
-                               if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
-                                       ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
-                                       ndr_print_spoolss_MonitorInfo(ndr, "info", &r->out.info[cntr_info_1]);
-                                       free(idx_1);
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_MonitorInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
                                }
                        }
                        ndr->depth--;
                }
                ndr->depth--;
+               ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
@@ -23289,28 +23521,198 @@ _PUBLIC_ void ndr_print_spoolss_DeletePrintProvidor(struct ndr_print *ndr, const
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcDataTypes *r)
+_PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct _spoolss_EnumPrintProcDataTypes *r)
 {
        if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.servername));
+               if (r->in.servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.servername, ndr_charset_length(r->in.servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.print_processor_name));
+               if (r->in.print_processor_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.print_processor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.print_processor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.print_processor_name, ndr_charset_length(r->in.print_processor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+               if (r->in.buffer) {
+                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->in.buffer));
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info));
+               if (r->out.info) {
+                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->out.info));
+               }
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcDataTypes *r)
+_PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct _spoolss_EnumPrintProcDataTypes *r)
 {
+       uint32_t _ptr_servername;
+       uint32_t _ptr_print_processor_name;
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       TALLOC_CTX *_mem_save_servername_0;
+       TALLOC_CTX *_mem_save_print_processor_name_0;
+       TALLOC_CTX *_mem_save_buffer_0;
+       TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->in.servername);
+               } else {
+                       r->in.servername = NULL;
+               }
+               if (r->in.servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.servername));
+                       if (ndr_get_array_length(ndr, &r->in.servername) > ndr_get_array_size(ndr, &r->in.servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.servername), ndr_get_array_length(ndr, &r->in.servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.servername, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_print_processor_name));
+               if (_ptr_print_processor_name) {
+                       NDR_PULL_ALLOC(ndr, r->in.print_processor_name);
+               } else {
+                       r->in.print_processor_name = NULL;
+               }
+               if (r->in.print_processor_name) {
+                       _mem_save_print_processor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.print_processor_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.print_processor_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.print_processor_name));
+                       if (ndr_get_array_length(ndr, &r->in.print_processor_name) > ndr_get_array_size(ndr, &r->in.print_processor_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->in.print_processor_name), ndr_get_array_length(ndr, &r->in.print_processor_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.print_processor_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.print_processor_name, ndr_get_array_length(ndr, &r->in.print_processor_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_name_0, 0);
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_buffer));
+               if (_ptr_buffer) {
+                       NDR_PULL_ALLOC(ndr, r->in.buffer);
+               } else {
+                       r->in.buffer = NULL;
+               }
+               if (r->in.buffer) {
+                       _mem_save_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.buffer, 0);
+                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->in.buffer));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
+               if (_ptr_info) {
+                       NDR_PULL_ALLOC(ndr, r->out.info);
+               } else {
+                       r->out.info = NULL;
+               }
+               if (r->out.info) {
+                       _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
+                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->out.info));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
+               }
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push___spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct __spoolss_EnumPrintProcDataTypes *r)
+{
+       uint32_t cntr_info_0;
+       if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.count));
+       }
+       if (flags & NDR_OUT) {
+               for (cntr_info_0 = 0; cntr_info_0 < r->in.count; cntr_info_0++) {
+                       NDR_CHECK(ndr_push_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
+                       NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
+               }
+               for (cntr_info_0 = 0; cntr_info_0 < r->in.count; cntr_info_0++) {
+                       NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull___spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct __spoolss_EnumPrintProcDataTypes *r)
+{
+       uint32_t cntr_info_0;
+       TALLOC_CTX *_mem_save_info_0;
+       if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.count));
+       }
+       if (flags & NDR_OUT) {
+               NDR_PULL_ALLOC_N(ndr, r->out.info, r->in.count);
+               _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
+               for (cntr_info_0 = 0; cntr_info_0 < r->in.count; cntr_info_0++) {
+                       NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
+                       NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
+               }
+               for (cntr_info_0 = 0; cntr_info_0 < r->in.count; cntr_info_0++) {
+                       NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
+               }
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
+       }
+       return NDR_ERR_SUCCESS;
+}
+
 _PUBLIC_ void ndr_print_spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrintProcDataTypes *r)
 {
+       uint32_t cntr_info_2;
        ndr_print_struct(ndr, name, "spoolss_EnumPrintProcDataTypes");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -23319,11 +23721,58 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, co
        if (flags & NDR_IN) {
                ndr_print_struct(ndr, "in", "spoolss_EnumPrintProcDataTypes");
                ndr->depth++;
+               ndr_print_ptr(ndr, "servername", r->in.servername);
+               ndr->depth++;
+               if (r->in.servername) {
+                       ndr_print_string(ndr, "servername", r->in.servername);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "print_processor_name", r->in.print_processor_name);
+               ndr->depth++;
+               if (r->in.print_processor_name) {
+                       ndr_print_string(ndr, "print_processor_name", r->in.print_processor_name);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "offered", r->in.offered);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrintProcDataTypes");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "info", r->out.info);
+               ndr->depth++;
+               ndr_print_ptr(ndr, "info", *r->out.info);
+               ndr->depth++;
+               if (*r->out.info) {
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
+                       ndr->depth++;
+                       for (cntr_info_2=0;cntr_info_2<*r->out.count;cntr_info_2++) {
+                               char *idx_2=NULL;
+                               if (asprintf(&idx_2, "[%d]", cntr_info_2) != -1) {
+                                       ndr_print_set_switch_value(ndr, &(*r->out.info)[cntr_info_2], r->in.level);
+                                       ndr_print_spoolss_PrintProcDataTypesInfo(ndr, "info", &(*r->out.info)[cntr_info_2]);
+                                       free(idx_2);
+                               }
+                       }
+                       ndr->depth--;
+               }
+               ndr->depth--;
+               ndr->depth--;
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
index eaa16e81a1cb8438a147cf2e6474ca5a69a03dea..c45b796b60b085ce9dc3120924a0b739acd17e58 100644 (file)
@@ -323,7 +323,10 @@ enum ndr_err_code ndr_push_spoolss_DriverDirectoryInfo(struct ndr_push *ndr, int
 enum ndr_err_code ndr_pull_spoolss_DriverDirectoryInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_DriverDirectoryInfo *r);
 void ndr_print_spoolss_DriverDirectoryInfo(struct ndr_print *ndr, const char *name, const union spoolss_DriverDirectoryInfo *r);
 size_t ndr_size_spoolss_DriverDirectoryInfo(const union spoolss_DriverDirectoryInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags);
+enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcessorInfo1 *r);
+enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcessorInfo1 *r);
 void ndr_print_spoolss_PrintProcessorInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PrintProcessorInfo1 *r);
+size_t ndr_size_spoolss_PrintProcessorInfo1(const struct spoolss_PrintProcessorInfo1 *r, struct smb_iconv_convenience *ic, int flags);
 enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcessorInfo *r);
 enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_PrintProcessorInfo *r);
 void ndr_print_spoolss_PrintProcessorInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcessorInfo *r);
@@ -353,9 +356,15 @@ size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t
 void ndr_print_spoolss_FormFlags(struct ndr_print *ndr, const char *name, enum spoolss_FormFlags r);
 void ndr_print_spoolss_FormSize(struct ndr_print *ndr, const char *name, const struct spoolss_FormSize *r);
 void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name, const struct spoolss_FormArea *r);
+enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo1 *r);
+enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo1 *r);
 void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_FormInfo1 *r);
+size_t ndr_size_spoolss_FormInfo1(const struct spoolss_FormInfo1 *r, struct smb_iconv_convenience *ic, int flags);
 void ndr_print_spoolss_FormStringType(struct ndr_print *ndr, const char *name, uint32_t r);
+enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo2 *r);
+enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo2 *r);
 void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_FormInfo2 *r);
+size_t ndr_size_spoolss_FormInfo2(const struct spoolss_FormInfo2 *r, struct smb_iconv_convenience *ic, int flags);
 enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_FormInfo *r);
 enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_FormInfo *r);
 void ndr_print_spoolss_FormInfo(struct ndr_print *ndr, const char *name, const union spoolss_FormInfo *r);
@@ -363,21 +372,46 @@ size_t ndr_size_spoolss_FormInfo(const union spoolss_FormInfo *r, uint32_t level
 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);
+enum ndr_err_code ndr_push_spoolss_PortInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo1 *r);
+enum ndr_err_code ndr_pull_spoolss_PortInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo1 *r);
 void ndr_print_spoolss_PortInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PortInfo1 *r);
+size_t ndr_size_spoolss_PortInfo1(const struct spoolss_PortInfo1 *r, struct smb_iconv_convenience *ic, int flags);
 void ndr_print_spoolss_PortType(struct ndr_print *ndr, const char *name, uint32_t r);
+enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo2 *r);
+enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo2 *r);
 void ndr_print_spoolss_PortInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_PortInfo2 *r);
+size_t ndr_size_spoolss_PortInfo2(const struct spoolss_PortInfo2 *r, struct smb_iconv_convenience *ic, int flags);
 void ndr_print_spoolss_PortStatus(struct ndr_print *ndr, const char *name, enum spoolss_PortStatus r);
 void ndr_print_spoolss_PortSeverity(struct ndr_print *ndr, const char *name, enum spoolss_PortSeverity r);
+enum ndr_err_code ndr_push_spoolss_PortInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfo3 *r);
+enum ndr_err_code ndr_pull_spoolss_PortInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfo3 *r);
 void ndr_print_spoolss_PortInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_PortInfo3 *r);
+size_t ndr_size_spoolss_PortInfo3(const struct spoolss_PortInfo3 *r, struct smb_iconv_convenience *ic, int flags);
+enum ndr_err_code ndr_push_spoolss_PortInfoFF(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortInfoFF *r);
+enum ndr_err_code ndr_pull_spoolss_PortInfoFF(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortInfoFF *r);
 void ndr_print_spoolss_PortInfoFF(struct ndr_print *ndr, const char *name, const struct spoolss_PortInfoFF *r);
+size_t ndr_size_spoolss_PortInfoFF(const struct spoolss_PortInfoFF *r, struct smb_iconv_convenience *ic, int flags);
 enum ndr_err_code ndr_push_spoolss_PortInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PortInfo *r);
 enum ndr_err_code ndr_pull_spoolss_PortInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_PortInfo *r);
 void ndr_print_spoolss_PortInfo(struct ndr_print *ndr, const char *name, const union spoolss_PortInfo *r);
+enum ndr_err_code ndr_push_spoolss_MonitorInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo1 *r);
+enum ndr_err_code ndr_pull_spoolss_MonitorInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo1 *r);
 void ndr_print_spoolss_MonitorInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_MonitorInfo1 *r);
+size_t ndr_size_spoolss_MonitorInfo1(const struct spoolss_MonitorInfo1 *r, struct smb_iconv_convenience *ic, int flags);
+enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorInfo2 *r);
+enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorInfo2 *r);
 void ndr_print_spoolss_MonitorInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_MonitorInfo2 *r);
+size_t ndr_size_spoolss_MonitorInfo2(const struct spoolss_MonitorInfo2 *r, struct smb_iconv_convenience *ic, int flags);
 enum ndr_err_code ndr_push_spoolss_MonitorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_MonitorInfo *r);
 enum ndr_err_code ndr_pull_spoolss_MonitorInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_MonitorInfo *r);
 void ndr_print_spoolss_MonitorInfo(struct ndr_print *ndr, const char *name, const union spoolss_MonitorInfo *r);
+enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcDataTypesInfo1 *r);
+enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcDataTypesInfo1 *r);
+void ndr_print_spoolss_PrintProcDataTypesInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PrintProcDataTypesInfo1 *r);
+size_t ndr_size_spoolss_PrintProcDataTypesInfo1(const struct spoolss_PrintProcDataTypesInfo1 *r, struct smb_iconv_convenience *ic, int flags);
+enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcDataTypesInfo *r);
+enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_PrintProcDataTypesInfo *r);
+void ndr_print_spoolss_PrintProcDataTypesInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcDataTypesInfo *r);
 void ndr_print_spoolss_PrinterChangeFlags(struct ndr_print *ndr, const char *name, uint32_t r);
 void ndr_print_spoolss_Field(struct ndr_print *ndr, const char *name, enum spoolss_Field r);
 void ndr_print_spoolss_NotifyType(struct ndr_print *ndr, const char *name, enum spoolss_NotifyType r);
@@ -541,6 +575,14 @@ void ndr_print_spoolss_DeleteMonitor(struct ndr_print *ndr, const char *name, in
 void ndr_print_spoolss_DeletePrintProcessor(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_DeletePrintProcessor *r);
 void ndr_print_spoolss_AddPrintProvidor(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_AddPrintProvidor *r);
 void ndr_print_spoolss_DeletePrintProvidor(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_DeletePrintProvidor *r);
+enum ndr_err_code ndr_push__spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct _spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_pull__spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct _spoolss_EnumPrintProcDataTypes *r);
+void ndr_print__spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, const char *name, int flags, const struct _spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_push___spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct __spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_pull___spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct __spoolss_EnumPrintProcDataTypes *r);
+void ndr_print___spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, const char *name, int flags, const struct __spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_push_spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_pull_spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcDataTypes *r);
 void ndr_print_spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrintProcDataTypes *r);
 void ndr_print_spoolss_ResetPrinter(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_ResetPrinter *r);
 void ndr_print_spoolss_GetPrinterDriver2(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_GetPrinterDriver2 *r);
index 9c5496e07c3cf6e9ce4aa09b0566ac2906fd1d2e..83a582efb214e1a586877ff070264a73c8c73a67 100644 (file)
@@ -1014,7 +1014,7 @@ union spoolss_DriverDirectoryInfo {
 
 struct spoolss_PrintProcessorInfo1 {
        const char * print_processor_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
-};
+}/* [gensize,public] */;
 
 union spoolss_PrintProcessorInfo {
        struct spoolss_PrintProcessorInfo1 info1;/* [case] */
@@ -1117,7 +1117,7 @@ struct spoolss_FormInfo1 {
        const char * form_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        struct spoolss_FormSize size;
        struct spoolss_FormArea area;
-};
+}/* [gensize,public] */;
 
 /* bitmap spoolss_FormStringType */
 #define SPOOLSS_FORM_STRING_TYPE_NONE ( 0x00000001 )
@@ -1135,7 +1135,7 @@ struct spoolss_FormInfo2 {
        uint32_t ressource_id;
        const char * display_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        uint32_t lang_id;
-};
+}/* [gensize,public] */;
 
 union spoolss_FormInfo {
        struct spoolss_FormInfo1 info1;/* [case] */
@@ -1169,7 +1169,7 @@ union spoolss_AddFormInfo {
 
 struct spoolss_PortInfo1 {
        const char * port_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
-};
+}/* [gensize,public] */;
 
 /* bitmap spoolss_PortType */
 #define SPOOLSS_PORT_TYPE_WRITE ( 0x00000001 )
@@ -1183,7 +1183,7 @@ struct spoolss_PortInfo2 {
        const char * description;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        uint32_t port_type;
        uint32_t reserved;
-};
+}/* [gensize,public] */;
 
 enum spoolss_PortStatus
 #ifndef USE_UINT_ENUMS
@@ -1239,12 +1239,12 @@ struct spoolss_PortInfo3 {
        enum spoolss_PortStatus status;
        const char * status_string;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        enum spoolss_PortSeverity severity;
-};
+}/* [gensize,public] */;
 
 struct spoolss_PortInfoFF {
        const char * port_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        DATA_BLOB monitor_data;
-};
+}/* [gensize,public] */;
 
 union spoolss_PortInfo {
        struct spoolss_PortInfo1 info1;/* [case] */
@@ -1255,19 +1255,27 @@ union spoolss_PortInfo {
 
 struct spoolss_MonitorInfo1 {
        const char * monitor_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
-};
+}/* [gensize,public] */;
 
 struct spoolss_MonitorInfo2 {
        const char * monitor_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        const char * environment;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
        const char * dll_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
-};
+}/* [gensize,public] */;
 
 union spoolss_MonitorInfo {
        struct spoolss_MonitorInfo1 info1;/* [case] */
        struct spoolss_MonitorInfo2 info2;/* [case(2)] */
 }/* [relative_base,nodiscriminant,public] */;
 
+struct spoolss_PrintProcDataTypesInfo1 {
+       const char * name_array;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+}/* [gensize,public] */;
+
+union spoolss_PrintProcDataTypesInfo {
+       struct spoolss_PrintProcDataTypesInfo1 info1;/* [case] */
+}/* [relative_base,nodiscriminant,public] */;
+
 /* bitmap spoolss_PrinterChangeFlags */
 #define PRINTER_CHANGE_ADD_PRINTER ( 0x00000001 )
 #define PRINTER_CHANGE_SET_PRINTER ( 0x00000002 )
@@ -1597,7 +1605,7 @@ struct spoolss_EnumPrinters {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_PrinterInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_PrinterInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -1699,7 +1707,7 @@ struct spoolss_EnumJobs {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_JobInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_JobInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -1816,7 +1824,7 @@ struct spoolss_EnumPrinterDrivers {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_DriverInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_DriverInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -1922,7 +1930,7 @@ struct spoolss_EnumPrintProcessors {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_PrintProcessorInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_PrintProcessorInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -2283,7 +2291,7 @@ struct spoolss_EnumForms {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_FormInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_FormInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -2332,7 +2340,7 @@ struct spoolss_EnumPorts {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_PortInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_PortInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -2381,7 +2389,7 @@ struct spoolss_EnumMonitors {
 
        struct {
                uint32_t *count;/* [ref] */
-               union spoolss_MonitorInfo *info;/* [unique,switch_is(level),size_is(*count)] */
+               union spoolss_MonitorInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
                uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
@@ -2507,8 +2515,51 @@ struct spoolss_DeletePrintProvidor {
 };
 
 
+struct _spoolss_EnumPrintProcDataTypes {
+       struct {
+               const char *servername;/* [unique,charset(UTF16)] */
+               const char *print_processor_name;/* [unique,charset(UTF16)] */
+               uint32_t level;
+               DATA_BLOB *buffer;/* [unique] */
+               uint32_t offered;
+       } in;
+
+       struct {
+               DATA_BLOB *info;/* [unique] */
+               uint32_t *needed;/* [ref] */
+               uint32_t *count;/* [ref] */
+               WERROR result;
+       } out;
+
+};
+
+
+struct __spoolss_EnumPrintProcDataTypes {
+       struct {
+               uint32_t level;
+               uint32_t count;
+       } in;
+
+       struct {
+               union spoolss_PrintProcDataTypesInfo *info;/* [switch_is(level)] */
+       } out;
+
+};
+
+
 struct spoolss_EnumPrintProcDataTypes {
        struct {
+               const char *servername;/* [unique,charset(UTF16)] */
+               const char *print_processor_name;/* [unique,charset(UTF16)] */
+               uint32_t level;
+               DATA_BLOB *buffer;/* [unique] */
+               uint32_t offered;
+       } in;
+
+       struct {
+               uint32_t *count;/* [ref] */
+               union spoolss_PrintProcDataTypesInfo **info;/* [ref,switch_is(level),size_is(,*count)] */
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
index 891be8537670b266405a799525f0e7c8386e1797..9cb930f97976b3e6c5c5035baf453c5908c2ce2c 100644 (file)
@@ -51,7 +51,7 @@ static bool api_spoolss_EnumPrinters(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_PrinterInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_PrinterInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -382,7 +382,7 @@ static bool api_spoolss_EnumJobs(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_JobInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_JobInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -852,7 +852,7 @@ static bool api_spoolss_EnumPrinterDrivers(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_DriverInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_DriverInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -1249,7 +1249,7 @@ static bool api_spoolss_EnumPrintProcessors(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_PrintProcessorInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_PrintProcessorInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2731,7 +2731,7 @@ static bool api_spoolss_EnumForms(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_FormInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_FormInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2823,7 +2823,7 @@ static bool api_spoolss_EnumPorts(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_PortInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_PortInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2915,7 +2915,7 @@ static bool api_spoolss_EnumMonitors(pipes_struct *p)
                return false;
        }
 
-       r->out.info = talloc_zero_array(r, union spoolss_MonitorInfo, *r->out.count);
+       r->out.info = talloc_zero(r, union spoolss_MonitorInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -4022,6 +4022,25 @@ static bool api_spoolss_EnumPrintProcDataTypes(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_EnumPrintProcDataTypes, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_PrintProcDataTypesInfo *);
+       if (r->out.info == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_EnumPrintProcDataTypes(p, r);
 
        if (p->rng_fault_state) {
@@ -7551,7 +7570,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PrinterInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrinterInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7608,7 +7627,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_JobInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_JobInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7671,7 +7690,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_DriverInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_DriverInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7728,7 +7747,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PrintProcessorInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrintProcessorInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7923,7 +7942,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_FormInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_FormInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7945,7 +7964,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PortInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PortInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7967,7 +7986,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_MonitorInfo, *r->out.count);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_MonitorInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8067,6 +8086,22 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_ENUMPRINTPROCDATATYPES: {
                        struct spoolss_EnumPrintProcDataTypes *r = (struct spoolss_EnumPrintProcDataTypes *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrintProcDataTypesInfo *);
+                       if (r->out.info == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_EnumPrintProcDataTypes(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
index f9ca4c14765bc94b5d05ab5b2bb864baf1ad6bd8..9765fd3969b6dc9ddcb0c484230144eb54b69ea3 100644 (file)
@@ -379,7 +379,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                 * and the array has no size in front
                 */
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_PrinterInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_PrinterInfo **info,
                [out,ref] uint32 *needed
        );
 
@@ -623,7 +623,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in]     uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_JobInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_JobInfo **info,
                [out,ref] uint32 *needed
        );
 
@@ -1088,7 +1088,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in] uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_DriverInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_DriverInfo **info,
                [out,ref] uint32 *needed
        );
 
@@ -1140,7 +1140,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 
        /******************/
        /* Function: 0x0f */
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *print_processor_name;
        } spoolss_PrintProcessorInfo1;
 
@@ -1171,7 +1171,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in] uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_PrintProcessorInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_PrintProcessorInfo **info,
                [out,ref] uint32 *needed
        );
 
@@ -1392,7 +1392,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                uint32 bottom;
        } spoolss_FormArea;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                spoolss_FormFlags flags;
                [relative] nstring *form_name;
                spoolss_FormSize size;
@@ -1405,7 +1405,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                SPOOLSS_FORM_STRING_TYPE_LANG_PAIR      = 0x00000004
        } spoolss_FormStringType;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                spoolss_FormFlags flags;
                [relative] nstring *form_name;
                spoolss_FormSize size;
@@ -1505,11 +1505,11 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in]     uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_FormInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_FormInfo **info,
                [out,ref] uint32 *needed
        );
 
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *port_name;
        } spoolss_PortInfo1;
 
@@ -1520,7 +1520,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                SPOOLSS_PORT_TYPE_NET_ATTACHED  = 0x00000008
        } spoolss_PortType;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *port_name;
                [relative] nstring *monitor_name;
                [relative] nstring *description;
@@ -1550,13 +1550,13 @@ import "misc.idl", "security.idl", "winreg.idl";
                PORT_STATUS_TYPE_INFO           = 0x00000003
        } spoolss_PortSeverity;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                spoolss_PortStatus status;
                [relative] nstring *status_string;
                spoolss_PortSeverity severity;
        } spoolss_PortInfo3;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *port_name;
                DATA_BLOB monitor_data; /* relative ?? */
        } spoolss_PortInfoFF;
@@ -1591,17 +1591,17 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in] uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_PortInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_PortInfo **info,
                [out,ref] uint32 *needed
        );
 
        /******************/
        /* Function: 0x24 */
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *monitor_name;
        } spoolss_MonitorInfo1;
 
-       typedef struct {
+       typedef [public,gensize] struct {
                [relative] nstring *monitor_name;
                [relative] nstring *environment;
                [relative] nstring *dll_name;
@@ -1633,7 +1633,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in,unique] DATA_BLOB *buffer,
                [in] uint32 offered,
                [out,ref] uint32 *count,
-               [out,unique,switch_is(level),size_is(*count)] spoolss_MonitorInfo *info,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_MonitorInfo **info,
                [out,ref] uint32 *needed
        );
 
@@ -1714,7 +1714,40 @@ import "misc.idl", "security.idl", "winreg.idl";
 
        /******************/
        /* Function: 0x33 */
-       [todo] WERROR spoolss_EnumPrintProcDataTypes(
+
+       typedef [public,gensize] struct {
+               [relative] nstring *name_array;
+       } spoolss_PrintProcDataTypesInfo1;
+
+       typedef [nodiscriminant,relative_base,public] union {
+               [case(1)] spoolss_PrintProcDataTypesInfo1 info1;
+               [default];
+       } spoolss_PrintProcDataTypesInfo;
+
+       [public,noopnum,noprint] WERROR _spoolss_EnumPrintProcDataTypes(
+               [in,unique] [string,charset(UTF16)] uint16 *servername,
+               [in,unique] [string,charset(UTF16)] uint16 *print_processor_name,
+               [in] uint32 level,
+               [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_EnumPrintProcDataTypes(
+               [in] uint32 level,
+               [in] uint32 count,
+               [out,switch_is(level)] spoolss_PrintProcDataTypesInfo info[count]
+       );
+       [nopull,nopush] WERROR spoolss_EnumPrintProcDataTypes(
+               [in,unique] [string,charset(UTF16)] uint16 *servername,
+               [in,unique] [string,charset(UTF16)] uint16 *print_processor_name,
+               [in] uint32 level,
+               [in,unique] DATA_BLOB *buffer,
+               [in] uint32 offered,
+               [out,ref] uint32 *count,
+               [out,ref,switch_is(level),size_is(,*count)] spoolss_PrintProcDataTypesInfo **info,
+               [out,ref] uint32 *needed
        );
 
        /******************/
index afc06be4e0d70a67a195632c8fd944b71abecf69..8fa018b1126825d09b5708278df7c3d279916fe8 100644 (file)
@@ -52,9 +52,9 @@
        _r.out.needed   = r->out.needed;\
        _r.out.count    = r->out.count;\
        _r.out.result   = r->out.result;\
-       if (r->out.info && !r->in.buffer) {\
+       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");\
+                       "SPOOLSS Buffer: *r->out.info but there's no r->in.buffer");\
        }\
        if (r->in.buffer) {\
                DATA_BLOB _data_blob_info;\
@@ -65,7 +65,7 @@
                        struct __##fn __r;\
                        __r.in.level    = r->in.level;\
                        __r.in.count    = *r->out.count;\
-                       __r.out.info    = r->out.info;\
+                       __r.out.info    = *r->out.info;\
                        NDR_CHECK(ndr_push___##fn(_ndr_info, flags, &__r)); \
                }\
                if (r->in.offered > _ndr_info->offset) {\
                        "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
                        (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
        }\
+       NDR_PULL_ALLOC(ndr, r->out.info);\
+       ZERO_STRUCTP(r->out.info);\
 } while(0)
 
 #define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
        _r.out.needed   = r->out.needed;\
        _r.out.count    = r->out.count;\
        NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
-       r->out.info     = NULL;\
+       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_init_blob(_r.out.info, ndr, ndr->iconv_convenience);\
+               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->iconv_convenience);\
                NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
                _ndr_info->flags= ndr->flags;\
                if (r->in.offered != _ndr_info->data_size) {\
                        __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;\
+                       *r->out.info    = __r.out.info;\
                }\
        }\
 } while(0)
@@ -397,6 +404,39 @@ uint32_t ndr_size_spoolss_EnumPrinterProcessors_info(TALLOC_CTX *mem_ctx, struct
        NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrintProcessors);
 }
 
+/*
+  spoolss_EnumPrintProcessors
+*/
+enum ndr_err_code ndr_push_spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcDataTypes *r)
+{
+       NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrintProcDataTypes,{
+               _r.in.servername                = r->in.servername;
+               _r.in.print_processor_name      = r->in.print_processor_name;
+       },{
+               _r.in.servername                = r->in.servername;
+               _r.in.print_processor_name      = r->in.print_processor_name;
+       });
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcDataTypes *r)
+{
+       NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrintProcDataTypes,{
+               r->in.servername                = _r.in.servername;
+               r->in.print_processor_name      = _r.in.print_processor_name;
+       },{
+               _r.in.servername                = r->in.servername;
+               _r.in.print_processor_name      = r->in.print_processor_name;
+       });
+       return NDR_ERR_SUCCESS;
+}
+
+uint32_t ndr_size_spoolss_EnumPrintProcDataTypes_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience,
+                                                     uint32_t level, uint32_t count, union spoolss_PrintProcDataTypesInfo *info)
+{
+       NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrintProcDataTypes);
+}
+
 /*
   spoolss_GetPrinterData
 */
index 5ed848d7e0786195402cf8e5a10a4ca7a61bf4a1..352a14b731cdfd686e87c412456bb9d37a5d24d0 100644 (file)
@@ -33,7 +33,12 @@ uint32_t ndr_size_spoolss_EnumMonitors_info(TALLOC_CTX *mem_ctx, struct smb_icon
 enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcessors *r);
 enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessors(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcessors *r);
 uint32_t ndr_size_spoolss_EnumPrinterProcessors_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience,
-                                                                                                        uint32_t level, uint32_t count, union spoolss_PrintProcessorInfo *info);
+                                                                                                uint32_t level, uint32_t count, union spoolss_PrintProcessorInfo *info);
+enum ndr_err_code ndr_push_spoolss_EnumPrintProcDataTypes(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcDataTypes *r);
+enum ndr_err_code ndr_pull_spoolss_EnumPrintProcDataTypes(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcDataTypes *r);
+uint32_t ndr_size_spoolss_EnumPrintProcDataTypes_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience,
+                                                     uint32_t level, uint32_t count, union spoolss_PrintProcDataTypesInfo *info);
+
 enum ndr_err_code ndr_push_spoolss_GetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_GetPrinterData *r);
 enum ndr_err_code ndr_pull_spoolss_GetPrinterData(struct ndr_pull *ndr, int flags, struct spoolss_GetPrinterData *r);
 enum ndr_err_code ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterData *r);
index 34aebc7f0fb112265df27386224f101ff13ec7b5..7ce9708e148d31a21fa1c3a6aa7fdd958e1d5923 100644 (file)
@@ -1256,7 +1256,7 @@ sub ParseStructPush($$$$)
 
        EnvSubstituteValue($env, $struct);
 
-       $self->DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}});
+       $self->DeclareArrayVariablesNoZero($_, $env) foreach (@{$struct->{ELEMENTS}});
 
        $self->start_flags($struct, $ndr);
 
@@ -1481,6 +1481,24 @@ sub DeclareArrayVariables($$)
        }
 }
 
+sub DeclareArrayVariablesNoZero($$$)
+{
+       my ($self,$e,$env) = @_;
+
+       foreach my $l (@{$e->{LEVELS}}) {
+               next if has_fast_array($e,$l);
+               next if is_charset_array($e,$l);
+               if ($l->{TYPE} eq "ARRAY") {
+                   my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
+                   if ($length eq "0") {
+                       warning($e->{ORIGINAL}, "pointless array cntr: 'cntr_$e->{NAME}_$l->{LEVEL_INDEX}': length=$length");
+                   } else {
+                       $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
+                   }
+               }
+       }
+}
+
 sub DeclareMemCtxVariables($$)
 {
        my ($self,$e) = @_;
index 18edf037e26613eced1e46783dd730e638dd02e7..c9f3e87c4df2bd120f27afc878e0b9e7f2e5d66b 100644 (file)
@@ -1513,6 +1513,7 @@ int process_tar(void)
 
                                        if (strrchr_m(cliplist[i], '\\')) {
                                                char *p;
+                                               char saved_char;
                                                char *saved_dir = talloc_strdup(ctx,
                                                                        client_get_cur_dir());
                                                if (!saved_dir) {
@@ -1531,13 +1532,28 @@ int process_tar(void)
                                                if (!tarmac) {
                                                        return 1;
                                                }
+                                               /*
+                                                * Strip off the last \\xxx
+                                                * xxx element of tarmac to set
+                                                * it as current directory.
+                                                */
                                                p = strrchr_m(tarmac, '\\');
                                                if (!p) {
                                                        return 1;
                                                }
+                                               saved_char = p[1];
                                                p[1] = '\0';
+
                                                client_set_cur_dir(tarmac);
 
+                                               /*
+                                                * Restore the character we
+                                                * just replaced to
+                                                * put the pathname
+                                                * back as it was.
+                                                */
+                                               p[1] = saved_char;
+
                                                DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
                                                do_list(tarmac,attribute,do_tar, False, True);
 
index 93c1e3f0ab4e250bd674b79f390bbb4a664e1eae..9cbc6bd340ad4be1ad029795e207c317eeaaffbc 100644 (file)
@@ -186,7 +186,6 @@ enum pdb_search_type {
 };
 
 struct pdb_search {
-       TALLOC_CTX *mem_ctx;
        enum pdb_search_type type;
        struct samr_displayentry *cache;
        uint32 num_entries;
index 78110161c5a294667b919f747d65ebec53a61e73..b6ddacca750cc36fd5267c706a0a1a77d727c0e1 100644 (file)
@@ -2430,8 +2430,8 @@ void cli_setup_packet_buf(struct cli_state *cli, char *buf);
 void cli_setup_packet(struct cli_state *cli);
 void cli_setup_bcc(struct cli_state *cli, void *p);
 void cli_init_creds(struct cli_state *cli, const char *username, const char *domain, const char *password);
-void cli_setup_signing_state(struct cli_state *cli, int signing_state);
 struct cli_state *cli_initialise(void);
+struct cli_state *cli_initialise_ex(int signing_state);
 void cli_nt_pipes_close(struct cli_state *cli);
 void cli_shutdown(struct cli_state *cli);
 void cli_sockopt(struct cli_state *cli, const char *options);
@@ -3209,7 +3209,7 @@ bool srv_oplock_set_signing(bool onoff);
 bool srv_check_sign_mac(const char *inbuf, bool must_be_ok);
 void srv_calculate_sign_mac(char *outbuf);
 void srv_defer_sign_response(uint16 mid);
-void srv_cancel_sign_response(uint16 mid);
+void srv_cancel_sign_response(uint16 mid, bool cancel);
 void srv_set_signing_negotiated(void);
 bool srv_is_signing_active(void);
 bool srv_is_signing_negotiated(void);
@@ -3484,9 +3484,9 @@ bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp);
 bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp);
 NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
                                 uint32 dosmode);
-void set_delete_on_close_token(struct share_mode_lock *lck, UNIX_USER_TOKEN *tok);
-void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close, UNIX_USER_TOKEN *tok);
-bool set_delete_on_close(files_struct *fsp, bool delete_on_close, UNIX_USER_TOKEN *tok);
+void set_delete_on_close_token(struct share_mode_lock *lck, const UNIX_USER_TOKEN *tok);
+void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close, const UNIX_USER_TOKEN *tok);
+bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USER_TOKEN *tok);
 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time);
 bool set_write_time(struct file_id fileid, struct timespec write_time);
 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
@@ -4617,14 +4617,14 @@ bool pdb_sid_to_id(const DOM_SID *sid, union unid_t *id,
 bool pdb_rid_algorithm(void);
 bool pdb_new_rid(uint32 *rid);
 bool initialize_password_db(bool reload, struct event_context *event_ctx);
-struct pdb_search *pdb_search_init(enum pdb_search_type type);
-struct pdb_search *pdb_search_users(uint32 acct_flags);
-struct pdb_search *pdb_search_groups(void);
-struct pdb_search *pdb_search_aliases(const DOM_SID *sid);
+struct pdb_search *pdb_search_init(TALLOC_CTX *mem_ctx,
+                                  enum pdb_search_type type);
+struct pdb_search *pdb_search_users(TALLOC_CTX *mem_ctx, uint32 acct_flags);
+struct pdb_search *pdb_search_groups(TALLOC_CTX *mem_ctx);
+struct pdb_search *pdb_search_aliases(TALLOC_CTX *mem_ctx, const DOM_SID *sid);
 uint32 pdb_search_entries(struct pdb_search *search,
                          uint32 start_idx, uint32 max_entries,
                          struct samr_displayentry **result);
-void pdb_search_destroy(struct pdb_search *search);
 bool pdb_get_trusteddom_pw(const char *domain, char** pwd, DOM_SID *sid, 
                           time_t *pass_last_set_time);
 bool pdb_set_trusteddom_pw(const char* domain, const char* pwd,
@@ -5474,19 +5474,51 @@ WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli,
                             uint32_t level,
                             uint32_t offered,
                             union spoolss_JobInfo *info);
+WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli,
+                               TALLOC_CTX *mem_ctx,
+                               struct policy_handle *handle,
+                               uint32_t level,
+                               uint32_t offered,
+                               uint32_t *count,
+                               union spoolss_FormInfo **info);
+WERROR rpccli_spoolss_enumprintprocessors(struct rpc_pipe_client *cli,
+                                         TALLOC_CTX *mem_ctx,
+                                         const char *servername,
+                                         const char *environment,
+                                         uint32_t level,
+                                         uint32_t offered,
+                                         uint32_t *count,
+                                         union spoolss_PrintProcessorInfo **info);
+WERROR rpccli_spoolss_enumprintprocessordatatypes(struct rpc_pipe_client *cli,
+                                                 TALLOC_CTX *mem_ctx,
+                                                 const char *servername,
+                                                 const char *print_processor_name,
+                                                 uint32_t level,
+                                                 uint32_t offered,
+                                                 uint32_t *count,
+                                                 union spoolss_PrintProcDataTypesInfo **info);
+WERROR rpccli_spoolss_enumports(struct rpc_pipe_client *cli,
+                               TALLOC_CTX *mem_ctx,
+                               const char *servername,
+                               uint32_t level,
+                               uint32_t offered,
+                               uint32_t *count,
+                               union spoolss_PortInfo **info);
+WERROR rpccli_spoolss_enummonitors(struct rpc_pipe_client *cli,
+                                  TALLOC_CTX *mem_ctx,
+                                  const char *servername,
+                                  uint32_t level,
+                                  uint32_t offered,
+                                  uint32_t *count,
+                                  union spoolss_MonitorInfo **info);
 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                                 char *name, uint32 flags, uint32 level,
                                 uint32 *num_printers, PRINTER_INFO_CTR *ctr);
-WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                             uint32 level, uint32 *num_ports, PORT_INFO_CTR *ctr);
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
                                       TALLOC_CTX *mem_ctx,
                                       uint32 level, const char *env,
                                       uint32 *num_drivers,
                                       PRINTER_DRIVER_CTR *ctr);
-WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                            POLICY_HND *handle, int level, uint32 *num_forms,
-                            FORM_1 **forms);
 WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                            POLICY_HND *hnd, uint32 level, uint32 firstjob, 
                            uint32 num_jobs, uint32 *returned, JOB_INFO_CTR *ctr);
@@ -5806,21 +5838,12 @@ bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5
 bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
                           PRINTER_INFO_6 *info, int depth);
 bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth);
-bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth);
-bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth);
 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) ;
 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) ;
 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth);
 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth);
 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth);
 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth);
-bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth);
-bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth);
-bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth);
-bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth);
-bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth);
-bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth);
-bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth);
 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info);
 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info);
 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info);
@@ -5836,14 +5859,7 @@ uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info);
 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info);
 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info);
 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info);
-uint32 spoolss_size_form_1(FORM_1 *info);
-uint32 spoolss_size_port_info_1(PORT_INFO_1 *info);
-uint32 spoolss_size_port_info_2(PORT_INFO_2 *info);
-uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info);
-uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info);
 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p);
-uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info);
-uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info);
 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth);
 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth);
 bool make_spoolss_q_enumprinters(
@@ -5854,9 +5870,6 @@ bool make_spoolss_q_enumprinters(
        RPC_BUFFER *buffer, 
        uint32 offered
 );
-bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u, 
-                               fstring servername, uint32 level, 
-                               RPC_BUFFER *buffer, uint32 offered);
 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth);
 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth);
 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth);
@@ -5876,17 +5889,7 @@ bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
                                 uint32 level,
                                 RPC_BUFFER *buffer, uint32 offered);
 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth);
-bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth);
-bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth);
-bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth);
 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src);
-bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth);
-bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth);
-bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth);
-bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth);
 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth);
 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth);
 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
@@ -5917,9 +5920,6 @@ bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u,
 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth);
 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth);
 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth);
-bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle, 
-                             uint32 level, RPC_BUFFER *buffer,
-                             uint32 offered);
 
 /* The following definitions come from rpc_server/srv_eventlog_lib.c  */
 
@@ -6122,14 +6122,9 @@ WERROR add_port_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, const char *portname
 bool add_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer);
 WERROR _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJOBS *r_u);
 WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, SPOOL_R_ENUMPRINTERDRIVERS *r_u);
-WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMFORMS *r_u);
 WERROR enumports_hook(TALLOC_CTX *ctx, int *count, char ***lines );
-WERROR _spoolss_enumports( pipes_struct *p, SPOOL_Q_ENUMPORTS *q_u, SPOOL_R_ENUMPORTS *r_u);
 WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, SPOOL_R_ENUMPRINTERDATA *r_u);
 WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SPOOL_R_SETPRINTERDATA *r_u);
-WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, SPOOL_R_ENUMPRINTPROCESSORS *r_u);
-WERROR _spoolss_enumprintprocdatatypes(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u);
-WERROR _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_u, SPOOL_R_ENUMPRINTMONITORS *r_u);
 WERROR _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_u);
 WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPOOL_R_ENUMPRINTERKEY *r_u);
 WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_u, SPOOL_R_ENUMPRINTERDATAEX *r_u);
@@ -6723,6 +6718,8 @@ void msg_file_was_renamed(struct messaging_context *msg,
 struct case_semantics_state;
 struct case_semantics_state *set_posix_case_semantics(TALLOC_CTX *mem_ctx,
                                                      connection_struct *conn);
+NTSTATUS open_streams_for_delete(connection_struct *conn,
+                                const char *fname);
 NTSTATUS create_file_default(connection_struct *conn,
                             struct smb_request *req,
                             uint16_t root_dir_fid,
index 2b4a036ce8a47f02952ab4e1d0d6d850927f824c..fdce63aba3187fee7854bfc8a80aa4df568c6568 100644 (file)
@@ -683,59 +683,6 @@ typedef struct spool_r_enumjobs
 }
 SPOOL_R_ENUMJOBS;
 
-typedef struct s_port_info_1
-{
-       UNISTR port_name;
-}
-PORT_INFO_1;
-
-typedef struct s_port_info_2
-{
-       UNISTR port_name;
-       UNISTR monitor_name;
-       UNISTR description;
-       uint32 port_type;
-       uint32 reserved;
-}
-PORT_INFO_2;
-
-/* Port Type bits */
-#define PORT_TYPE_WRITE         0x0001
-#define PORT_TYPE_READ          0x0002
-#define PORT_TYPE_REDIRECTED    0x0004
-#define PORT_TYPE_NET_ATTACHED  0x0008
-
-typedef struct spool_q_enumports
-{
-       uint32 name_ptr;
-       UNISTR2 name;
-       uint32 level;
-       RPC_BUFFER *buffer;
-       uint32 offered;
-}
-SPOOL_Q_ENUMPORTS;
-
-typedef struct port_info_ctr_info
-{
-       union
-       {
-               PORT_INFO_1 *info_1;
-               PORT_INFO_2 *info_2;
-       }
-       port;
-
-}
-PORT_INFO_CTR;
-
-typedef struct spool_r_enumports
-{
-       RPC_BUFFER *buffer;
-       uint32 needed;          /* bytes needed */
-       uint32 returned;        /* number of printers */
-       WERROR status;
-}
-SPOOL_R_ENUMPORTS;
-
 typedef struct job_info_info
 {
        union
@@ -769,131 +716,8 @@ typedef struct spool_r_enumprinterdrivers
 }
 SPOOL_R_ENUMPRINTERDRIVERS;
 
-#define FORM_USER    0
-#define FORM_BUILTIN 1
-#define FORM_PRINTER 2
-
-typedef struct spool_form_1
-{
-       uint32 flag;
-       UNISTR name;
-       uint32 width;
-       uint32 length;
-       uint32 left;
-       uint32 top;
-       uint32 right;
-       uint32 bottom;
-}
-FORM_1;
-
-typedef struct spool_q_enumforms
-{
-       POLICY_HND handle;
-       uint32 level;
-       RPC_BUFFER *buffer;
-       uint32 offered;
-}
-SPOOL_Q_ENUMFORMS;
-
-typedef struct spool_r_enumforms
-{
-       RPC_BUFFER *buffer;
-       uint32 needed;
-       uint32 numofforms;
-       WERROR status;
-}
-SPOOL_R_ENUMFORMS;
-
 /********************************************/
 
-typedef struct spool_q_enumprintprocessors
-{
-       uint32 name_ptr;
-       UNISTR2 name;
-       uint32 environment_ptr;
-       UNISTR2 environment;
-       uint32 level;
-       RPC_BUFFER *buffer;
-       uint32 offered;
-}
-SPOOL_Q_ENUMPRINTPROCESSORS;
-
-typedef struct printprocessor_1
-{
-       UNISTR name;
-}
-PRINTPROCESSOR_1;
-
-typedef struct spool_r_enumprintprocessors
-{
-       RPC_BUFFER *buffer;
-       uint32 needed;
-       uint32 returned;
-       WERROR status;
-}
-SPOOL_R_ENUMPRINTPROCESSORS;
-
-typedef struct spool_q_enumprintprocdatatypes
-{
-       uint32 name_ptr;
-       UNISTR2 name;
-       uint32 processor_ptr;
-       UNISTR2 processor;
-       uint32 level;
-       RPC_BUFFER *buffer;
-       uint32 offered;
-}
-SPOOL_Q_ENUMPRINTPROCDATATYPES;
-
-typedef struct ppdatatype_1
-{
-       UNISTR name;
-}
-PRINTPROCDATATYPE_1;
-
-typedef struct spool_r_enumprintprocdatatypes
-{
-       RPC_BUFFER *buffer;
-       uint32 needed;
-       uint32 returned;
-       WERROR status;
-}
-SPOOL_R_ENUMPRINTPROCDATATYPES;
-
-typedef struct printmonitor_1
-{
-       UNISTR name;
-}
-PRINTMONITOR_1;
-
-typedef struct printmonitor_2
-{
-       UNISTR name;
-       UNISTR environment;
-       UNISTR dll_name;
-}
-PRINTMONITOR_2;
-
-typedef struct spool_q_enumprintmonitors
-{
-       uint32 name_ptr;
-       UNISTR2 name;
-       uint32 level;
-       RPC_BUFFER *buffer;
-       uint32 offered;
-}
-SPOOL_Q_ENUMPRINTMONITORS;
-
-typedef struct spool_r_enumprintmonitors
-{
-       RPC_BUFFER *buffer;
-       uint32 needed;
-       uint32 returned;
-       WERROR status;
-}
-SPOOL_R_ENUMPRINTMONITORS;
-
-
 typedef struct spool_q_enumprinterdata
 {
        POLICY_HND handle;
index 9adb2370963e086b6b6a2d61c6322682bbeb4dba..bb09726ee085d82ea9ae2beb445b509ffcd83d83 100644 (file)
@@ -95,6 +95,9 @@ const struct unix_error_map unix_dos_nt_errmap[] = {
 #ifdef ENOATTR
        { ENOATTR, ERRDOS, ERRbadfile, NT_STATUS_NOT_FOUND },
 #endif
+#ifdef ECANCELED
+       { ECANCELED, ERRDOS, ERRbadfid, NT_STATUS_CANCELLED},
+#endif
 
        { 0, 0, 0, NT_STATUS_OK }
 };
index ad11ee0ed411fe6dabfe57e4df4b514679f845c4..ec2932488ead4b0a56e7ad961ab0d5c5ab0e7fde 100644 (file)
@@ -379,6 +379,7 @@ static NTSTATUS cli_session_setup_nt1(struct cli_state *cli, const char *user,
        DATA_BLOB session_key = data_blob_null;
        NTSTATUS result;
        char *p;
+       bool ok;
 
        if (passlen == 0) {
                /* do nothing - guest login */
@@ -436,11 +437,7 @@ static NTSTATUS cli_session_setup_nt1(struct cli_state *cli, const char *user,
                        SMBsesskeygen_ntv1(nt_hash, NULL, session_key.data);
 #endif
                }
-#ifdef LANMAN_ONLY
-               cli_simple_set_signing(cli, session_key, lm_response); 
-#else
-               cli_simple_set_signing(cli, session_key, nt_response); 
-#endif
+               cli_temp_set_signing(cli);
        } else {
                /* pre-encrypted password supplied.  Only used for 
                   security=server, can't do
@@ -492,6 +489,22 @@ static NTSTATUS cli_session_setup_nt1(struct cli_state *cli, const char *user,
                goto end;
        }
 
+#ifdef LANMAN_ONLY
+       ok = cli_simple_set_signing(cli, session_key, lm_response);
+#else
+       ok = cli_simple_set_signing(cli, session_key, nt_response);
+#endif
+       if (ok) {
+               /* 'resign' the last message, so we get the right sequence numbers
+                  for checking the first reply from the server */
+               cli_calculate_sign_mac(cli, cli->outbuf);
+
+               if (!cli_check_sign_mac(cli, cli->inbuf)) {
+                       result = NT_STATUS_ACCESS_DENIED;
+                       goto end;
+               }
+       }
+
        /* use the returned vuid from now on */
        cli->vuid = SVAL(cli->inbuf,smb_uid);
        
@@ -1284,10 +1297,17 @@ struct async_req *cli_tcon_andx_send(TALLOC_CTX *mem_ctx,
        return result;
 
  access_denied:
-       result = async_req_new(mem_ctx);
-       if (async_post_ntstatus(result, ev, NT_STATUS_ACCESS_DENIED)) {
-               return result;
+       {
+               struct cli_request *state;
+               if (!async_req_setup(mem_ctx, &result, &state,
+                                    struct cli_request)) {
+                       goto fail;
+               }
+               if (async_post_ntstatus(result, ev, NT_STATUS_ACCESS_DENIED)) {
+                       return result;
+               }
        }
+ fail:
        TALLOC_FREE(result);
        return NULL;
 }
@@ -1936,7 +1956,7 @@ NTSTATUS cli_start_connection(struct cli_state **output_cli,
        if (!my_name) 
                my_name = global_myname();
 
-       if (!(cli = cli_initialise())) {
+       if (!(cli = cli_initialise_ex(signing_state))) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -1984,8 +2004,6 @@ again:
                return NT_STATUS_BAD_NETWORK_NAME;
        }
 
-       cli_setup_signing_state(cli, signing_state);
-
        if (flags & CLI_FULL_CONNECTION_DONT_SPNEGO)
                cli->use_spnego = False;
        else if (flags & CLI_FULL_CONNECTION_USE_KERBEROS)
index e642f169f974eebf442d2adf3b2efd8504c9594a..1153d8dc8994b9fe6bbd2e0bffd619fb669b48f4 100644 (file)
@@ -151,7 +151,7 @@ static struct cli_state *do_connect(TALLOC_CTX *ctx,
        zero_sockaddr(&ss);
 
        /* have to open a new connection */
-       if (!(c=cli_initialise())) {
+       if (!(c=cli_initialise_ex(cm_creds.signing_state))) {
                d_printf("Connection to %s failed\n", server_n);
                if (c) {
                        cli_shutdown(c);
@@ -177,7 +177,6 @@ static struct cli_state *do_connect(TALLOC_CTX *ctx,
        c->protocol = max_protocol;
        c->use_kerberos = cm_creds.use_kerberos;
        c->fallback_after_kerberos = cm_creds.fallback_after_kerberos;
-       cli_setup_signing_state(c, cm_creds.signing_state);
 
        if (!cli_session_request(c, &calling, &called)) {
                char *p;
index 0382ef5fae7223dd19d11d740ede61356357e3ab..2983f7771aff8bb29ccaeaece51cbadb35e7663c 100644 (file)
@@ -424,34 +424,16 @@ void cli_init_creds(struct cli_state *cli, const char *username, const char *dom
         DEBUG(10,("cli_init_creds: user %s domain %s\n", cli->user_name, cli->domain));
 }
 
-/****************************************************************************
- Set the signing state (used from the command line).
-****************************************************************************/
-
-void cli_setup_signing_state(struct cli_state *cli, int signing_state)
-{
-       if (signing_state == Undefined)
-               return;
-
-       if (signing_state == false) {
-               cli->sign_info.allow_smb_signing = false;
-               cli->sign_info.mandatory_signing = false;
-               return;
-       }
-
-       cli->sign_info.allow_smb_signing = true;
-
-       if (signing_state == Required) 
-               cli->sign_info.mandatory_signing = true;
-}
-
 /****************************************************************************
  Initialise a client structure. Always returns a malloc'ed struct.
+ Set the signing state (used from the command line).
 ****************************************************************************/
 
-struct cli_state *cli_initialise(void)
+struct cli_state *cli_initialise_ex(int signing_state)
 {
        struct cli_state *cli = NULL;
+       bool allow_smb_signing = false;
+       bool mandatory_signing = false;
 
        /* Check the effective uid - make sure we are not setuid */
        if (is_setuid_root()) {
@@ -490,12 +472,27 @@ struct cli_state *cli_initialise(void)
        if (getenv("CLI_FORCE_DOSERR"))
                cli->force_dos_errors = true;
 
-       if (lp_client_signing()) 
-               cli->sign_info.allow_smb_signing = true;
+       if (lp_client_signing()) {
+               allow_smb_signing = true;
+       }
+
+       if (lp_client_signing() == Required) {
+               mandatory_signing = true;
+       }
+
+       if (signing_state != Undefined) {
+               allow_smb_signing = true;
+       }
+
+       if (signing_state == false) {
+               allow_smb_signing = false;
+               mandatory_signing = false;
+       }
+
+       if (signing_state == Required) {
+               mandatory_signing = true;
+       }
 
-       if (lp_client_signing() == Required) 
-               cli->sign_info.mandatory_signing = true;
-                                   
        if (!cli->outbuf || !cli->inbuf)
                 goto error;
 
@@ -510,6 +507,8 @@ struct cli_state *cli_initialise(void)
 #endif
 
        /* initialise signing */
+       cli->sign_info.allow_smb_signing = allow_smb_signing;
+       cli->sign_info.mandatory_signing = mandatory_signing;
        cli_null_set_signing(cli);
 
        cli->initialised = 1;
@@ -526,6 +525,11 @@ struct cli_state *cli_initialise(void)
         return NULL;
 }
 
+struct cli_state *cli_initialise(void)
+{
+       return cli_initialise_ex(Undefined);
+}
+
 /****************************************************************************
  Close all pipes open on this session.
 ****************************************************************************/
index ea1eb05cfb1324d705e33b6e56ebc1b62ced3d91..a3ed0e75729523619d259c6990b3545a37433b0b 100644 (file)
@@ -3,17 +3,17 @@
    SMB Signing Code
    Copyright (C) Jeremy Allison 2003.
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-2003
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -119,14 +119,14 @@ static bool cli_set_smb_signing_common(struct cli_state *cli)
        if (cli->sign_info.doing_signing) {
                return False;
        }
-       
+
        if (cli->sign_info.free_signing_context)
                cli->sign_info.free_signing_context(&cli->sign_info);
 
        /* These calls are INCOMPATIBLE with SMB signing */
        cli->readbraw_supported = False;
        cli->writebraw_supported = False;
-       
+
        return True;
 }
 
@@ -196,7 +196,7 @@ static void null_free_signing_context(struct smb_sign_info *si)
 static bool null_set_signing(struct smb_sign_info *si)
 {
        si->signing_context = NULL;
-       
+
        si->sign_outgoing_message = null_sign_outgoing_message;
        si->check_incoming_message = null_check_incoming_message;
        si->free_signing_context = null_free_signing_context;
@@ -207,7 +207,7 @@ static bool null_set_signing(struct smb_sign_info *si)
 /**
  * Free the signing context
  */
+
 static void free_signing_context(struct smb_sign_info *si)
 {
        if (si->free_signing_context) {
@@ -227,7 +227,7 @@ static bool signing_good(const char *inbuf, struct smb_sign_info *si,
                if (!si->doing_signing) {
                        si->doing_signing = True;
                }
-               
+
                if (!si->seen_valid) {
                        si->seen_valid = True;
                }
@@ -289,7 +289,7 @@ static void simple_packet_signature(struct smb_basic_signing_context *data,
 
        /* Calculate the 16 byte MAC - but don't alter the data in the
           incoming packet.
-          
+
           This makes for a bit of fussing about, but it's not too bad.
        */
        MD5Init(&md5_ctx);
@@ -368,7 +368,7 @@ static void client_sign_outgoing_message(char *outbuf, struct smb_sign_info *si)
           I can isolate the fix here rather than re-adding the trans
           signing on/off calls in libsmb/clitrans2.c JRA.
         */
-       
+
        if (store_sequence_for_reply(&data->outstanding_packet_list, SVAL(outbuf,smb_mid), data->send_seq_num + 1)) {
                data->send_seq_num += 2;
        }
@@ -409,11 +409,11 @@ static bool client_check_incoming_message(const char *inbuf,
 
        server_sent_mac = (unsigned char *)&inbuf[smb_ss_field];
        good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0);
-       
+
        if (!good) {
                DEBUG(5, ("client_check_incoming_message: BAD SIG: wanted SMB signature of\n"));
                dump_data(5, calc_md5_mac, 8);
-               
+
                DEBUG(5, ("client_check_incoming_message: BAD SIG: got SMB signature of\n"));
                dump_data(5, server_sent_mac, 8);
 #if 1 /* JRATEST */
@@ -447,7 +447,7 @@ static void simple_free_signing_context(struct smb_sign_info *si)
                (struct smb_basic_signing_context *)si->signing_context;
        struct outstanding_packet_lookup *list;
        struct outstanding_packet_lookup *next;
-       
+
        for (list = data->outstanding_packet_list; list; list = next) {
                next = list->next;
                DLIST_REMOVE(data->outstanding_packet_list, list);
@@ -486,7 +486,7 @@ bool cli_simple_set_signing(struct cli_state *cli,
        memset(data, '\0', sizeof(*data));
 
        cli->sign_info.signing_context = data;
-       
+
        data->mac_key = data_blob(NULL, response.length + user_session_key.length);
 
        memcpy(&data->mac_key.data[0], user_session_key.data, user_session_key.length);
@@ -571,7 +571,7 @@ bool cli_temp_set_signing(struct cli_state *cli)
        }
 
        cli->sign_info.signing_context = NULL;
-       
+
        cli->sign_info.sign_outgoing_message = temp_sign_outgoing_message;
        cli->sign_info.check_incoming_message = temp_check_incoming_message;
        cli->sign_info.free_signing_context = temp_free_signing_context;
@@ -587,7 +587,7 @@ void cli_free_signing_context(struct cli_state *cli)
 /**
  * Sign a packet with the current mechanism
  */
+
 void cli_calculate_sign_mac(struct cli_state *cli, char *buf)
 {
        cli->sign_info.sign_outgoing_message(buf, &cli->sign_info);
@@ -598,7 +598,7 @@ void cli_calculate_sign_mac(struct cli_state *cli, char *buf)
  * @return False if we had an established signing connection
  *         which had a bad checksum, True otherwise.
  */
+
 bool cli_check_sign_mac(struct cli_state *cli, char *buf)
 {
        if (!cli->sign_info.check_incoming_message(buf, &cli->sign_info, True)) {
@@ -746,7 +746,7 @@ static bool srv_check_incoming_message(const char *inbuf,
 
        server_sent_mac = (unsigned char *)&inbuf[smb_ss_field];
        good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0);
-       
+
        if (!good) {
 
                if (saved_seq) {
@@ -758,7 +758,7 @@ static bool srv_check_incoming_message(const char *inbuf,
                                                (unsigned int)reply_seq_number));
                        dump_data(5, server_sent_mac, 8);
                }
-               
+
 #if 1 /* JRATEST */
                {
                        int i;
@@ -865,7 +865,7 @@ void srv_defer_sign_response(uint16 mid)
  cancelled by mid. This should never find one....
 ************************************************************/
 
-void srv_cancel_sign_response(uint16 mid)
+void srv_cancel_sign_response(uint16 mid, bool cancel)
 {
        struct smb_basic_signing_context *data;
        uint32 dummy_seq;
@@ -884,7 +884,9 @@ void srv_cancel_sign_response(uint16 mid)
                ;
 
        /* cancel doesn't send a reply so doesn't burn a sequence number. */
-       data->send_seq_num -= 1;
+       if (cancel) {
+               data->send_seq_num -= 1;
+       }
 }
 
 /***********************************************************
@@ -969,17 +971,17 @@ void srv_set_signing(const DATA_BLOB user_session_key, const DATA_BLOB response)
        if (srv_sign_info.doing_signing) {
                return;
        }
-       
+
        if (srv_sign_info.free_signing_context)
                srv_sign_info.free_signing_context(&srv_sign_info);
-       
+
        srv_sign_info.doing_signing = True;
 
        data = SMB_XMALLOC_P(struct smb_basic_signing_context);
        memset(data, '\0', sizeof(*data));
 
        srv_sign_info.signing_context = data;
-       
+
        data->mac_key = data_blob(NULL, response.length + user_session_key.length);
 
        memcpy(&data->mac_key.data[0], user_session_key.data, user_session_key.length);
index 1737eab1c6f32df43ac205b09d98002d3455fcba..e9a5f757e517f20b65e47ca50812c20f7d7041e3 100644 (file)
@@ -1295,7 +1295,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
  (Should this be in locking.c.... ?).
 *************************************************************************/
 
-static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, UNIX_USER_TOKEN *tok)
+static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, const UNIX_USER_TOKEN *tok)
 {
        UNIX_USER_TOKEN *cpy;
 
@@ -1326,7 +1326,7 @@ static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, UNIX_USER_TOKEN *tok)
  Replace the delete on close token.
 ****************************************************************************/
 
-void set_delete_on_close_token(struct share_mode_lock *lck, UNIX_USER_TOKEN *tok)
+void set_delete_on_close_token(struct share_mode_lock *lck, const UNIX_USER_TOKEN *tok)
 {
        TALLOC_FREE(lck->delete_token); /* Also deletes groups... */
 
@@ -1346,7 +1346,7 @@ void set_delete_on_close_token(struct share_mode_lock *lck, UNIX_USER_TOKEN *tok
  lck entry. This function is used when the lock is already granted.
 ****************************************************************************/
 
-void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close, UNIX_USER_TOKEN *tok)
+void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close, const UNIX_USER_TOKEN *tok)
 {
        if (lck->delete_on_close != delete_on_close) {
                set_delete_on_close_token(lck, tok);
@@ -1358,8 +1358,9 @@ void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close,
        }
 }
 
-bool set_delete_on_close(files_struct *fsp, bool delete_on_close, UNIX_USER_TOKEN *tok)
+bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USER_TOKEN *tok)
 {
+       UNIX_USER_TOKEN *tok_copy = NULL;
        struct share_mode_lock *lck;
        
        DEBUG(10,("set_delete_on_close: %s delete on close flag for "
@@ -1373,6 +1374,16 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, UNIX_USER_TOKE
                return False;
        }
 
+       if (fsp->conn->admin_user) {
+               tok_copy = copy_unix_token(lck, tok);
+               tok_copy->uid = (uid_t)0;
+               if (tok_copy == NULL) {
+                       TALLOC_FREE(lck);
+                       return false;
+               }
+               tok = tok_copy;
+       }
+
        set_delete_on_close_lck(lck, delete_on_close, tok);
 
        if (fsp->is_directory) {
index d3ba0ac979b2faac40d4d209e015ef288e72d954..c5030f4ab85dddc067fe2d1ba3f616246e812ed9 100644 (file)
@@ -1648,119 +1648,6 @@ static NTSTATUS onefs_open_directory(connection_struct *conn,
        return NT_STATUS_OK;
 }
 
-/*
- * If a main file is opened for delete, all streams need to be checked for
- * !FILE_SHARE_DELETE. Do this by opening with DELETE_ACCESS.
- * If that works, delete them all by setting the delete on close and close.
- */
-
-static NTSTATUS open_streams_for_delete(connection_struct *conn,
-                                       const char *fname)
-{
-       struct stream_struct *stream_info;
-       files_struct **streams;
-       int i;
-       unsigned int num_streams;
-       TALLOC_CTX *frame = talloc_stackframe();
-       NTSTATUS status;
-
-       status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(),
-                                   &num_streams, &stream_info);
-
-       if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)
-           || NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
-               DEBUG(10, ("no streams around\n"));
-               TALLOC_FREE(frame);
-               return NT_STATUS_OK;
-       }
-
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n",
-                          nt_errstr(status)));
-               goto fail;
-       }
-
-       DEBUG(10, ("open_streams_for_delete found %d streams\n",
-                  num_streams));
-
-       if (num_streams == 0) {
-               TALLOC_FREE(frame);
-               return NT_STATUS_OK;
-       }
-
-       streams = TALLOC_ARRAY(talloc_tos(), files_struct *, num_streams);
-       if (streams == NULL) {
-               DEBUG(0, ("talloc failed\n"));
-               status = NT_STATUS_NO_MEMORY;
-               goto fail;
-       }
-
-       /* Open the base file */
-
-       for (i=0; i<num_streams; i++) {
-               char *streamname;
-
-               if (strequal(stream_info[i].name, "::$DATA")) {
-                       streams[i] = NULL;
-                       continue;
-               }
-
-               streamname = talloc_asprintf(talloc_tos(), "%s%s", fname,
-                                            stream_info[i].name);
-
-               if (streamname == NULL) {
-                       DEBUG(0, ("talloc_aprintf failed\n"));
-                       status = NT_STATUS_NO_MEMORY;
-                       goto fail;
-               }
-
-               status = onefs_create_file_unixpath
-                       (conn,                  /* conn */
-                        NULL,                  /* req */
-                        streamname,            /* fname */
-                        DELETE_ACCESS,         /* access_mask */
-                        FILE_SHARE_READ | FILE_SHARE_WRITE
-                        | FILE_SHARE_DELETE,   /* share_access */
-                        FILE_OPEN,             /* create_disposition*/
-                        NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE, /* create_options */
-                        FILE_ATTRIBUTE_NORMAL, /* file_attributes */
-                        0,                     /* oplock_request */
-                        0,                     /* allocation_size */
-                        NULL,                  /* sd */
-                        NULL,                  /* ea_list */
-                        &streams[i],           /* result */
-                        NULL,                  /* pinfo */
-                        NULL,                  /* fsp_data */
-                        NULL);                 /* psbuf */
-
-               TALLOC_FREE(streamname);
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(10, ("Could not open stream %s: %s\n",
-                                  streamname, nt_errstr(status)));
-                       break;
-               }
-       }
-
-       /*
-        * don't touch the variable "status" beyond this point :-)
-        */
-
-       for (i -= 1 ; i >= 0; i--) {
-               if (streams[i] == NULL) {
-                       continue;
-               }
-
-               DEBUG(10, ("Closing stream # %d, %s\n", i,
-                          streams[i]->fsp_name));
-               close_file(NULL, streams[i], NORMAL_CLOSE);
-       }
-
- fail:
-       TALLOC_FREE(frame);
-       return status;
-}
-
 /*
  * Wrapper around onefs_open_file_ntcreate and onefs_open_directory.
  */
index e618b425e0ceeb9561765155b472657b4345f370..1909bd0da4eb5d8b24411ffd120af9e46c0981bc 100644 (file)
@@ -1709,24 +1709,25 @@ static NTSTATUS pdb_default_lookup_names(struct pdb_methods *methods,
 }
 #endif
 
-struct pdb_search *pdb_search_init(enum pdb_search_type type)
+static int pdb_search_destructor(struct pdb_search *search)
 {
-       TALLOC_CTX *mem_ctx;
-       struct pdb_search *result;
-
-       mem_ctx = talloc_init("pdb_search");
-       if (mem_ctx == NULL) {
-               DEBUG(0, ("talloc_init failed\n"));
-               return NULL;
+       if (!search->search_ended) {
+               search->search_end(search);
        }
+       return 0;
+}
 
-       result = TALLOC_P(mem_ctx, struct pdb_search);
+struct pdb_search *pdb_search_init(TALLOC_CTX *mem_ctx,
+                                  enum pdb_search_type type)
+{
+       struct pdb_search *result;
+
+       result = talloc(mem_ctx, struct pdb_search);
        if (result == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return NULL;
        }
 
-       result->mem_ctx = mem_ctx;
        result->type = type;
        result->cache = NULL;
        result->num_entries = 0;
@@ -1737,6 +1738,8 @@ struct pdb_search *pdb_search_init(enum pdb_search_type type)
        result->next_entry = NULL;
        result->search_end = NULL;
 
+       talloc_set_destructor(result, pdb_search_destructor);
+
        return result;
 }
 
@@ -1783,8 +1786,7 @@ static bool next_entry_groups(struct pdb_search *s,
 
        sid_peek_rid(&map->sid, &rid);
 
-       fill_displayentry(s->mem_ctx, rid, 0, map->nt_name, NULL, map->comment,
-                         entry);
+       fill_displayentry(s, rid, 0, map->nt_name, NULL, map->comment, entry);
 
        state->current_group += 1;
        return True;
@@ -1802,7 +1804,7 @@ static bool pdb_search_grouptype(struct pdb_search *search,
 {
        struct group_search *state;
 
-       state = TALLOC_P(search->mem_ctx, struct group_search);
+       state = talloc(search, struct group_search);
        if (state == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return False;
@@ -1853,7 +1855,7 @@ static struct samr_displayentry *pdb_search_getentry(struct pdb_search *search,
                        break;
                }
 
-               ADD_TO_LARGE_ARRAY(search->mem_ctx, struct samr_displayentry,
+               ADD_TO_LARGE_ARRAY(search, struct samr_displayentry,
                                   entry, &search->cache, &search->num_entries,
                                   &search->cache_size);
        }
@@ -1861,52 +1863,54 @@ static struct samr_displayentry *pdb_search_getentry(struct pdb_search *search,
        return (search->num_entries > idx) ? &search->cache[idx] : NULL;
 }
 
-struct pdb_search *pdb_search_users(uint32 acct_flags)
+struct pdb_search *pdb_search_users(TALLOC_CTX *mem_ctx, uint32 acct_flags)
 {
        struct pdb_methods *pdb = pdb_get_methods();
        struct pdb_search *result;
 
-       result = pdb_search_init(PDB_USER_SEARCH);
+       result = pdb_search_init(mem_ctx, PDB_USER_SEARCH);
        if (result == NULL) {
                return NULL;
        }
 
        if (!pdb->search_users(pdb, result, acct_flags)) {
-               talloc_destroy(result->mem_ctx);
+               TALLOC_FREE(result);
                return NULL;
        }
        return result;
 }
 
-struct pdb_search *pdb_search_groups(void)
+struct pdb_search *pdb_search_groups(TALLOC_CTX *mem_ctx)
 {
        struct pdb_methods *pdb = pdb_get_methods();
        struct pdb_search *result;
 
-       result = pdb_search_init(PDB_GROUP_SEARCH);
+       result = pdb_search_init(mem_ctx, PDB_GROUP_SEARCH);
        if (result == NULL) {
                 return NULL;
        }
 
        if (!pdb->search_groups(pdb, result)) {
-               talloc_destroy(result->mem_ctx);
+               TALLOC_FREE(result);
                return NULL;
        }
        return result;
 }
 
-struct pdb_search *pdb_search_aliases(const DOM_SID *sid)
+struct pdb_search *pdb_search_aliases(TALLOC_CTX *mem_ctx, const DOM_SID *sid)
 {
        struct pdb_methods *pdb = pdb_get_methods();
        struct pdb_search *result;
 
        if (pdb == NULL) return NULL;
 
-       result = pdb_search_init(PDB_ALIAS_SEARCH);
-       if (result == NULL) return NULL;
+       result = pdb_search_init(mem_ctx, PDB_ALIAS_SEARCH);
+       if (result == NULL) {
+               return NULL;
+       }
 
        if (!pdb->search_aliases(pdb, result, sid)) {
-               talloc_destroy(result->mem_ctx);
+               TALLOC_FREE(result);
                return NULL;
        }
        return result;
@@ -1935,17 +1939,6 @@ uint32 pdb_search_entries(struct pdb_search *search,
        return search->num_entries - start_idx;
 }
 
-void pdb_search_destroy(struct pdb_search *search)
-{
-       if (search == NULL)
-               return;
-
-       if (!search->search_ended)
-               search->search_end(search);
-
-       talloc_destroy(search->mem_ctx);
-}
-
 /*******************************************************************
  trustdom methods
  *******************************************************************/
index 70a1c62bef8f447031a09e1469c32c832f6ad5c4..77b19e3de950a616eb6cc6f63159ec1a8b63518f 100644 (file)
@@ -4349,7 +4349,8 @@ static bool ldapsam_search_next_entry(struct pdb_search *search,
            !ldapsam_search_nextpage(search))
                    return False;
 
-       result = state->ldap2displayentry(state, search->mem_ctx, state->connection->ldap_struct,
+       result = state->ldap2displayentry(state, search,
+                                         state->connection->ldap_struct,
                                          state->current_entry, entry);
 
        if (!result) {
@@ -4508,7 +4509,7 @@ static bool ldapsam_search_users(struct pdb_methods *methods,
                (struct ldapsam_privates *)methods->private_data;
        struct ldap_search_state *state;
 
-       state = TALLOC_P(search->mem_ctx, struct ldap_search_state);
+       state = talloc(search, struct ldap_search_state);
        if (state == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return False;
@@ -4525,10 +4526,10 @@ static bool ldapsam_search_users(struct pdb_methods *methods,
                state->base = lp_ldap_suffix();
 
        state->acct_flags = acct_flags;
-       state->base = talloc_strdup(search->mem_ctx, state->base);
+       state->base = talloc_strdup(search, state->base);
        state->scope = LDAP_SCOPE_SUBTREE;
-       state->filter = get_ldap_filter(search->mem_ctx, "*");
-       state->attrs = talloc_attrs(search->mem_ctx, "uid", "sambaSid",
+       state->filter = get_ldap_filter(search, "*");
+       state->attrs = talloc_attrs(search, "uid", "sambaSid",
                                    "displayName", "description",
                                    "sambaAcctFlags", NULL);
        state->attrsonly = 0;
@@ -4682,7 +4683,7 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
        struct ldap_search_state *state;
        fstring tmp;
 
-       state = TALLOC_P(search->mem_ctx, struct ldap_search_state);
+       state = talloc(search, struct ldap_search_state);
        if (state == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return False;
@@ -4690,15 +4691,14 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
 
        state->connection = ldap_state->smbldap_state;
 
-       state->base = talloc_strdup(search->mem_ctx, lp_ldap_group_suffix());
+       state->base = talloc_strdup(search, lp_ldap_group_suffix());
        state->connection = ldap_state->smbldap_state;
        state->scope = LDAP_SCOPE_SUBTREE;
-       state->filter = talloc_asprintf(search->mem_ctx,
-                                       "(&(objectclass=%s)"
+       state->filter = talloc_asprintf(search, "(&(objectclass=%s)"
                                        "(sambaGroupType=%d)(sambaSID=%s*))",
                                         LDAP_OBJ_GROUPMAP,
                                         type, sid_to_fstring(tmp, sid));
-       state->attrs = talloc_attrs(search->mem_ctx, "cn", "sambaSid",
+       state->attrs = talloc_attrs(search, "cn", "sambaSid",
                                    "displayName", "description",
                                    "sambaGroupType", NULL);
        state->attrsonly = 0;
index b72e0f2cba38ecf2b897c04d90977bdadbc48a65..d663c7f0b2ffac7161adefa0dd21ccdfa9fa7ff3 100644 (file)
@@ -1566,11 +1566,11 @@ static bool smbpasswd_search_next_entry(struct pdb_search *search,
        entry->acct_flags = state->entries[state->current].acct_flags;
 
        entry->account_name = talloc_strdup(
-               search->mem_ctx, state->entries[state->current].account_name);
+               search, state->entries[state->current].account_name);
        entry->fullname = talloc_strdup(
-               search->mem_ctx, state->entries[state->current].fullname);
+               search, state->entries[state->current].fullname);
        entry->description = talloc_strdup(
-               search->mem_ctx, state->entries[state->current].description);
+               search, state->entries[state->current].description);
 
        if ((entry->account_name == NULL) || (entry->fullname == NULL)
            || (entry->description == NULL)) {
@@ -1593,8 +1593,7 @@ static bool smbpasswd_search_users(struct pdb_methods *methods,
        struct smb_passwd *pwd;
        FILE *fp;
 
-       search_state = TALLOC_ZERO_P(search->mem_ctx,
-                                    struct smbpasswd_search_state);
+       search_state = talloc_zero(search, struct smbpasswd_search_state);
        if (search_state == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return false;
index 143a2e239085b2b690d40714a8a36abdf8ce164a..3442561030845c5be68d3c05b9ee3cc7164d5c8e 100644 (file)
@@ -882,12 +882,9 @@ static bool tdbsam_search_next_entry(struct pdb_search *search,
 
        entry->acct_flags = pdb_get_acct_ctrl(user);
        entry->rid = rid;
-       entry->account_name = talloc_strdup(
-               search->mem_ctx, pdb_get_username(user));
-       entry->fullname = talloc_strdup(
-               search->mem_ctx, pdb_get_fullname(user));
-       entry->description = talloc_strdup(
-               search->mem_ctx, pdb_get_acct_desc(user));
+       entry->account_name = talloc_strdup(search, pdb_get_username(user));
+       entry->fullname = talloc_strdup(search, pdb_get_fullname(user));
+       entry->description = talloc_strdup(search, pdb_get_acct_desc(user));
 
        TALLOC_FREE(user);
 
@@ -912,7 +909,7 @@ static bool tdbsam_search_users(struct pdb_methods *methods,
                return false;
        }
 
-       state = TALLOC_ZERO_P(search->mem_ctx, struct tdbsam_search_state);
+       state = talloc_zero(search, struct tdbsam_search_state);
        if (state == NULL) {
                DEBUG(0, ("talloc failed\n"));
                return false;
index d76d20c96223bf3f004a26210eb463be630447a7..a83b0c53c639dc2d267d265f71319edce966e76c 100644 (file)
@@ -279,6 +279,266 @@ WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli,
        return werror;
 }
 
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_EnumForms
+**********************************************************************/
+
+WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli,
+                               TALLOC_CTX *mem_ctx,
+                               struct policy_handle *handle,
+                               uint32_t level,
+                               uint32_t offered,
+                               uint32_t *count,
+                               union spoolss_FormInfo **info)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_EnumForms(cli, mem_ctx,
+                                         handle,
+                                         level,
+                                         (offered > 0) ? &buffer : NULL,
+                                         offered,
+                                         count,
+                                         info,
+                                         &needed,
+                                         &werror);
+
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_EnumForms(cli, mem_ctx,
+                                                 handle,
+                                                 level,
+                                                 (offered > 0) ? &buffer : NULL,
+                                                 offered,
+                                                 count,
+                                                 info,
+                                                 &needed,
+                                                 &werror);
+       }
+
+       return werror;
+}
+
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_EnumPrintProcessors
+**********************************************************************/
+
+WERROR rpccli_spoolss_enumprintprocessors(struct rpc_pipe_client *cli,
+                                         TALLOC_CTX *mem_ctx,
+                                         const char *servername,
+                                         const char *environment,
+                                         uint32_t level,
+                                         uint32_t offered,
+                                         uint32_t *count,
+                                         union spoolss_PrintProcessorInfo **info)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_EnumPrintProcessors(cli, mem_ctx,
+                                                   servername,
+                                                   environment,
+                                                   level,
+                                                   (offered > 0) ? &buffer : NULL,
+                                                   offered,
+                                                   count,
+                                                   info,
+                                                   &needed,
+                                                   &werror);
+
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_EnumPrintProcessors(cli, mem_ctx,
+                                                           servername,
+                                                           environment,
+                                                           level,
+                                                           (offered > 0) ? &buffer : NULL,
+                                                           offered,
+                                                           count,
+                                                           info,
+                                                           &needed,
+                                                           &werror);
+       }
+
+       return werror;
+}
+
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_EnumPrintProcDataTypes
+**********************************************************************/
+
+WERROR rpccli_spoolss_enumprintprocessordatatypes(struct rpc_pipe_client *cli,
+                                                 TALLOC_CTX *mem_ctx,
+                                                 const char *servername,
+                                                 const char *print_processor_name,
+                                                 uint32_t level,
+                                                 uint32_t offered,
+                                                 uint32_t *count,
+                                                 union spoolss_PrintProcDataTypesInfo **info)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_EnumPrintProcDataTypes(cli, mem_ctx,
+                                                      servername,
+                                                      print_processor_name,
+                                                      level,
+                                                      (offered > 0) ? &buffer : NULL,
+                                                      offered,
+                                                      count,
+                                                      info,
+                                                      &needed,
+                                                      &werror);
+
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_EnumPrintProcDataTypes(cli, mem_ctx,
+                                                              servername,
+                                                              print_processor_name,
+                                                              level,
+                                                              (offered > 0) ? &buffer : NULL,
+                                                              offered,
+                                                              count,
+                                                              info,
+                                                              &needed,
+                                                              &werror);
+       }
+
+       return werror;
+}
+
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_EnumPorts
+**********************************************************************/
+
+WERROR rpccli_spoolss_enumports(struct rpc_pipe_client *cli,
+                               TALLOC_CTX *mem_ctx,
+                               const char *servername,
+                               uint32_t level,
+                               uint32_t offered,
+                               uint32_t *count,
+                               union spoolss_PortInfo **info)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_EnumPorts(cli, mem_ctx,
+                                         servername,
+                                         level,
+                                         (offered > 0) ? &buffer : NULL,
+                                         offered,
+                                         count,
+                                         info,
+                                         &needed,
+                                         &werror);
+
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_EnumPorts(cli, mem_ctx,
+                                                 servername,
+                                                 level,
+                                                 (offered > 0) ? &buffer : NULL,
+                                                 offered,
+                                                 count,
+                                                 info,
+                                                 &needed,
+                                                 &werror);
+       }
+
+       return werror;
+}
+
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_EnumMonitors
+**********************************************************************/
+
+WERROR rpccli_spoolss_enummonitors(struct rpc_pipe_client *cli,
+                                  TALLOC_CTX *mem_ctx,
+                                  const char *servername,
+                                  uint32_t level,
+                                  uint32_t offered,
+                                  uint32_t *count,
+                                  union spoolss_MonitorInfo **info)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_EnumMonitors(cli, mem_ctx,
+                                            servername,
+                                            level,
+                                            (offered > 0) ? &buffer : NULL,
+                                            offered,
+                                            count,
+                                            info,
+                                            &needed,
+                                            &werror);
+
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_EnumMonitors(cli, mem_ctx,
+                                                    servername,
+                                                    level,
+                                                    (offered > 0) ? &buffer : NULL,
+                                                    offered,
+                                                    count,
+                                                    info,
+                                                    &needed,
+                                                    &werror);
+       }
+
+       return werror;
+}
 
 /*********************************************************************
  Decode various spoolss rpc's and info levels
@@ -414,68 +674,6 @@ static bool decode_printer_info_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
 /**********************************************************************
 **********************************************************************/
 
-static bool decode_port_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
-                       uint32 returned, PORT_INFO_1 **info)
-{
-       uint32 i;
-       PORT_INFO_1 *inf;
-
-       if (returned) {
-               inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_1, returned);
-               if (!inf) {
-                       return False;
-               }
-               memset(inf, 0, returned*sizeof(PORT_INFO_1));
-       } else {
-               inf = NULL;
-       }
-
-       prs_set_offset(&buffer->prs, 0);
-
-       for (i=0; i<returned; i++) {
-               if (!smb_io_port_info_1("", buffer, &(inf[i]), 0)) {
-                       return False;
-               }
-       }
-
-       *info=inf;
-       return True;
-}
-
-/**********************************************************************
-**********************************************************************/
-
-static bool decode_port_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
-                       uint32 returned, PORT_INFO_2 **info)
-{
-       uint32 i;
-       PORT_INFO_2 *inf;
-
-       if (returned) {
-               inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_2, returned);
-               if (!inf) {
-                       return False;
-               }
-               memset(inf, 0, returned*sizeof(PORT_INFO_2));
-       } else {
-               inf = NULL;
-       }
-
-       prs_set_offset(&buffer->prs, 0);
-
-       for (i=0; i<returned; i++) {
-               if (!smb_io_port_info_2("", buffer, &(inf[i]), 0)) {
-                       return False;
-               }
-       }
-
-       *info=inf;
-       return True;
-}
-
-/**********************************************************************
-**********************************************************************/
-
 static bool decode_printer_driver_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
                        uint32 returned, DRIVER_INFO_1 **info)
 {
@@ -623,34 +821,6 @@ static bool decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
 /**********************************************************************
 **********************************************************************/
 
-static bool decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
-                          uint32 num_forms, FORM_1 **forms)
-{
-       int i;
-
-       if (num_forms) {
-               *forms = TALLOC_ARRAY(mem_ctx, FORM_1, num_forms);
-               if (*forms == NULL) {
-                       return False;
-               }
-       } else {
-               *forms = NULL;
-       }
-
-       prs_set_offset(&buffer->prs,0);
-
-       for (i = 0; i < num_forms; i++) {
-               if (!smb_io_form_1("", buffer, &((*forms)[i]), 0)) {
-                       return False;
-               }
-       }
-
-       return True;
-}
-
-/**********************************************************************
-**********************************************************************/
-
 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                                 char *name, uint32 flags, uint32 level,
                                 uint32 *num_printers, PRINTER_INFO_CTR *ctr)
@@ -730,78 +900,6 @@ WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem
 /**********************************************************************
 **********************************************************************/
 
-WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                             uint32 level, uint32 *num_ports, PORT_INFO_CTR *ctr)
-{
-       prs_struct qbuf, rbuf;
-       SPOOL_Q_ENUMPORTS in;
-        SPOOL_R_ENUMPORTS out;
-       RPC_BUFFER buffer;
-       fstring server;
-       uint32 offered;
-
-       ZERO_STRUCT(in);
-       ZERO_STRUCT(out);
-
-        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
-        strupper_m(server);
-
-       offered = 0;
-       if (!rpcbuf_init(&buffer, offered, mem_ctx))
-               return WERR_NOMEM;
-       make_spoolss_q_enumports( &in, server, level, &buffer, offered );
-       
-       CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPORTS,
-                   in, out, 
-                   qbuf, rbuf,
-                   spoolss_io_q_enumports,
-                   spoolss_io_r_enumports, 
-                   WERR_GENERAL_FAILURE );
-                       
-       if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
-               offered = out.needed;
-               
-               ZERO_STRUCT(in);
-               ZERO_STRUCT(out);
-               
-               if (!rpcbuf_init(&buffer, offered, mem_ctx))
-                       return WERR_NOMEM;
-               make_spoolss_q_enumports( &in, server, level, &buffer, offered );
-
-               CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPORTS,
-                           in, out, 
-                           qbuf, rbuf,
-                           spoolss_io_q_enumports,
-                           spoolss_io_r_enumports, 
-                           WERR_GENERAL_FAILURE );
-       }
-       
-       if ( !W_ERROR_IS_OK(out.status) )
-               return out.status;
-       
-       switch (level) {
-       case 1:
-               if (!decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1)) {
-                       return WERR_GENERAL_FAILURE;
-               }
-               break;
-       case 2:
-               if (!decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2)) {
-                       return WERR_GENERAL_FAILURE;
-               }
-               break;
-       default:
-               return WERR_UNKNOWN_LEVEL;
-       }
-
-       *num_ports = out.returned;
-
-       return out.status;
-}
-
-/**********************************************************************
-**********************************************************************/
-
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
                                       TALLOC_CTX *mem_ctx,
                                       uint32 level, const char *env,
@@ -887,64 +985,6 @@ WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli,
 /**********************************************************************
 **********************************************************************/
 
-WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
-                            POLICY_HND *handle, int level, uint32 *num_forms,
-                            FORM_1 **forms)
-{
-       prs_struct qbuf, rbuf;
-       SPOOL_Q_ENUMFORMS in;
-       SPOOL_R_ENUMFORMS out;
-       RPC_BUFFER buffer;
-       uint32 offered;
-
-       ZERO_STRUCT(in);
-       ZERO_STRUCT(out);
-
-       offered = 0;
-       if (!rpcbuf_init(&buffer, offered, mem_ctx))
-               return WERR_NOMEM;
-       make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
-
-       CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMFORMS,
-                   in, out, 
-                   qbuf, rbuf,
-                   spoolss_io_q_enumforms,
-                   spoolss_io_r_enumforms, 
-                   WERR_GENERAL_FAILURE );
-
-       if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
-               offered = out.needed;
-               
-               ZERO_STRUCT(in);
-               ZERO_STRUCT(out);
-
-               if (!rpcbuf_init(&buffer, offered, mem_ctx))
-                       return WERR_NOMEM;
-               make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
-
-               CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMFORMS,
-                           in, out, 
-                           qbuf, rbuf,
-                           spoolss_io_q_enumforms,
-                           spoolss_io_r_enumforms, 
-                           WERR_GENERAL_FAILURE );
-       }
-
-       if (!W_ERROR_IS_OK(out.status))
-               return out.status;
-
-       *num_forms = out.numofforms;
-       
-       if (!decode_forms_1(mem_ctx, out.buffer, *num_forms, forms)) {
-               return WERR_GENERAL_FAILURE;
-       }
-
-       return out.status;
-}
-
-/**********************************************************************
-**********************************************************************/
-
 WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                            POLICY_HND *hnd, uint32 level, uint32 firstjob, 
                            uint32 num_jobs, uint32 *returned, JOB_INFO_CTR *ctr)
index 78c041f863ac80bb118706b8f320e494d0c9e934..337121d70dec21f20db2653a63fb118dafe8be51 100644 (file)
@@ -828,52 +828,6 @@ bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7
        return True;
 }
 
-/*******************************************************************
- Parse a PORT_INFO_1 structure.
-********************************************************************/  
-
-bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_port_info_1");
-       depth++;        
-       
-       buffer->struct_start=prs_offset(ps);
-       
-       if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a PORT_INFO_2 structure.
-********************************************************************/  
-
-bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_port_info_2");
-       depth++;        
-       
-       buffer->struct_start=prs_offset(ps);
-       
-       if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
-               return False;
-       if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
-               return False;
-       if (!smb_io_relstr("description", buffer, depth, &info->description))
-               return False;
-       if (!prs_uint32("port_type", ps, depth, &info->port_type))
-               return False;
-       if (!prs_uint32("reserved", ps, depth, &info->reserved))
-               return False;
-
-       return True;
-}
-
 /*******************************************************************
  Parse a DRIVER_INFO_1 structure.
 ********************************************************************/
@@ -1135,162 +1089,6 @@ bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, i
        return True;
 }
 
-/*******************************************************************
-********************************************************************/  
-
-bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-       
-       prs_debug(ps, depth, desc, "smb_io_form_1");
-       depth++;
-               
-       buffer->struct_start=prs_offset(ps);
-       
-       if (!prs_uint32("flag", ps, depth, &info->flag))
-               return False;
-               
-       if (!smb_io_relstr("name", buffer, depth, &info->name))
-               return False;
-
-       if (!prs_uint32("width", ps, depth, &info->width))
-               return False;
-       if (!prs_uint32("length", ps, depth, &info->length))
-               return False;
-       if (!prs_uint32("left", ps, depth, &info->left))
-               return False;
-       if (!prs_uint32("top", ps, depth, &info->top))
-               return False;
-       if (!prs_uint32("right", ps, depth, &info->right))
-               return False;
-       if (!prs_uint32("bottom", ps, depth, &info->bottom))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a PORT_INFO_1 structure.
-********************************************************************/  
-
-bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_port_1");
-       depth++;
-
-       buffer->struct_start=prs_offset(ps);
-
-       if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a PORT_INFO_2 structure.
-********************************************************************/  
-
-bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_port_2");
-       depth++;
-
-       buffer->struct_start=prs_offset(ps);
-
-       if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
-               return False;
-       if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
-               return False;
-       if(!smb_io_relstr("description", buffer, depth, &info->description))
-               return False;
-       if(!prs_uint32("port_type", ps, depth, &info->port_type))
-               return False;
-       if(!prs_uint32("reserved", ps, depth, &info->reserved))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
-       depth++;        
-
-       buffer->struct_start=prs_offset(ps);
-       
-       if (smb_io_relstr("name", buffer, depth, &info->name))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
-       depth++;        
-
-       buffer->struct_start=prs_offset(ps);
-       
-       if (smb_io_relstr("name", buffer, depth, &info->name))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
-       depth++;        
-
-       buffer->struct_start=prs_offset(ps);
-
-       if (!smb_io_relstr("name", buffer, depth, &info->name))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
-{
-       prs_struct *ps=&buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
-       depth++;        
-
-       buffer->struct_start=prs_offset(ps);
-
-       if (!smb_io_relstr("name", buffer, depth, &info->name))
-               return False;
-       if (!smb_io_relstr("environment", buffer, depth, &info->environment))
-               return False;
-       if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
-               return False;
-
-       return True;
-}
-
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
@@ -1644,81 +1442,6 @@ uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
        return size;
 }
 
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/
-
-uint32 spoolss_size_form_1(FORM_1 *info)
-{
-       int size=0;
-
-       size+=size_of_uint32( &info->flag );
-       size+=size_of_relative_string( &info->name );
-       size+=size_of_uint32( &info->width );
-       size+=size_of_uint32( &info->length );
-       size+=size_of_uint32( &info->left );
-       size+=size_of_uint32( &info->top );
-       size+=size_of_uint32( &info->right );
-       size+=size_of_uint32( &info->bottom );
-
-       return size;
-}
-
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
-{
-       int size=0;
-
-       size+=size_of_relative_string( &info->port_name );
-
-       return size;
-}
-
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
-{
-       int size=0;
-
-       size+=size_of_relative_string( &info->port_name );
-       size+=size_of_relative_string( &info->monitor_name );
-       size+=size_of_relative_string( &info->description );
-
-       size+=size_of_uint32( &info->port_type );
-       size+=size_of_uint32( &info->reserved );
-
-       return size;
-}
-
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
-{
-       int size=0;
-       size+=size_of_relative_string( &info->name );
-
-       return size;
-}
-
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
-{
-       int size=0;
-       size+=size_of_relative_string( &info->name );
-
-       return size;
-}
-
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
@@ -1738,32 +1461,6 @@ uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
        return size;
 }
 
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
-{
-       int size=0;
-       size+=size_of_relative_string( &info->name );
-
-       return size;
-}
-
-/*******************************************************************
-return the size required by a struct in the stream
-********************************************************************/  
-
-uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
-{
-       int size=0;
-       size+=size_of_relative_string( &info->name);
-       size+=size_of_relative_string( &info->environment);
-       size+=size_of_relative_string( &info->dll_name);
-
-       return size;
-}
-
 /*******************************************************************
  * read a structure.
  * called from spoolss_getprinterdriver2 (srv_spoolss.c)
@@ -1861,24 +1558,6 @@ bool make_spoolss_q_enumprinters(
        return True;
 }
 
-/*******************************************************************
- * init a structure.
- ********************************************************************/
-
-bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u, 
-                               fstring servername, uint32 level, 
-                               RPC_BUFFER *buffer, uint32 offered)
-{
-       q_u->name_ptr = (servername != NULL) ? 1 : 0;
-       init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
-
-       q_u->level=level;
-       q_u->buffer=buffer;
-       q_u->offered=offered;
-
-       return True;
-}
-
 /*******************************************************************
  * read a structure.
  * called from spoolss_enumprinters (srv_spoolss.c)
@@ -2182,128 +1861,10 @@ bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVER
 }
 
 /*******************************************************************
-********************************************************************/  
+ make a BUFFER5 struct from a uint16*
+ ******************************************************************/
 
-bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
-{
-
-       prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;                   
-       if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
-               return False;           
-       if (!prs_uint32("level", ps, depth, &q_u->level))
-               return False;   
-       
-       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-       if (!prs_uint32("offered", ps, depth, &q_u->offered))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
-               return False;
-               
-       if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
-               return False;
-               
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a SPOOL_R_ENUMPORTS structure.
-********************************************************************/  
-
-bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("needed", ps, depth, &r_u->needed))
-               return False;
-               
-       if (!prs_uint32("returned", ps, depth, &r_u->returned))
-               return False;
-               
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;            
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-
-       if (!prs_uint32("", ps, depth, &q_u->name_ptr))
-               return False;
-       if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-       if (!prs_uint32("level", ps, depth, &q_u->level))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-       if (!prs_uint32("offered", ps, depth, &q_u->offered))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- make a BUFFER5 struct from a uint16*
- ******************************************************************/
-
-bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
+bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
 {
 
        buf5->buf_len = len;
@@ -2326,212 +1887,6 @@ bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16
 /*******************************************************************
 ********************************************************************/  
 
-bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
-{              
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("needed", ps, depth, &r_u->needed))
-               return False;
-               
-       if (!prs_uint32("returned", ps, depth, &r_u->returned))
-               return False;
-               
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;            
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
-               return False;
-       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
-               return False;
-               
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
-               return False;
-       if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
-               return False;
-       
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("level", ps, depth, &q_u->level))
-               return False;
-               
-       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-
-       if (!prs_uint32("offered", ps, depth, &q_u->offered))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
-{              
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("needed", ps, depth, &r_u->needed))
-               return False;
-               
-       if (!prs_uint32("returned", ps, depth, &r_u->returned))
-               return False;
-               
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;            
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
-               return False;
-       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
-               return False;
-               
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
-               return False;
-       if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
-               return False;
-       
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("level", ps, depth, &q_u->level))
-               return False;
-               
-       if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-
-       if (!prs_uint32("offered", ps, depth, &q_u->offered))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
- Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
-********************************************************************/  
-
-bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
-{
-       prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
-               return False;
-       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
-               return False;
-               
-       if (!prs_align(ps))
-               return False;
-                               
-       if (!prs_uint32("level", ps, depth, &q_u->level))
-               return False;
-               
-       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-
-       if (!prs_uint32("offered", ps, depth, &q_u->offered))
-               return False;
-
-       return True;
-}
-
-/*******************************************************************
-********************************************************************/  
-
-bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
-{              
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
-       depth++;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
-               return False;
-
-       if (!prs_align(ps))
-               return False;
-               
-       if (!prs_uint32("needed", ps, depth, &r_u->needed))
-               return False;
-               
-       if (!prs_uint32("returned", ps, depth, &r_u->returned))
-               return False;
-               
-       if (!prs_werror("status", ps, depth, &r_u->status))
-               return False;
-
-       return True;            
-}
-
-/*******************************************************************
-********************************************************************/  
-
 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
@@ -3083,19 +2438,3 @@ bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX
                return False;
        return True;
 }
-
-/*******************************************************************
- * init a structure.
- ********************************************************************/
-
-bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle, 
-                             uint32 level, RPC_BUFFER *buffer,
-                             uint32 offered)
-{
-        memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-        q_u->level = level;
-        q_u->buffer=buffer;
-        q_u->offered=offered;
-
-       return True;
-}
index 09b1f664401afabfe7ce91192d11906ee10bd80b..f3ee18da5a50f1f85d3c40861e2cb1103b8087f5 100644 (file)
@@ -2113,7 +2113,11 @@ bool api_pipe_schannel_process(pipes_struct *p, prs_struct *rpc_in, uint32 *p_ss
 
        auth_len = p->hdr.auth_len;
 
-       if (auth_len != RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN) {
+       if (auth_len < RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN ||
+                       auth_len > RPC_HEADER_LEN +
+                                       RPC_HDR_REQ_LEN +
+                                       RPC_HDR_AUTH_LEN +
+                                       auth_len) {
                DEBUG(0,("Incorrect auth_len %u.\n", (unsigned int)auth_len ));
                return False;
        }
index 0b8cb35a84372790730e920c3ea603e0f04e8d18..1128a856cda974a03b0a466457ca42c28c022749 100644 (file)
@@ -319,8 +319,8 @@ static DISP_INFO *get_samr_dispinfo_by_sid(DOM_SID *psid)
         * enumerate stuff, so just cache 2 entries.
         */
 
-       static struct disp_info builtin_dispinfo;
-       static struct disp_info domain_dispinfo;
+       static struct disp_info *builtin_dispinfo;
+       static struct disp_info *domain_dispinfo;
 
        /* There are two cases to consider here:
           1) The SID is a domain SID and we look for an equality match, or
@@ -335,18 +335,32 @@ static DISP_INFO *get_samr_dispinfo_by_sid(DOM_SID *psid)
                /*
                 * Necessary only once, but it does not really hurt.
                 */
-               sid_copy(&builtin_dispinfo.sid, &global_sid_Builtin);
+               if (builtin_dispinfo == NULL) {
+                       builtin_dispinfo = talloc_zero(
+                               talloc_autofree_context(), struct disp_info);
+                       if (builtin_dispinfo == NULL) {
+                               return NULL;
+                       }
+               }
+               sid_copy(&builtin_dispinfo->sid, &global_sid_Builtin);
 
-               return &builtin_dispinfo;
+               return builtin_dispinfo;
        }
 
        if (sid_check_is_domain(psid) || sid_check_is_in_our_domain(psid)) {
                /*
                 * Necessary only once, but it does not really hurt.
                 */
-               sid_copy(&domain_dispinfo.sid, get_global_sam_sid());
+               if (domain_dispinfo == NULL) {
+                       domain_dispinfo = talloc_zero(
+                               talloc_autofree_context(), struct disp_info);
+                       if (domain_dispinfo == NULL) {
+                               return NULL;
+                       }
+               }
+               sid_copy(&domain_dispinfo->sid, get_global_sam_sid());
 
-               return &domain_dispinfo;
+               return domain_dispinfo;
        }
 
        return NULL;
@@ -403,32 +417,11 @@ static void free_samr_cache(DISP_INFO *disp_info)
 
        become_root();
 
-       if (disp_info->users) {
-               DEBUG(10,("free_samr_cache: deleting users cache\n"));
-               pdb_search_destroy(disp_info->users);
-               disp_info->users = NULL;
-       }
-       if (disp_info->machines) {
-               DEBUG(10,("free_samr_cache: deleting machines cache\n"));
-               pdb_search_destroy(disp_info->machines);
-               disp_info->machines = NULL;
-       }
-       if (disp_info->groups) {
-               DEBUG(10,("free_samr_cache: deleting groups cache\n"));
-               pdb_search_destroy(disp_info->groups);
-               disp_info->groups = NULL;
-       }
-       if (disp_info->aliases) {
-               DEBUG(10,("free_samr_cache: deleting aliases cache\n"));
-               pdb_search_destroy(disp_info->aliases);
-               disp_info->aliases = NULL;
-       }
-       if (disp_info->enum_users) {
-               DEBUG(10,("free_samr_cache: deleting enum_users cache\n"));
-               pdb_search_destroy(disp_info->enum_users);
-               disp_info->enum_users = NULL;
-       }
-       disp_info->enum_acb_mask = 0;
+       TALLOC_FREE(disp_info->users);
+       TALLOC_FREE(disp_info->machines);
+       TALLOC_FREE(disp_info->groups);
+       TALLOC_FREE(disp_info->aliases);
+       TALLOC_FREE(disp_info->enum_users);
 
        unbecome_root();
 }
@@ -524,7 +517,7 @@ static uint32 count_sam_users(struct disp_info *info, uint32 acct_flags)
        }
 
        if (info->users == NULL) {
-               info->users = pdb_search_users(acct_flags);
+               info->users = pdb_search_users(info, acct_flags);
                if (info->users == NULL) {
                        return 0;
                }
@@ -548,7 +541,7 @@ static uint32 count_sam_groups(struct disp_info *info)
        }
 
        if (info->groups == NULL) {
-               info->groups = pdb_search_groups();
+               info->groups = pdb_search_groups(info);
                if (info->groups == NULL) {
                        return 0;
                }
@@ -567,7 +560,7 @@ static uint32 count_sam_aliases(struct disp_info *info)
        struct samr_displayentry *entry;
 
        if (info->aliases == NULL) {
-               info->aliases = pdb_search_aliases(&info->sid);
+               info->aliases = pdb_search_aliases(info, &info->sid);
                if (info->aliases == NULL) {
                        return 0;
                }
@@ -1012,12 +1005,12 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 
        if ((info->disp_info->enum_users != NULL) &&
            (info->disp_info->enum_acb_mask != r->in.acct_flags)) {
-               pdb_search_destroy(info->disp_info->enum_users);
-               info->disp_info->enum_users = NULL;
+               TALLOC_FREE(info->disp_info->enum_users);
        }
 
        if (info->disp_info->enum_users == NULL) {
-               info->disp_info->enum_users = pdb_search_users(r->in.acct_flags);
+               info->disp_info->enum_users = pdb_search_users(
+                       info->disp_info, r->in.acct_flags);
                info->disp_info->enum_acb_mask = r->in.acct_flags;
        }
 
@@ -1149,7 +1142,7 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
        become_root();
 
        if (info->disp_info->groups == NULL) {
-               info->disp_info->groups = pdb_search_groups();
+               info->disp_info->groups = pdb_search_groups(info->disp_info);
 
                if (info->disp_info->groups == NULL) {
                        unbecome_root();
@@ -1216,7 +1209,8 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
        become_root();
 
        if (info->disp_info->aliases == NULL) {
-               info->disp_info->aliases = pdb_search_aliases(&info->sid);
+               info->disp_info->aliases = pdb_search_aliases(
+                       info->disp_info, &info->sid);
                if (info->disp_info->aliases == NULL) {
                        unbecome_root();
                        return NT_STATUS_ACCESS_DENIED;
@@ -1547,7 +1541,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
        case 0x1:
        case 0x4:
                if (info->disp_info->users == NULL) {
-                       info->disp_info->users = pdb_search_users(ACB_NORMAL);
+                       info->disp_info->users = pdb_search_users(
+                               info->disp_info, ACB_NORMAL);
                        if (info->disp_info->users == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
@@ -1565,8 +1560,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
                break;
        case 0x2:
                if (info->disp_info->machines == NULL) {
-                       info->disp_info->machines =
-                               pdb_search_users(ACB_WSTRUST|ACB_SVRTRUST);
+                       info->disp_info->machines = pdb_search_users(
+                               info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
                        if (info->disp_info->machines == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
@@ -1585,7 +1580,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
        case 0x3:
        case 0x5:
                if (info->disp_info->groups == NULL) {
-                       info->disp_info->groups = pdb_search_groups();
+                       info->disp_info->groups = pdb_search_groups(
+                               info->disp_info);
                        if (info->disp_info->groups == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
@@ -5632,7 +5628,8 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
        switch (r->in.level) {
        case 1:
                if (info->disp_info->users == NULL) {
-                       info->disp_info->users = pdb_search_users(ACB_NORMAL);
+                       info->disp_info->users = pdb_search_users(
+                               info->disp_info, ACB_NORMAL);
                        if (info->disp_info->users == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
@@ -5651,8 +5648,8 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                break;
        case 2:
                if (info->disp_info->machines == NULL) {
-                       info->disp_info->machines =
-                               pdb_search_users(ACB_WSTRUST|ACB_SVRTRUST);
+                       info->disp_info->machines = pdb_search_users(
+                               info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
                        if (info->disp_info->machines == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
@@ -5671,7 +5668,8 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
                break;
        case 3:
                if (info->disp_info->groups == NULL) {
-                       info->disp_info->groups = pdb_search_groups();
+                       info->disp_info->groups = pdb_search_groups(
+                               info->disp_info);
                        if (info->disp_info->groups == NULL) {
                                unbecome_root();
                                return NT_STATUS_ACCESS_DENIED;
index ee36f04c6d6c34133b8b24e1bb90c4015216f950..616eb1dbf01070c73770897fd9cdb4466cc29a1e 100644 (file)
@@ -431,27 +431,7 @@ static bool api_spoolss_getform(pipes_struct *p)
 
 static bool api_spoolss_enumforms(pipes_struct *p)
 {
-       SPOOL_Q_ENUMFORMS q_u;
-       SPOOL_R_ENUMFORMS r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-
-       if (!spoolss_io_q_enumforms("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n"));
-               return False;
-       }
-
-       r_u.status = _spoolss_enumforms(p, &q_u, &r_u);
-
-       if (!spoolss_io_r_enumforms("",&r_u,rdata,0)) {
-               DEBUG(0,("spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n"));
-               return False;
-       }
-
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMFORMS);
 }
 
 /****************************************************************************
@@ -459,27 +439,7 @@ static bool api_spoolss_enumforms(pipes_struct *p)
 
 static bool api_spoolss_enumports(pipes_struct *p)
 {
-       SPOOL_Q_ENUMPORTS q_u;
-       SPOOL_R_ENUMPORTS r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-
-       if(!spoolss_io_q_enumports("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumports: unable to unmarshall SPOOL_Q_ENUMPORTS.\n"));
-               return False;
-       }
-
-       r_u.status = _spoolss_enumports(p, &q_u, &r_u);
-
-       if (!spoolss_io_r_enumports("",&r_u,rdata,0)) {
-               DEBUG(0,("spoolss_io_r_enumports: unable to marshall SPOOL_R_ENUMPORTS.\n"));
-               return False;
-       }
-
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMPORTS);
 }
 
 /****************************************************************************
@@ -597,27 +557,7 @@ static bool api_spoolss_setform(pipes_struct *p)
 
 static bool api_spoolss_enumprintprocessors(pipes_struct *p)
 {
-       SPOOL_Q_ENUMPRINTPROCESSORS q_u;
-       SPOOL_R_ENUMPRINTPROCESSORS r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-       
-       if(!spoolss_io_q_enumprintprocessors("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumprintprocessors: unable to unmarshall SPOOL_Q_ENUMPRINTPROCESSORS.\n"));
-               return False;
-       }
-       
-       r_u.status = _spoolss_enumprintprocessors(p, &q_u, &r_u);
-
-       if(!spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0)) {
-               DEBUG(0,("spoolss_io_r_enumprintprocessors: unable to marshall SPOOL_R_ENUMPRINTPROCESSORS.\n"));
-               return False;
-       }
-       
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMPRINTPROCESSORS);
 }
 
 /****************************************************************************
@@ -633,27 +573,7 @@ static bool api_spoolss_addprintprocessor(pipes_struct *p)
 
 static bool api_spoolss_enumprintprocdatatypes(pipes_struct *p)
 {
-       SPOOL_Q_ENUMPRINTPROCDATATYPES q_u;
-       SPOOL_R_ENUMPRINTPROCDATATYPES r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-       
-       if(!spoolss_io_q_enumprintprocdatatypes("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumprintprocdatatypes: unable to unmarshall SPOOL_Q_ENUMPRINTPROCDATATYPES.\n"));
-               return False;
-       }
-       
-       r_u.status = _spoolss_enumprintprocdatatypes(p, &q_u, &r_u);
-
-       if(!spoolss_io_r_enumprintprocdatatypes("", &r_u, rdata, 0)) {
-               DEBUG(0,("spoolss_io_r_enumprintprocdatatypes: unable to marshall SPOOL_R_ENUMPRINTPROCDATATYPES.\n"));
-               return False;
-       }
-       
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMPRINTPROCDATATYPES);
 }
 
 /****************************************************************************
@@ -661,27 +581,7 @@ static bool api_spoolss_enumprintprocdatatypes(pipes_struct *p)
 
 static bool api_spoolss_enumprintmonitors(pipes_struct *p)
 {
-       SPOOL_Q_ENUMPRINTMONITORS q_u;
-       SPOOL_R_ENUMPRINTMONITORS r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-       
-       if (!spoolss_io_q_enumprintmonitors("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_enumprintmonitors: unable to unmarshall SPOOL_Q_ENUMPRINTMONITORS.\n"));
-               return False;
-       }
-               
-       r_u.status = _spoolss_enumprintmonitors(p, &q_u, &r_u);
-
-       if (!spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0)) {
-               DEBUG(0,("spoolss_io_r_enumprintmonitors: unable to marshall SPOOL_R_ENUMPRINTMONITORS.\n"));
-               return False;
-       }
-       
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMMONITORS);
 }
 
 /****************************************************************************
index 814f406e8702948eb6302bb48aeae24806278a33..0a4f5ae05ce6688f32be454b1810f665eb64c787 100644 (file)
@@ -7244,21 +7244,6 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS
 /****************************************************************************
 ****************************************************************************/
 
-static void fill_form_1(FORM_1 *form, nt_forms_struct *list)
-{
-       form->flag=list->flag;
-       init_unistr(&form->name, list->name);
-       form->width=list->width;
-       form->length=list->length;
-       form->left=list->left;
-       form->top=list->top;
-       form->right=list->right;
-       form->bottom=list->bottom;
-}
-
-/****************************************************************************
-****************************************************************************/
-
 static WERROR fill_form_info_1(TALLOC_CTX *mem_ctx,
                               struct spoolss_FormInfo1 *form,
                               nt_forms_struct *list)
@@ -7277,73 +7262,65 @@ static WERROR fill_form_info_1(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
-/****************************************************************************
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumForms
+****************************************************************/
 
-WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMFORMS *r_u)
+WERROR _spoolss_EnumForms(pipes_struct *p,
+                         struct spoolss_EnumForms *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
-       uint32 *numofforms = &r_u->numofforms;
-       uint32 numbuiltinforms;
-
        nt_forms_struct *list=NULL;
        nt_forms_struct *builtinlist=NULL;
-       FORM_1 *forms_1;
-       int buffer_size=0;
+       union spoolss_FormInfo *info;
+       uint32_t count;
+       uint32_t numbuiltinforms;
+       size_t buffer_size = 0;
        int i;
 
-       /* that's an [in out] buffer */
+       *r->out.count = 0;
 
-       if (!q_u->buffer && (offered!=0) ) {
-               return WERR_INVALID_PARAM;
-       }
+       /* that's an [in out] buffer */
 
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (!r->in.buffer && (r->in.offered != 0) ) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
-
-       DEBUG(4,("_spoolss_enumforms\n"));
-       DEBUGADD(5,("Offered buffer size [%d]\n", offered));
-       DEBUGADD(5,("Info level [%d]\n",          level));
+       DEBUG(4,("_spoolss_EnumForms\n"));
+       DEBUGADD(5,("Offered buffer size [%d]\n", r->in.offered));
+       DEBUGADD(5,("Info level [%d]\n",          r->in.level));
 
        numbuiltinforms = get_builtin_ntforms(&builtinlist);
        DEBUGADD(5,("Number of builtin forms [%d]\n",     numbuiltinforms));
-       *numofforms = get_ntforms(&list);
-       DEBUGADD(5,("Number of user forms [%d]\n",     *numofforms));
-       *numofforms += numbuiltinforms;
+       count = get_ntforms(&list);
+       DEBUGADD(5,("Number of user forms [%d]\n",     count));
+       count += numbuiltinforms;
 
-       if (*numofforms == 0) {
+       if (count == 0) {
                SAFE_FREE(builtinlist);
                SAFE_FREE(list);
                return WERR_NO_MORE_ITEMS;
        }
 
-       switch (level) {
-       case 1:
-               if ((forms_1=SMB_MALLOC_ARRAY(FORM_1, *numofforms)) == NULL) {
-                       SAFE_FREE(builtinlist);
-                       SAFE_FREE(list);
-                       *numofforms=0;
-                       return WERR_NOMEM;
-               }
+       info = TALLOC_ARRAY(p->mem_ctx, union spoolss_FormInfo, count);
+       if (!info) {
+               SAFE_FREE(builtinlist);
+               SAFE_FREE(list);
+               return WERR_NOMEM;
+       }
 
+       switch (r->in.level) {
+       case 1:
                /* construct the list of form structures */
                for (i=0; i<numbuiltinforms; i++) {
                        DEBUGADD(6,("Filling form number [%d]\n",i));
-                       fill_form_1(&forms_1[i], &builtinlist[i]);
+                       fill_form_info_1(info, &info[i].info1, &builtinlist[i]);
                }
 
                SAFE_FREE(builtinlist);
 
-               for (; i<*numofforms; i++) {
+               for (; i<count; i++) {
                        DEBUGADD(6,("Filling form number [%d]\n",i));
-                       fill_form_1(&forms_1[i], &list[i-numbuiltinforms]);
+                       fill_form_info_1(info, &info[i].info1, &list[i-numbuiltinforms]);
                }
 
                SAFE_FREE(list);
@@ -7351,38 +7328,22 @@ WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
                /* check the required size. */
                for (i=0; i<numbuiltinforms; i++) {
                        DEBUGADD(6,("adding form [%d]'s size\n",i));
-                       buffer_size += spoolss_size_form_1(&forms_1[i]);
+                       buffer_size += ndr_size_spoolss_FormInfo1(&info[i].info1, NULL, 0);
                }
-               for (; i<*numofforms; i++) {
+               for (; i<count; i++) {
                        DEBUGADD(6,("adding form [%d]'s size\n",i));
-                       buffer_size += spoolss_size_form_1(&forms_1[i]);
+                       buffer_size += ndr_size_spoolss_FormInfo1(&info[i].info1, NULL, 0);
                }
 
-               *needed=buffer_size;
+               *r->out.needed = buffer_size;
 
-               if (*needed > offered) {
-                       SAFE_FREE(forms_1);
-                       *numofforms=0;
+               if (*r->out.needed > r->in.offered) {
+                       TALLOC_FREE(info);
                        return WERR_INSUFFICIENT_BUFFER;
                }
 
-               if (!rpcbuf_alloc_size(buffer, buffer_size)){
-                       SAFE_FREE(forms_1);
-                       *numofforms=0;
-                       return WERR_NOMEM;
-               }
-
-               /* fill the buffer with the form structures */
-               for (i=0; i<numbuiltinforms; i++) {
-                       DEBUGADD(6,("adding form [%d] to buffer\n",i));
-                       smb_io_form_1("", buffer, &forms_1[i], 0);
-               }
-               for (; i<*numofforms; i++) {
-                       DEBUGADD(6,("adding form [%d] to buffer\n",i));
-                       smb_io_form_1("", buffer, &forms_1[i], 0);
-               }
-
-               SAFE_FREE(forms_1);
+               *r->out.count = count;
+               *r->out.info = info;
 
                return WERR_OK;
 
@@ -7485,9 +7446,14 @@ WERROR _spoolss_GetForm(pipes_struct *p,
 /****************************************************************************
 ****************************************************************************/
 
-static void fill_port_1(PORT_INFO_1 *port, const char *name)
+static WERROR fill_port_1(TALLOC_CTX *mem_ctx,
+                         struct spoolss_PortInfo1 *r,
+                         const char *name)
 {
-       init_unistr(&port->port_name, name);
+       r->port_name = talloc_strdup(mem_ctx, name);
+       W_ERROR_HAVE_NO_MEMORY(r->port_name);
+
+       return WERR_OK;
 }
 
 /****************************************************************************
@@ -7495,13 +7461,23 @@ static void fill_port_1(PORT_INFO_1 *port, const char *name)
  somehow.
 ****************************************************************************/
 
-static void fill_port_2(PORT_INFO_2 *port, const char *name)
+static WERROR fill_port_2(TALLOC_CTX *mem_ctx,
+                         struct spoolss_PortInfo2 *r,
+                         const char *name)
 {
-       init_unistr(&port->port_name, name);
-       init_unistr(&port->monitor_name, "Local Monitor");
-       init_unistr(&port->description, SPL_LOCAL_PORT );
-       port->port_type=PORT_TYPE_WRITE;
-       port->reserved=0x0;
+       r->port_name = talloc_strdup(mem_ctx, name);
+       W_ERROR_HAVE_NO_MEMORY(r->port_name);
+
+       r->monitor_name = talloc_strdup(mem_ctx, "Local Monitor");
+       W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
+
+       r->description = talloc_strdup(mem_ctx, SPL_LOCAL_PORT); /* FIXME */
+       W_ERROR_HAVE_NO_MEMORY(r->description);
+
+       r->port_type = SPOOLSS_PORT_TYPE_WRITE;
+       r->reserved = 0;
+
+       return WERR_OK;
 }
 
 
@@ -7569,9 +7545,13 @@ WERROR enumports_hook(TALLOC_CTX *ctx, int *count, char ***lines )
  enumports level 1.
 ****************************************************************************/
 
-static WERROR enumports_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumports_level_1(TALLOC_CTX *mem_ctx,
+                               union spoolss_PortInfo **info_p,
+                               uint32_t offered,
+                               uint32_t *needed,
+                               uint32_t *count)
 {
-       PORT_INFO_1 *ports=NULL;
+       union spoolss_PortInfo *info = NULL;
        int i=0;
        WERROR result = WERR_OK;
        char **qlines = NULL;
@@ -7579,31 +7559,31 @@ static WERROR enumports_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *need
 
        result = enumports_hook(talloc_tos(), &numlines, &qlines );
        if (!W_ERROR_IS_OK(result)) {
-               TALLOC_FREE(qlines);
-               return result;
+               goto out;
        }
 
-       if(numlines) {
-               if((ports=SMB_MALLOC_ARRAY( PORT_INFO_1, numlines )) == NULL) {
-                       DEBUG(10,("Returning WERR_NOMEM [%s]\n",
-                                 win_errstr(WERR_NOMEM)));
-                       TALLOC_FREE(qlines);
-                       return WERR_NOMEM;
+       if (numlines) {
+               info = TALLOC_ARRAY(mem_ctx, union spoolss_PortInfo, numlines);
+               if (!info) {
+                       DEBUG(10,("Returning WERR_NOMEM\n"));
+                       result = WERR_NOMEM;
+                       goto out;
                }
 
                for (i=0; i<numlines; i++) {
                        DEBUG(6,("Filling port number [%d] with port [%s]\n", i, qlines[i]));
-                       fill_port_1(&ports[i], qlines[i]);
+                       result = fill_port_1(info, &info[i].info1, qlines[i]);
+                       if (!W_ERROR_IS_OK(result)) {
+                               goto out;
+                       }
                }
        }
        TALLOC_FREE(qlines);
 
-       *returned = numlines;
-
        /* check the required size. */
-       for (i=0; i<*returned; i++) {
+       for (i=0; i<numlines; i++) {
                DEBUGADD(6,("adding port [%d]'s size\n", i));
-               *needed += spoolss_size_port_info_1(&ports[i]);
+               *needed += ndr_size_spoolss_PortInfo1(&info[i].info1, NULL, 0);
        }
 
        if (*needed > offered) {
@@ -7611,64 +7591,64 @@ static WERROR enumports_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *need
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
-       }
-
-       /* fill the buffer with the ports structures */
-       for (i=0; i<*returned; i++) {
-               DEBUGADD(6,("adding port [%d] to buffer\n", i));
-               smb_io_port_1("", buffer, &ports[i], 0);
-       }
-
 out:
-       SAFE_FREE(ports);
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               TALLOC_FREE(qlines);
+               *count = 0;
+               *info_p = NULL;
+               return result;
+       }
 
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
+       *count = numlines;
 
-       return result;
+       return WERR_OK;
 }
 
 /****************************************************************************
  enumports level 2.
 ****************************************************************************/
 
-static WERROR enumports_level_2(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumports_level_2(TALLOC_CTX *mem_ctx,
+                               union spoolss_PortInfo **info_p,
+                               uint32_t offered,
+                               uint32_t *needed,
+                               uint32_t *count)
 {
-       PORT_INFO_2 *ports=NULL;
+       union spoolss_PortInfo *info = NULL;
        int i=0;
        WERROR result = WERR_OK;
        char **qlines = NULL;
        int numlines = 0;
 
        result = enumports_hook(talloc_tos(), &numlines, &qlines );
-       if ( !W_ERROR_IS_OK(result)) {
-               TALLOC_FREE(qlines);
-               return result;
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
        }
 
-       if(numlines) {
-               if((ports=SMB_MALLOC_ARRAY( PORT_INFO_2, numlines)) == NULL) {
-                       TALLOC_FREE(qlines);
-                       return WERR_NOMEM;
+       if (numlines) {
+               info = TALLOC_ARRAY(mem_ctx, union spoolss_PortInfo, numlines);
+               if (!info) {
+                       DEBUG(10,("Returning WERR_NOMEM\n"));
+                       result = WERR_NOMEM;
+                       goto out;
                }
 
                for (i=0; i<numlines; i++) {
                        DEBUG(6,("Filling port number [%d] with port [%s]\n", i, qlines[i]));
-                       fill_port_2(&(ports[i]), qlines[i]);
+                       result = fill_port_2(info, &info[i].info2, qlines[i]);
+                       if (!W_ERROR_IS_OK(result)) {
+                               goto out;
+                       }
                }
        }
-
        TALLOC_FREE(qlines);
 
-       *returned = numlines;
-
        /* check the required size. */
-       for (i=0; i<*returned; i++) {
+       for (i=0; i<numlines; i++) {
                DEBUGADD(6,("adding port [%d]'s size\n", i));
-               *needed += spoolss_size_port_info_2(&ports[i]);
+               *needed += ndr_size_spoolss_PortInfo2(&info[i].info2, NULL, 0);
        }
 
        if (*needed > offered) {
@@ -7676,61 +7656,49 @@ static WERROR enumports_level_2(RPC_BUFFER *buffer, uint32 offered, uint32 *need
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
-       }
-
-       /* fill the buffer with the ports structures */
-       for (i=0; i<*returned; i++) {
-               DEBUGADD(6,("adding port [%d] to buffer\n", i));
-               smb_io_port_2("", buffer, &ports[i], 0);
-       }
-
 out:
-       SAFE_FREE(ports);
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               TALLOC_FREE(qlines);
+               *count = 0;
+               *info_p = NULL;
+               return result;
+       }
 
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
+       *count = numlines;
 
-       return result;
+       return WERR_OK;
 }
 
-/****************************************************************************
- enumports.
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumPorts
+****************************************************************/
 
-WERROR _spoolss_enumports( pipes_struct *p, SPOOL_Q_ENUMPORTS *q_u, SPOOL_R_ENUMPORTS *r_u)
+WERROR _spoolss_EnumPorts(pipes_struct *p,
+                         struct spoolss_EnumPorts *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
-       uint32 *returned = &r_u->returned;
-
        /* that's an [in out] buffer */
 
-       if (!q_u->buffer && (offered!=0)) {
-               return WERR_INVALID_PARAM;
-       }
-
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (!r->in.buffer && (r->in.offered != 0)) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
-
-       DEBUG(4,("_spoolss_enumports\n"));
+       DEBUG(4,("_spoolss_EnumPorts\n"));
 
-       *returned=0;
-       *needed=0;
+       *r->out.count = 0;
+       *r->out.needed = 0;
+       *r->out.info = NULL;
 
-       switch (level) {
+       switch (r->in.level) {
        case 1:
-               return enumports_level_1(buffer, offered, needed, returned);
+               return enumports_level_1(p->mem_ctx, r->out.info,
+                                        r->in.offered, r->out.needed,
+                                        r->out.count);
        case 2:
-               return enumports_level_2(buffer, offered, needed, returned);
+               return enumports_level_2(p->mem_ctx, r->out.info,
+                                        r->in.offered, r->out.needed,
+                                        r->out.count);
        default:
                return WERR_UNKNOWN_LEVEL;
        }
@@ -8769,70 +8737,76 @@ done:
        return status;
 }
 
+/****************************************************************************
+ fill_print_processor1
+****************************************************************************/
+
+static WERROR fill_print_processor1(TALLOC_CTX *mem_ctx,
+                                   struct spoolss_PrintProcessorInfo1 *r,
+                                   const char *print_processor_name)
+{
+       r->print_processor_name = talloc_strdup(mem_ctx, print_processor_name);
+       W_ERROR_HAVE_NO_MEMORY(r->print_processor_name);
+
+       return WERR_OK;
+}
+
 /****************************************************************************
  enumprintprocessors level 1.
 ****************************************************************************/
 
-static WERROR enumprintprocessors_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumprintprocessors_level_1(TALLOC_CTX *mem_ctx,
+                                         union spoolss_PrintProcessorInfo **info_p,
+                                         uint32_t offered,
+                                         uint32_t *needed,
+                                         uint32_t *count)
 {
-       PRINTPROCESSOR_1 *info_1=NULL;
-       WERROR result = WERR_OK;
+       union spoolss_PrintProcessorInfo *info;
+       WERROR result;
 
-       if((info_1 = SMB_MALLOC_P(PRINTPROCESSOR_1)) == NULL)
-               return WERR_NOMEM;
+       info = TALLOC_ARRAY(mem_ctx, union spoolss_PrintProcessorInfo, 1);
+       W_ERROR_HAVE_NO_MEMORY(info);
 
-       (*returned) = 0x1;
+       *count = 1;
 
-       init_unistr(&info_1->name, "winprint");
+       result = fill_print_processor1(info, &info[0].info1, "winprint");
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
+       }
 
-       *needed += spoolss_size_printprocessor_info_1(info_1);
+       *needed += ndr_size_spoolss_PrintProcessorInfo1(&info[0].info1, NULL, 0);
 
        if (*needed > offered) {
                result = WERR_INSUFFICIENT_BUFFER;
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
+ out:
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               *count = 0;
+               return result;
        }
 
-       smb_io_printprocessor_info_1("", buffer, info_1, 0);
-
-out:
-       SAFE_FREE(info_1);
-
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
 
-       return result;
+       return WERR_OK;
 }
 
-/****************************************************************************
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumPrintProcessors
+****************************************************************/
 
-WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, SPOOL_R_ENUMPRINTPROCESSORS *r_u)
+WERROR _spoolss_EnumPrintProcessors(pipes_struct *p,
+                                   struct spoolss_EnumPrintProcessors *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
-       uint32 *returned = &r_u->returned;
-
        /* that's an [in out] buffer */
 
-       if (!q_u->buffer && (offered!=0)) {
-               return WERR_INVALID_PARAM;
-       }
-
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (!r->in.buffer && (r->in.offered != 0)) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
-
-       DEBUG(5,("spoolss_enumprintprocessors\n"));
+       DEBUG(5,("_spoolss_EnumPrintProcessors\n"));
 
        /*
         * Enumerate the print processors ...
@@ -8841,213 +8815,261 @@ WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS
         * and I can use my nice printer checker.
         */
 
-       *returned=0;
-       *needed=0;
+       *r->out.count = 0;
+       *r->out.needed = 0;
+       *r->out.info = NULL;
 
-       switch (level) {
+       switch (r->in.level) {
        case 1:
-               return enumprintprocessors_level_1(buffer, offered, needed, returned);
+               return enumprintprocessors_level_1(p->mem_ctx, r->out.info,
+                                                  r->in.offered, r->out.needed,
+                                                  r->out.count);
        default:
                return WERR_UNKNOWN_LEVEL;
        }
 }
 
+/****************************************************************************
+ fill_printprocdatatype1
+****************************************************************************/
+
+static WERROR fill_printprocdatatype1(TALLOC_CTX *mem_ctx,
+                                     struct spoolss_PrintProcDataTypesInfo1 *r,
+                                     const char *name_array)
+{
+       r->name_array = talloc_strdup(mem_ctx, name_array);
+       W_ERROR_HAVE_NO_MEMORY(r->name_array);
+
+       return WERR_OK;
+}
+
 /****************************************************************************
  enumprintprocdatatypes level 1.
 ****************************************************************************/
 
-static WERROR enumprintprocdatatypes_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumprintprocdatatypes_level_1(TALLOC_CTX *mem_ctx,
+                                            union spoolss_PrintProcDataTypesInfo **info_p,
+                                            uint32_t offered,
+                                            uint32_t *needed,
+                                            uint32_t *count)
 {
-       PRINTPROCDATATYPE_1 *info_1=NULL;
-       WERROR result = WERR_OK;
+       WERROR result;
+       union spoolss_PrintProcDataTypesInfo *info;
 
-       if((info_1 = SMB_MALLOC_P(PRINTPROCDATATYPE_1)) == NULL)
-               return WERR_NOMEM;
+       info = TALLOC_ARRAY(mem_ctx, union spoolss_PrintProcDataTypesInfo, 1);
+       W_ERROR_HAVE_NO_MEMORY(info);
 
-       (*returned) = 0x1;
+       *count = 1;
 
-       init_unistr(&info_1->name, "RAW");
+       result = fill_printprocdatatype1(info, &info[0].info1, "RAW");
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
+       }
 
-       *needed += spoolss_size_printprocdatatype_info_1(info_1);
+       *needed += ndr_size_spoolss_PrintProcDataTypesInfo1(&info[0].info1, NULL, 0);
 
        if (*needed > offered) {
                result = WERR_INSUFFICIENT_BUFFER;
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
+ out:
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               *count = 0;
+               return result;
        }
 
-       smb_io_printprocdatatype_info_1("", buffer, info_1, 0);
-
-out:
-       SAFE_FREE(info_1);
-
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
 
-       return result;
+       return WERR_OK;
 }
 
-/****************************************************************************
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumPrintProcDataTypes
+****************************************************************/
 
-WERROR _spoolss_enumprintprocdatatypes(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u)
+WERROR _spoolss_EnumPrintProcDataTypes(pipes_struct *p,
+                                      struct spoolss_EnumPrintProcDataTypes *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
-       uint32 *returned = &r_u->returned;
-
        /* that's an [in out] buffer */
 
-       if (!q_u->buffer && (offered!=0)) {
-               return WERR_INVALID_PARAM;
-       }
-
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (!r->in.buffer && (r->in.offered != 0)) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
-
-       DEBUG(5,("_spoolss_enumprintprocdatatypes\n"));
+       DEBUG(5,("_spoolss_EnumPrintProcDataTypes\n"));
 
-       *returned=0;
-       *needed=0;
+       *r->out.count = 0;
+       *r->out.needed = 0;
+       *r->out.info = NULL;
 
-       switch (level) {
+       switch (r->in.level) {
        case 1:
-               return enumprintprocdatatypes_level_1(buffer, offered, needed, returned);
+               return enumprintprocdatatypes_level_1(p->mem_ctx, r->out.info,
+                                                     r->in.offered, r->out.needed,
+                                                     r->out.count);
        default:
                return WERR_UNKNOWN_LEVEL;
        }
 }
 
+/****************************************************************************
+ fill_monitor_1
+****************************************************************************/
+
+static WERROR fill_monitor_1(TALLOC_CTX *mem_ctx,
+                            struct spoolss_MonitorInfo1 *r,
+                            const char *monitor_name)
+{
+       r->monitor_name                 = talloc_strdup(mem_ctx, monitor_name);
+       W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
+
+       return WERR_OK;
+}
+
+/****************************************************************************
+ fill_monitor_2
+****************************************************************************/
+
+static WERROR fill_monitor_2(TALLOC_CTX *mem_ctx,
+                            struct spoolss_MonitorInfo2 *r,
+                            const char *monitor_name,
+                            const char *environment,
+                            const char *dll_name)
+{
+       r->monitor_name                 = talloc_strdup(mem_ctx, monitor_name);
+       W_ERROR_HAVE_NO_MEMORY(r->monitor_name);
+       r->environment                  = talloc_strdup(mem_ctx, environment);
+       W_ERROR_HAVE_NO_MEMORY(r->environment);
+       r->dll_name                     = talloc_strdup(mem_ctx, dll_name);
+       W_ERROR_HAVE_NO_MEMORY(r->dll_name);
+
+       return WERR_OK;
+}
+
 /****************************************************************************
  enumprintmonitors level 1.
 ****************************************************************************/
 
-static WERROR enumprintmonitors_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumprintmonitors_level_1(TALLOC_CTX *mem_ctx,
+                                       union spoolss_MonitorInfo **info_p,
+                                       uint32_t offered,
+                                       uint32_t *needed,
+                                       uint32_t *count)
 {
-       PRINTMONITOR_1 *info_1;
+       union spoolss_MonitorInfo *info;
        WERROR result = WERR_OK;
        int i;
 
-       if((info_1 = SMB_MALLOC_ARRAY(PRINTMONITOR_1, 2)) == NULL)
-               return WERR_NOMEM;
-
-       *returned = 2;
+       info = TALLOC_ARRAY(mem_ctx, union spoolss_MonitorInfo, 2);
+       W_ERROR_HAVE_NO_MEMORY(info);
 
-       init_unistr(&(info_1[0].name), SPL_LOCAL_PORT );
-       init_unistr(&(info_1[1].name), SPL_TCPIP_PORT );
+       *count = 2;
 
-       for ( i=0; i<*returned; i++ ) {
-               *needed += spoolss_size_printmonitor_info_1(&info_1[i]);
+       result = fill_monitor_1(info, &info[0].info1,
+                               SPL_LOCAL_PORT /* FIXME */);
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
        }
 
-       if (*needed > offered) {
-               result = WERR_INSUFFICIENT_BUFFER;
+       result = fill_monitor_1(info, &info[1].info1,
+                               SPL_TCPIP_PORT /* FIXME */);
+       if (!W_ERROR_IS_OK(result)) {
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
+       for (i=0; i<*count; i++) {
+               *needed += ndr_size_spoolss_MonitorInfo1(&info[i].info1, NULL, 0);
        }
 
-       for ( i=0; i<*returned; i++ ) {
-               smb_io_printmonitor_info_1("", buffer, &info_1[i], 0);
+       if (*needed > offered) {
+               result = WERR_INSUFFICIENT_BUFFER;
+               goto out;
        }
 
 out:
-       SAFE_FREE(info_1);
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               *count = 0;
+               return result;
+       }
 
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
 
-       return result;
+       return WERR_OK;
 }
 
 /****************************************************************************
  enumprintmonitors level 2.
 ****************************************************************************/
 
-static WERROR enumprintmonitors_level_2(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+static WERROR enumprintmonitors_level_2(TALLOC_CTX *mem_ctx,
+                                       union spoolss_MonitorInfo **info_p,
+                                       uint32_t offered,
+                                       uint32_t *needed,
+                                       uint32_t *count)
 {
-       PRINTMONITOR_2 *info_2;
+       union spoolss_MonitorInfo *info;
        WERROR result = WERR_OK;
        int i;
 
-       if((info_2 = SMB_MALLOC_ARRAY(PRINTMONITOR_2, 2)) == NULL)
-               return WERR_NOMEM;
-
-       *returned = 2;
-
-       init_unistr( &(info_2[0].name), SPL_LOCAL_PORT );
-       init_unistr( &(info_2[0].environment), "Windows NT X86" );
-       init_unistr( &(info_2[0].dll_name), "localmon.dll" );
+       info = TALLOC_ARRAY(mem_ctx, union spoolss_MonitorInfo, 2);
+       W_ERROR_HAVE_NO_MEMORY(info);
 
-       init_unistr( &(info_2[1].name), SPL_TCPIP_PORT );
-       init_unistr( &(info_2[1].environment), "Windows NT X86" );
-       init_unistr( &(info_2[1].dll_name), "tcpmon.dll" );
+       *count = 2;
 
-       for ( i=0; i<*returned; i++ ) {
-               *needed += spoolss_size_printmonitor_info_2(&info_2[i]);
+       result = fill_monitor_2(info, &info[0].info2,
+                               SPL_LOCAL_PORT, /* FIXME */
+                               "Windows NT X86", /* FIXME */
+                               "localmon.dll");
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
        }
 
-       if (*needed > offered) {
-               result = WERR_INSUFFICIENT_BUFFER;
+       result = fill_monitor_2(info, &info[1].info2,
+                               SPL_TCPIP_PORT, /* FIXME */
+                               "Windows NT X86", /* FIXME */
+                               "tcpmon.dll");
+       if (!W_ERROR_IS_OK(result)) {
                goto out;
        }
 
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_NOMEM;
-               goto out;
+       for (i=0; i<*count; i++) {
+               *needed += ndr_size_spoolss_MonitorInfo2(&info[i].info2, NULL, 0);
        }
 
-       for ( i=0; i<*returned; i++ ) {
-               smb_io_printmonitor_info_2("", buffer, &info_2[i], 0);
+       if (*needed > offered) {
+               result = WERR_INSUFFICIENT_BUFFER;
+               goto out;
        }
 
 out:
-       SAFE_FREE(info_2);
+       if (!W_ERROR_IS_OK(result)) {
+               TALLOC_FREE(info);
+               *count = 0;
+               return result;
+       }
 
-       if ( !W_ERROR_IS_OK(result) )
-               *returned = 0;
+       *info_p = info;
 
-       return result;
+       return WERR_OK;
 }
 
-/****************************************************************************
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumMonitors
+****************************************************************/
 
-WERROR _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_u, SPOOL_R_ENUMPRINTMONITORS *r_u)
+WERROR _spoolss_EnumMonitors(pipes_struct *p,
+                            struct spoolss_EnumMonitors *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
-       uint32 *returned = &r_u->returned;
-
        /* that's an [in out] buffer */
 
-       if (!q_u->buffer && (offered!=0)) {
-               return WERR_INVALID_PARAM;
-       }
-
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (!r->in.buffer && (r->in.offered != 0)) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
-
-       DEBUG(5,("spoolss_enumprintmonitors\n"));
+       DEBUG(5,("_spoolss_EnumMonitors\n"));
 
        /*
         * Enumerate the print monitors ...
@@ -9056,14 +9078,19 @@ WERROR _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_
         * and I can use my nice printer checker.
         */
 
-       *returned=0;
-       *needed=0;
+       *r->out.count = 0;
+       *r->out.needed = 0;
+       *r->out.info = NULL;
 
-       switch (level) {
+       switch (r->in.level) {
        case 1:
-               return enumprintmonitors_level_1(buffer, offered, needed, returned);
+               return enumprintmonitors_level_1(p->mem_ctx, r->out.info,
+                                                r->in.offered, r->out.needed,
+                                                r->out.count);
        case 2:
-               return enumprintmonitors_level_2(buffer, offered, needed, returned);
+               return enumprintmonitors_level_2(p->mem_ctx, r->out.info,
+                                                r->in.offered, r->out.needed,
+                                                r->out.count);
        default:
                return WERR_UNKNOWN_LEVEL;
        }
@@ -10103,7 +10130,7 @@ WERROR _spoolss_XcvData(pipes_struct *p,
                        struct spoolss_XcvData *r)
 {
        Printer_entry *Printer = find_printer_index_by_hnd(p, r->in.handle);
-       DATA_BLOB out_data;
+       DATA_BLOB out_data = data_blob_null;
        WERROR werror;
 
        if (!Printer) {
@@ -10257,17 +10284,6 @@ WERROR _spoolss_GetPrinterDriver(pipes_struct *p,
        return WERR_NOT_SUPPORTED;
 }
 
-/****************************************************************
- _spoolss_EnumPrintProcessors
-****************************************************************/
-
-WERROR _spoolss_EnumPrintProcessors(pipes_struct *p,
-                                   struct spoolss_EnumPrintProcessors *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
 /****************************************************************
  _spoolss_ReadPrinter
 ****************************************************************/
@@ -10312,39 +10328,6 @@ WERROR _spoolss_WaitForPrinterChange(pipes_struct *p,
        return WERR_NOT_SUPPORTED;
 }
 
-/****************************************************************
- _spoolss_EnumForms
-****************************************************************/
-
-WERROR _spoolss_EnumForms(pipes_struct *p,
-                         struct spoolss_EnumForms *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
-/****************************************************************
- _spoolss_EnumPorts
-****************************************************************/
-
-WERROR _spoolss_EnumPorts(pipes_struct *p,
-                         struct spoolss_EnumPorts *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
-/****************************************************************
- _spoolss_EnumMonitors
-****************************************************************/
-
-WERROR _spoolss_EnumMonitors(pipes_struct *p,
-                            struct spoolss_EnumMonitors *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
 /****************************************************************
  _spoolss_AddPort
 ****************************************************************/
@@ -10499,17 +10482,6 @@ WERROR _spoolss_DeletePrintProvidor(pipes_struct *p,
        return WERR_NOT_SUPPORTED;
 }
 
-/****************************************************************
- _spoolss_EnumPrintProcDataTypes
-****************************************************************/
-
-WERROR _spoolss_EnumPrintProcDataTypes(pipes_struct *p,
-                                      struct spoolss_EnumPrintProcDataTypes *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
 /****************************************************************
  _spoolss_GetPrinterDriver2
 ****************************************************************/
index 5b55ac3e2a1212786b36dd37a7ec6eb0bf3664a9..6cbdf89583fc9e1b4e12837955cdab9ebf5fa818 100644 (file)
@@ -359,55 +359,45 @@ static WERROR cmd_spoolss_enum_printers(struct rpc_pipe_client *cli,
 /****************************************************************************
 ****************************************************************************/
 
-static void display_port_info_1(PORT_INFO_1 *i1)
+static void display_port_info_1(struct spoolss_PortInfo1 *r)
 {
-       fstring buffer;
-
-       rpcstr_pull(buffer, i1->port_name.buffer, sizeof(buffer), -1, STR_TERMINATE);
-       printf("\tPort Name:\t[%s]\n", buffer);
+       printf("\tPort Name:\t[%s]\n", r->port_name);
 }
 
 /****************************************************************************
 ****************************************************************************/
 
-static void display_port_info_2(PORT_INFO_2 *i2)
+static void display_port_info_2(struct spoolss_PortInfo2 *r)
 {
-       fstring buffer;
-
-       rpcstr_pull(buffer, i2->port_name.buffer, sizeof(buffer), -1, STR_TERMINATE);
-       printf("\tPort Name:\t[%s]\n", buffer);
-       rpcstr_pull(buffer, i2->monitor_name.buffer, sizeof(buffer), -1, STR_TERMINATE);
-
-       printf("\tMonitor Name:\t[%s]\n", buffer);
-       rpcstr_pull(buffer, i2->description.buffer, sizeof(buffer), -1, STR_TERMINATE);
-
-       printf("\tDescription:\t[%s]\n", buffer);
+       printf("\tPort Name:\t[%s]\n", r->port_name);
+       printf("\tMonitor Name:\t[%s]\n", r->monitor_name);
+       printf("\tDescription:\t[%s]\n", r->description);
        printf("\tPort Type:\t" );
-       if ( i2->port_type ) {
+       if (r->port_type) {
                int comma = 0; /* hack */
                printf( "[" );
-               if ( i2->port_type & PORT_TYPE_READ ) {
+               if (r->port_type & SPOOLSS_PORT_TYPE_READ) {
                        printf( "Read" );
                        comma = 1;
                }
-               if ( i2->port_type & PORT_TYPE_WRITE ) {
+               if (r->port_type & SPOOLSS_PORT_TYPE_WRITE) {
                        printf( "%sWrite", comma ? ", " : "" );
                        comma = 1;
                }
                /* These two have slightly different interpretations
                 on 95/98/ME but I'm disregarding that for now */
-               if ( i2->port_type & PORT_TYPE_REDIRECTED ) {
+               if (r->port_type & SPOOLSS_PORT_TYPE_REDIRECTED) {
                        printf( "%sRedirected", comma ? ", " : "" );
                        comma = 1;
                }
-               if ( i2->port_type & PORT_TYPE_NET_ATTACHED ) {
+               if (r->port_type & SPOOLSS_PORT_TYPE_NET_ATTACHED) {
                        printf( "%sNet-Attached", comma ? ", " : "" );
                }
                printf( "]\n" );
        } else {
                printf( "[Unset]\n" );
        }
-       printf("\tReserved:\t[%d]\n", i2->reserved);
+       printf("\tReserved:\t[%d]\n", r->reserved);
        printf("\n");
 }
 
@@ -420,8 +410,8 @@ static WERROR cmd_spoolss_enum_ports(struct rpc_pipe_client *cli,
 {
        WERROR                  result;
        uint32                  info_level = 1;
-       PORT_INFO_CTR           ctr;
        uint32                  returned;
+       union spoolss_PortInfo *info;
 
        if (argc > 2) {
                printf("Usage: %s [level]\n", argv[0]);
@@ -433,20 +423,22 @@ static WERROR cmd_spoolss_enum_ports(struct rpc_pipe_client *cli,
 
        /* Enumerate ports */
 
-       ZERO_STRUCT(ctr);
-
-       result = rpccli_spoolss_enum_ports(cli, mem_ctx, info_level, &returned, &ctr);
-
+       result = rpccli_spoolss_enumports(cli, mem_ctx,
+                                         cli->srv_name_slash,
+                                         info_level,
+                                         0,
+                                         &returned,
+                                         &info);
        if (W_ERROR_IS_OK(result)) {
                int i;
 
                for (i = 0; i < returned; i++) {
                        switch (info_level) {
                        case 1:
-                               display_port_info_1(&ctr.port.info_1[i]);
+                               display_port_info_1(&info[i].info1);
                                break;
                        case 2:
-                               display_port_info_2(&ctr.port.info_2[i]);
+                               display_port_info_2(&info[i].info2);
                                break;
                        default:
                                printf("unknown info level %d\n", info_level);
@@ -1848,7 +1840,7 @@ static WERROR cmd_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 
        switch (level) {
        case 1:
-               info1.flags             = FORM_USER;
+               info1.flags             = SPOOLSS_FORM_USER;
                info1.form_name         = argv[2];
                info1.size.width        = 100;
                info1.size.height       = 100;
@@ -1861,7 +1853,7 @@ static WERROR cmd_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 
                break;
        case 2:
-               info2.flags             = FORM_USER;
+               info2.flags             = SPOOLSS_FORM_USER;
                info2.form_name         = argv[2];
                info2.size.width        = 100;
                info2.size.height       = 100;
@@ -1930,7 +1922,7 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 
        /* Dummy up some values for the form data */
 
-       info1.flags             = FORM_PRINTER;
+       info1.flags             = SPOOLSS_FORM_PRINTER;
        info1.size.width        = 100;
        info1.size.height       = 100;
        info1.area.left         = 0;
@@ -1963,11 +1955,11 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 static const char *get_form_flag(int form_flag)
 {
        switch (form_flag) {
-       case FORM_USER:
+       case SPOOLSS_FORM_USER:
                return "FORM_USER";
-       case FORM_BUILTIN:
+       case SPOOLSS_FORM_BUILTIN:
                return "FORM_BUILTIN";
-       case FORM_PRINTER:
+       case SPOOLSS_FORM_PRINTER:
                return "FORM_PRINTER";
        default:
                return "unknown";
@@ -1977,27 +1969,6 @@ static const char *get_form_flag(int form_flag)
 /****************************************************************************
 ****************************************************************************/
 
-static void display_form(FORM_1 *form)
-{
-       fstring form_name = "";
-
-       if (form->name.buffer)
-               rpcstr_pull(form_name, form->name.buffer,
-                           sizeof(form_name), -1, STR_TERMINATE);
-
-       printf("%s\n" \
-               "\tflag: %s (%d)\n" \
-               "\twidth: %d, length: %d\n" \
-               "\tleft: %d, right: %d, top: %d, bottom: %d\n\n",
-               form_name, get_form_flag(form->flag), form->flag,
-               form->width, form->length,
-               form->left, form->right,
-               form->top, form->bottom);
-}
-
-/****************************************************************************
-****************************************************************************/
-
 static void display_form_info1(struct spoolss_FormInfo1 *r)
 {
        printf("%s\n" \
@@ -2173,12 +2144,12 @@ static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli,
        WERROR werror;
        const char *printername;
        uint32 num_forms, level = 1, i;
-       FORM_1 *forms;
+       union spoolss_FormInfo *forms;
 
        /* Parse the command arguments */
 
-       if (argc != 2) {
-               printf ("Usage: %s <printer>\n", argv[0]);
+       if (argc < 2 || argc > 4) {
+               printf ("Usage: %s <printer> [level]\n", argv[0]);
                return WERR_OK;
         }
 
@@ -2193,9 +2164,18 @@ static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli,
        if (!W_ERROR_IS_OK(werror))
                goto done;
 
+       if (argc == 3) {
+               level = atoi(argv[2]);
+       }
+
        /* Enumerate forms */
 
-       werror = rpccli_spoolss_enumforms(cli, mem_ctx, &handle, level, &num_forms, &forms);
+       werror = rpccli_spoolss_enumforms(cli, mem_ctx,
+                                         &handle,
+                                         level,
+                                         0,
+                                         &num_forms,
+                                         &forms);
 
        if (!W_ERROR_IS_OK(werror))
                goto done;
@@ -2203,9 +2183,14 @@ static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli,
        /* Display output */
 
        for (i = 0; i < num_forms; i++) {
-
-               display_form(&forms[i]);
-
+               switch (level) {
+               case 1:
+                       display_form_info1(&forms[i].info1);
+                       break;
+               case 2:
+                       display_form_info2(&forms[i].info2);
+                       break;
+               }
        }
 
  done:
@@ -3064,6 +3049,176 @@ done:
        return WERR_OK;
 }
 
+static void display_proc_info1(struct spoolss_PrintProcessorInfo1 *r)
+{
+       printf("print_processor_name: %s\n", r->print_processor_name);
+}
+
+static WERROR cmd_spoolss_enum_procs(struct rpc_pipe_client *cli,
+                                    TALLOC_CTX *mem_ctx, int argc,
+                                    const char **argv)
+{
+       WERROR werror;
+       const char *environment = SPOOLSS_ARCHITECTURE_NT_X86;
+       uint32_t num_procs, level = 1, i;
+       union spoolss_PrintProcessorInfo *procs;
+
+       /* Parse the command arguments */
+
+       if (argc < 1 || argc > 4) {
+               printf ("Usage: %s [environment] [level]\n", argv[0]);
+               return WERR_OK;
+        }
+
+       if (argc >= 2) {
+               environment = argv[1];
+       }
+
+       if (argc == 3) {
+               level = atoi(argv[2]);
+       }
+
+       /* Enumerate Print Processors */
+
+       werror = rpccli_spoolss_enumprintprocessors(cli, mem_ctx,
+                                                   cli->srv_name_slash,
+                                                   environment,
+                                                   level,
+                                                   0,
+                                                   &num_procs,
+                                                   &procs);
+       if (!W_ERROR_IS_OK(werror))
+               goto done;
+
+       /* Display output */
+
+       for (i = 0; i < num_procs; i++) {
+               switch (level) {
+               case 1:
+                       display_proc_info1(&procs[i].info1);
+                       break;
+               }
+       }
+
+ done:
+       return werror;
+}
+
+static void display_proc_data_types_info1(struct spoolss_PrintProcDataTypesInfo1 *r)
+{
+       printf("name_array: %s\n", r->name_array);
+}
+
+static WERROR cmd_spoolss_enum_proc_data_types(struct rpc_pipe_client *cli,
+                                              TALLOC_CTX *mem_ctx, int argc,
+                                              const char **argv)
+{
+       WERROR werror;
+       const char *print_processor_name = "winprint";
+       uint32_t num_procs, level = 1, i;
+       union spoolss_PrintProcDataTypesInfo *procs;
+
+       /* Parse the command arguments */
+
+       if (argc < 1 || argc > 4) {
+               printf ("Usage: %s [environment] [level]\n", argv[0]);
+               return WERR_OK;
+        }
+
+       if (argc >= 2) {
+               print_processor_name = argv[1];
+       }
+
+       if (argc == 3) {
+               level = atoi(argv[2]);
+       }
+
+       /* Enumerate Print Processor Data Types */
+
+       werror = rpccli_spoolss_enumprintprocessordatatypes(cli, mem_ctx,
+                                                           cli->srv_name_slash,
+                                                           print_processor_name,
+                                                           level,
+                                                           0,
+                                                           &num_procs,
+                                                           &procs);
+       if (!W_ERROR_IS_OK(werror))
+               goto done;
+
+       /* Display output */
+
+       for (i = 0; i < num_procs; i++) {
+               switch (level) {
+               case 1:
+                       display_proc_data_types_info1(&procs[i].info1);
+                       break;
+               }
+       }
+
+ done:
+       return werror;
+}
+
+static void display_monitor1(const struct spoolss_MonitorInfo1 *r)
+{
+       printf("monitor_name: %s\n", r->monitor_name);
+}
+
+static void display_monitor2(const struct spoolss_MonitorInfo2 *r)
+{
+       printf("monitor_name: %s\n", r->monitor_name);
+       printf("environment: %s\n", r->environment);
+       printf("dll_name: %s\n", r->dll_name);
+}
+
+static WERROR cmd_spoolss_enum_monitors(struct rpc_pipe_client *cli,
+                                       TALLOC_CTX *mem_ctx, int argc,
+                                       const char **argv)
+{
+       WERROR werror;
+       uint32_t count, level = 1, i;
+       union spoolss_MonitorInfo *info;
+
+       /* Parse the command arguments */
+
+       if (argc > 2) {
+               printf("Usage: %s [level]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       if (argc == 2) {
+               level = atoi(argv[1]);
+       }
+
+       /* Enumerate Print Monitors */
+
+       werror = rpccli_spoolss_enummonitors(cli, mem_ctx,
+                                            cli->srv_name_slash,
+                                            level,
+                                            0,
+                                            &count,
+                                            &info);
+       if (!W_ERROR_IS_OK(werror)) {
+               goto done;
+       }
+
+       /* Display output */
+
+       for (i = 0; i < count; i++) {
+               switch (level) {
+               case 1:
+                       display_monitor1(&info[i].info1);
+                       break;
+               case 2:
+                       display_monitor2(&info[i].info2);
+                       break;
+               }
+       }
+
+ done:
+       return werror;
+}
+
 /* List of commands exported by this module */
 struct cmd_set spoolss_commands[] = {
 
@@ -3099,6 +3254,9 @@ struct cmd_set spoolss_commands[] = {
        { "setprinterdata",     RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprinterdata,     &syntax_spoolss, NULL, "Set REG_SZ printer data",             "" },
        { "rffpcnex",           RPC_RTYPE_WERROR, NULL, cmd_spoolss_rffpcnex,           &syntax_spoolss, NULL, "Rffpcnex test", "" },
        { "printercmp",         RPC_RTYPE_WERROR, NULL, cmd_spoolss_printercmp,         &syntax_spoolss, NULL, "Printer comparison test", "" },
+       { "enumprocs",          RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_procs,         &syntax_spoolss, NULL, "Enumerate Print Processors",          "" },
+       { "enumprocdatatypes",  RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_proc_data_types, &syntax_spoolss, NULL, "Enumerate Print Processor Data Types", "" },
+       { "enummonitors",       RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_monitors,      &syntax_spoolss, NULL, "Enumerate Print Monitors", "" },
 
        { NULL }
 };
index 842277b3577623e07b8a4dfdce039de31ee6984a..70c6d34c88566fb00744dd260d3d04e374fc2a8d 100755 (executable)
@@ -27,7 +27,7 @@ tests="$tests UNLINK BROWSE ATTR TRANS2 TORTURE "
 tests="$tests OPLOCK1 OPLOCK2 OPLOCK3"
 tests="$tests DIR DIR1 TCON TCONDEV RW1 RW2 RW3"
 tests="$tests OPEN XCOPY RENAME DELETE PROPERTIES W2K"
-tests="$tests TCON2 IOCTL CHKPATH FDSESS LOCAL-SUBSTITUTE"
+tests="$tests TCON2 IOCTL CHKPATH FDSESS LOCAL-SUBSTITUTE CHAIN1"
 
 skipped1="RANDOMIPC NEGNOWAIT NBENCH ERRMAPEXTRACT TRANS2SCAN NTTRANSSCAN"
 skipped2="DENY1 DENY2 OPENATTR CASETABLE EATEST"
index 6b19e098e5cf0e45fc6bb1d0b0ed1cb721a79c28..cfa4b430ebf271aafd654004c541f4bdc766ecc2 100644 (file)
@@ -347,7 +347,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
                /* If errno is ECANCELED then don't return anything to the
                 * client. */
                if (errno == ECANCELED) {
-                       srv_cancel_sign_response(aio_ex->req->mid);
+                       srv_cancel_sign_response(aio_ex->req->mid, false);
                        return 0;
                }
 
@@ -441,7 +441,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
                /* If errno is ECANCELED then don't return anything to the
                 * client. */
                if (errno == ECANCELED) {
-                       srv_cancel_sign_response(aio_ex->req->mid);
+                       srv_cancel_sign_response(aio_ex->req->mid, false);
                        return 0;
                }
 
@@ -534,7 +534,7 @@ void smbd_aio_complete_mid(unsigned int mid)
        if (!aio_ex) {
                DEBUG(3,("smbd_aio_complete_mid: Can't find record to "
                         "match mid %u.\n", mid));
-               srv_cancel_sign_response(mid);
+               srv_cancel_sign_response(mid, false);
                return;
        }
 
@@ -544,7 +544,7 @@ void smbd_aio_complete_mid(unsigned int mid)
                 * ignore. */
                DEBUG( 3,( "smbd_aio_complete_mid: file closed whilst "
                           "aio outstanding (mid[%u]).\n", mid));
-               srv_cancel_sign_response(mid);
+               srv_cancel_sign_response(mid, false);
                return;
        }
 
index 86a46505a2f1e4ba228a856179fbdf0c15791a41..9c7fb1914e8716c6f27b90d1f2dd1878871fea26 100644 (file)
@@ -1131,7 +1131,7 @@ void reply_ntcancel(struct smb_request *req)
        START_PROFILE(SMBntcancel);
        remove_pending_change_notify_requests_by_mid(req->mid);
        remove_pending_lock_requests_by_mid(req->mid);
-       srv_cancel_sign_response(req->mid);
+       srv_cancel_sign_response(req->mid, true);
 
        DEBUG(3,("reply_ntcancel: cancel called on mid = %d.\n", req->mid));
 
index acd347520d1952d447a7fe2237b18d8486a59de6..c8cc2e64a3855eff790994cd760b0016e110c29b 100644 (file)
@@ -2386,6 +2386,14 @@ static NTSTATUS open_directory(connection_struct *conn,
                return status;
        }
 
+       /* We need to support SeSecurityPrivilege for this. */
+       if (access_mask & SEC_RIGHT_SYSTEM_SECURITY) {
+               DEBUG(10, ("open_directory: open on %s "
+                       "failed - SEC_RIGHT_SYSTEM_SECURITY denied.\n",
+                       fname));
+               return NT_STATUS_PRIVILEGE_NOT_HELD;
+       }
+
        switch( create_disposition ) {
                case FILE_OPEN:
 
@@ -2719,7 +2727,7 @@ struct case_semantics_state *set_posix_case_semantics(TALLOC_CTX *mem_ctx,
  * If that works, delete them all by setting the delete on close and close.
  */
 
-static NTSTATUS open_streams_for_delete(connection_struct *conn,
+NTSTATUS open_streams_for_delete(connection_struct *conn,
                                        const char *fname)
 {
        struct stream_struct *stream_info;
@@ -2777,13 +2785,15 @@ static NTSTATUS open_streams_for_delete(connection_struct *conn,
                        goto fail;
                }
 
-               status = create_file_unixpath
-                       (conn,                  /* conn */
+               status = SMB_VFS_CREATE_FILE(
+                        conn,                  /* conn */
                         NULL,                  /* req */
+                        0,                     /* root_dir_fid */
                         streamname,            /* fname */
+                        0,                     /* create_file_flags */
                         DELETE_ACCESS,         /* access_mask */
-                        FILE_SHARE_READ | FILE_SHARE_WRITE
-                        | FILE_SHARE_DELETE,   /* share_access */
+                        (FILE_SHARE_READ |     /* share_access */
+                            FILE_SHARE_WRITE | FILE_SHARE_DELETE),
                         FILE_OPEN,             /* create_disposition*/
                         NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE, /* create_options */
                         FILE_ATTRIBUTE_NORMAL, /* file_attributes */
@@ -2929,6 +2939,20 @@ static NTSTATUS create_file_unixpath(connection_struct *conn,
                status = NT_STATUS_PRIVILEGE_NOT_HELD;
                goto fail;
        }
+#else
+       /* We need to support SeSecurityPrivilege for this. */
+       if (access_mask & SEC_RIGHT_SYSTEM_SECURITY) {
+               status = NT_STATUS_PRIVILEGE_NOT_HELD;
+               goto fail;
+       }
+       /* Don't allow a SACL set from an NTtrans create until we
+        * support SeSecurityPrivilege. */
+       if (!VALID_STAT(sbuf) &&
+                       lp_nt_acl_support(SNUM(conn)) &&
+                       sd && (sd->sacl != NULL)) {
+               status = NT_STATUS_PRIVILEGE_NOT_HELD;
+               goto fail;
+       }
 #endif
 
        if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
index d483198a9ed5807d43ef8a541d2f7d2bcddff09f..7823a982195f232b45b5a7adef804c9f5dfd63e7 100644 (file)
@@ -272,7 +272,7 @@ static bool search_maxrid(struct pdb_search *search, const char *type,
        num_entries = pdb_search_entries(search, 0, 0xffffffff, &entries);
        for (i=0; i<num_entries; i++)
                *max_rid = MAX(*max_rid, entries[i].rid);
-       pdb_search_destroy(search);
+       TALLOC_FREE(search);
        return true;
 }
 
@@ -280,13 +280,14 @@ static uint32 get_maxrid(void)
 {
        uint32 max_rid = 0;
 
-       if (!search_maxrid(pdb_search_users(0), "users", &max_rid))
+       if (!search_maxrid(pdb_search_users(talloc_tos(), 0), "users", &max_rid))
                return 0;
 
-       if (!search_maxrid(pdb_search_groups(), "groups", &max_rid))
+       if (!search_maxrid(pdb_search_groups(talloc_tos()), "groups", &max_rid))
                return 0;
 
-       if (!search_maxrid(pdb_search_aliases(get_global_sam_sid()),
+       if (!search_maxrid(pdb_search_aliases(talloc_tos(),
+                                             get_global_sam_sid()),
                           "aliases", &max_rid))
                return 0;
 
index 8116764d9b34f8d4c7accca3d040213b41ae952a..950ca72ed8d3aa3c6cc2944e4f6aa24c66793436 100644 (file)
@@ -955,14 +955,18 @@ static bool net_spoolss_enumforms(struct rpc_pipe_client *pipe_hnd,
                                TALLOC_CTX *mem_ctx,
                                POLICY_HND *hnd,
                                int level,
-                               uint32 *num_forms,
-                               FORM_1 **forms)
+                               uint32_t *num_forms,
+                               union spoolss_FormInfo **forms)
 {
        WERROR result;
 
        /* enumforms call */
-       result = rpccli_spoolss_enumforms(pipe_hnd, mem_ctx, hnd, level, num_forms, forms);
-
+       result = rpccli_spoolss_enumforms(pipe_hnd, mem_ctx,
+                                         hnd,
+                                         level,
+                                         0,
+                                         num_forms,
+                                         forms);
        if (!W_ERROR_IS_OK(result)) {
                printf("could not enum forms: %s\n", win_errstr(result));
                return false;
@@ -1685,8 +1689,8 @@ NTSTATUS rpc_printer_migrate_forms_internals(struct net_context *c,
        POLICY_HND hnd_src, hnd_dst;
        PRINTER_INFO_CTR ctr_enum;
        union spoolss_PrinterInfo info_dst;
-       uint32 num_forms;
-       FORM_1 *forms;
+       uint32_t num_forms;
+       union spoolss_FormInfo *forms;
        struct cli_state *cli_dst = NULL;
 
        ZERO_STRUCT(ctr_enum);
@@ -1760,34 +1764,19 @@ NTSTATUS rpc_printer_migrate_forms_internals(struct net_context *c,
                for (f = 0; f < num_forms; f++) {
 
                        union spoolss_AddFormInfo info;
-                       struct spoolss_AddFormInfo1 info1;
-                       fstring form_name;
                        NTSTATUS status;
 
                        /* only migrate FORM_PRINTER types, according to jerry
                           FORM_BUILTIN-types are hard-coded in samba */
-                       if (forms[f].flag != FORM_PRINTER)
+                       if (forms[f].info1.flags != SPOOLSS_FORM_PRINTER)
                                continue;
 
-                       if (forms[f].name.buffer)
-                               rpcstr_pull(form_name, forms[f].name.buffer,
-                                       sizeof(form_name), -1, STR_TERMINATE);
-
                        if (c->opt_verbose)
                                d_printf("\tmigrating form # %d [%s] of type [%d]\n",
-                                       f, form_name, forms[f].flag);
-
-                       /* is there a more elegant way to do that ? */
-                       info1.flags             = FORM_PRINTER;
-                       info1.size.width        = forms[f].width;
-                       info1.size.height       = forms[f].length;
-                       info1.area.left         = forms[f].left;
-                       info1.area.top          = forms[f].top;
-                       info1.area.right        = forms[f].right;
-                       info1.area.bottom       = forms[f].bottom;
-                       info1.form_name         = form_name;
+                                       f, forms[f].info1.form_name,
+                                       forms[f].info1.flags);
 
-                       info.info1 = &info1;
+                       info.info1 = (struct spoolss_AddFormInfo1 *)&forms[f].info1;
 
                        /* FIXME: there might be something wrong with samba's
                           builtin-forms */
@@ -1798,11 +1787,12 @@ NTSTATUS rpc_printer_migrate_forms_internals(struct net_context *c,
                                                        &result);
                        if (!W_ERROR_IS_OK(result)) {
                                d_printf("\tAddForm form %d: [%s] refused.\n",
-                                       f, form_name);
+                                       f, forms[f].info1.form_name);
                                continue;
                        }
 
-                       DEBUGADD(1,("\tAddForm of [%s] succeeded\n", form_name));
+                       DEBUGADD(1,("\tAddForm of [%s] succeeded\n",
+                               forms[f].info1.form_name));
                }
 
 
index e8ebb6020579848885dd9b6cc49e0edfc9ca8f3d..eea22c0dc2038514f4f03b922e05d7ca0474373a 100644 (file)
@@ -1269,28 +1269,31 @@ static int net_sam_do_list(struct net_context *c, int argc, const char **argv,
                }
        }
 
-       pdb_search_destroy(search);
+       TALLOC_FREE(search);
        return 0;
 }
 
 static int net_sam_list_users(struct net_context *c, int argc,
                              const char **argv)
 {
-       return net_sam_do_list(c, argc, argv, pdb_search_users(ACB_NORMAL),
+       return net_sam_do_list(c, argc, argv,
+                              pdb_search_users(talloc_tos(), ACB_NORMAL),
                               "users");
 }
 
 static int net_sam_list_groups(struct net_context *c, int argc,
                               const char **argv)
 {
-       return net_sam_do_list(c, argc, argv, pdb_search_groups(), "groups");
+       return net_sam_do_list(c, argc, argv, pdb_search_groups(talloc_tos()),
+                              "groups");
 }
 
 static int net_sam_list_localgroups(struct net_context *c, int argc,
                                    const char **argv)
 {
        return net_sam_do_list(c, argc, argv,
-                              pdb_search_aliases(get_global_sam_sid()),
+                              pdb_search_aliases(talloc_tos(),
+                                                 get_global_sam_sid()),
                               "localgroups");
 }
 
@@ -1298,7 +1301,8 @@ static int net_sam_list_builtin(struct net_context *c, int argc,
                                const char **argv)
 {
        return net_sam_do_list(c, argc, argv,
-                              pdb_search_aliases(&global_sid_Builtin),
+                              pdb_search_aliases(talloc_tos(),
+                                                 &global_sid_Builtin),
                               "builtin");
 }
 
@@ -1306,7 +1310,7 @@ static int net_sam_list_workstations(struct net_context *c, int argc,
                                     const char **argv)
 {
        return net_sam_do_list(c, argc, argv,
-                              pdb_search_users(ACB_WSTRUST),
+                              pdb_search_users(talloc_tos(), ACB_WSTRUST),
                               "workstations");
 }
 
index 50cbc43d6de71bcec959b524932168d7eb506c86..a5bc0c9bd41a50fe3969fb348828146176857bff 100644 (file)
@@ -67,7 +67,7 @@ static int export_database (struct pdb_methods *in,
 
        DEBUG(3, ("export_database: username=\"%s\"\n", username ? username : "(NULL)"));
 
-       u_search = pdb_search_init(PDB_USER_SEARCH);
+       u_search = pdb_search_init(talloc_tos(), PDB_USER_SEARCH);
        if (u_search == NULL) {
                DEBUG(0, ("pdb_search_init failed\n"));
                return 1;
@@ -75,7 +75,7 @@ static int export_database (struct pdb_methods *in,
 
        if (!in->search_users(in, u_search, 0)) {
                DEBUG(0, ("Could not start searching users\n"));
-               pdb_search_destroy(u_search);
+               TALLOC_FREE(u_search);
                return 1;
        }
 
@@ -116,7 +116,7 @@ static int export_database (struct pdb_methods *in,
                        fprintf(stderr, "export_database: Memory allocation "
                                "failure!\n");
                        TALLOC_FREE( user );
-                       pdb_search_destroy(u_search);
+                       TALLOC_FREE(u_search);
                        return 1;
                }
 
@@ -139,7 +139,7 @@ static int export_database (struct pdb_methods *in,
                TALLOC_FREE( user );
        }
 
-       pdb_search_destroy(u_search);
+       TALLOC_FREE(u_search);
 
        return 0;
 }
@@ -352,7 +352,7 @@ static int print_users_list (struct pdb_methods *in, bool verbosity, bool smbpwd
        struct pdb_search *u_search;
        struct samr_displayentry userentry;
 
-       u_search = pdb_search_init(PDB_USER_SEARCH);
+       u_search = pdb_search_init(talloc_tos(), PDB_USER_SEARCH);
        if (u_search == NULL) {
                DEBUG(0, ("pdb_search_init failed\n"));
                return 1;
@@ -360,7 +360,7 @@ static int print_users_list (struct pdb_methods *in, bool verbosity, bool smbpwd
 
        if (!in->search_users(in, u_search, 0)) {
                DEBUG(0, ("Could not start searching users\n"));
-               pdb_search_destroy(u_search);
+               TALLOC_FREE(u_search);
                return 1;
        }
 
@@ -391,7 +391,7 @@ static int print_users_list (struct pdb_methods *in, bool verbosity, bool smbpwd
                print_sam_info (sam_pwent, verbosity, smbpwdstyle);
                TALLOC_FREE(sam_pwent);
        }
-       pdb_search_destroy(u_search);
+       TALLOC_FREE(u_search);
 
        return 0;
 }
@@ -404,7 +404,7 @@ static int fix_users_list (struct pdb_methods *in)
        struct pdb_search *u_search;
        struct samr_displayentry userentry;
 
-       u_search = pdb_search_init(PDB_USER_SEARCH);
+       u_search = pdb_search_init(talloc_tos(), PDB_USER_SEARCH);
        if (u_search == NULL) {
                DEBUG(0, ("pdb_search_init failed\n"));
                return 1;
@@ -412,7 +412,7 @@ static int fix_users_list (struct pdb_methods *in)
 
        if (!in->search_users(in, u_search, 0)) {
                DEBUG(0, ("Could not start searching users\n"));
-               pdb_search_destroy(u_search);
+               TALLOC_FREE(u_search);
                return 1;
        }
 
@@ -444,7 +444,7 @@ static int fix_users_list (struct pdb_methods *in)
                }
                TALLOC_FREE(sam_pwent);
        }
-       pdb_search_destroy(u_search);
+       TALLOC_FREE(u_search);
        return 0;
 }
 
index dbe83152dd3baec9bec712f12331896752198909..e455d936e0503643b341e49c9765434e6f006553 100644 (file)
@@ -320,7 +320,7 @@ static bool winbindd_setup_sig_usr2_handler(void)
 
        se = tevent_add_signal(winbind_event_context(),
                               winbind_event_context(),
-                              SIGCHLD, 0,
+                              SIGUSR2, 0,
                               winbindd_sig_usr2_handler,
                               NULL);
        if (!se) {
index 35768fe7f2492c21fcd28be01b88fb818d6c8650..7a53f19ffd4ee94ced4f3a717277043d66b3a063 100644 (file)
@@ -821,8 +821,6 @@ static NTSTATUS cm_prepare_connection(const struct winbindd_domain *domain,
                }
        }
 
-       cli_setup_signing_state(*cli, Undefined);
-
        result = cli_negprot(*cli);
 
        if (!NT_STATUS_IS_OK(result)) {
index d704ca0fd35414235019e089580fdfa906875d5c..1a358b2b440ce6621c1d7cdebe37d09f5868afae 100644 (file)
@@ -40,9 +40,9 @@ static NTSTATUS enum_groups_internal(struct winbindd_domain *domain,
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
        if (sidtype == SID_NAME_ALIAS) {
-               search = pdb_search_aliases(&domain->sid);
+               search = pdb_search_aliases(talloc_tos(), &domain->sid);
        } else {
-               search = pdb_search_groups();
+               search = pdb_search_groups(talloc_tos());
        }
 
        if (search == NULL) goto done;
@@ -68,7 +68,7 @@ static NTSTATUS enum_groups_internal(struct winbindd_domain *domain,
 
        result = NT_STATUS_OK;
  done:
-       pdb_search_destroy(search);
+       TALLOC_FREE(search);
        return result;
 }
 
@@ -456,7 +456,7 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
                                uint32 *num_entries,
                                WINBIND_USERINFO **info)
 {
-       struct pdb_search *ps = pdb_search_users(ACB_NORMAL);
+       struct pdb_search *ps = pdb_search_users(talloc_tos(), ACB_NORMAL);
        struct samr_displayentry *entries = NULL;
        uint32 i;
 
@@ -473,7 +473,7 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
 
        *info = TALLOC_ZERO_ARRAY(mem_ctx, WINBIND_USERINFO, *num_entries);
        if (!(*info)) {
-               pdb_search_destroy(ps);
+               TALLOC_FREE(ps);
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -498,7 +498,7 @@ static NTSTATUS sam_query_user_list(struct winbindd_domain *domain,
                                DOMAIN_GROUP_RID_USERS);
        }
 
-       pdb_search_destroy(ps);
+       TALLOC_FREE(ps);
        return NT_STATUS_OK;
 }
 
index 0185e66c3905c2a565178453efce84e3a0fd8dc5..930e45b214e270043bc7224be705571f60d1eef9 100644 (file)
@@ -1356,6 +1356,10 @@ const struct unix_error_map unix_nt_errmap[] = {
 #ifdef ENOSYS
        { ENOSYS,       NT_STATUS_INVALID_SYSTEM_SERVICE },
 #endif
+#ifdef ECANCELED
+       { ECANCELED,    NT_STATUS_CANCELLED },
+#endif
+
        { 0, NT_STATUS_UNSUCCESSFUL }
 };
 
index 459babce0ee5d1d344bf70a7b0089c3678a49d9b..aea5d08c3f35f9104840f829d9219e1b782352cd 100644 (file)
@@ -259,7 +259,7 @@ static WERROR sptr_EnumPrintServerForms(struct ntptr_GenericHandle *server, TALL
                return WERR_UNKNOWN_LEVEL;
        }
 
-       r->out.info     = info;
+       *r->out.info    = info;
        *r->out.count   = count;
        return WERR_OK;
 }
@@ -587,7 +587,7 @@ static WERROR sptr_EnumPrinters(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx
                return WERR_UNKNOWN_LEVEL;
        }
 
-       r->out.info     = info;
+       *r->out.info    = info;
        *r->out.count   = count;
        return WERR_OK;
 }
@@ -645,7 +645,7 @@ static WERROR sptr_EnumPorts(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx,
                return WERR_UNKNOWN_LEVEL;
        }
 
-       r->out.info     = info;
+       *r->out.info    = info;
        *r->out.count   = count;
        return WERR_OK;
 }
@@ -692,7 +692,7 @@ static WERROR sptr_EnumMonitors(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx
                return WERR_UNKNOWN_LEVEL;
        }
 
-       r->out.info     = info;
+       *r->out.info    = info;
        *r->out.count   = count;
        return WERR_OK;
 }
index f1ef2f0acb95f54bb5feaef2954e0355aca001c5..61c8009716b691bb2d81c4b0d8ff266d19ebd6ab 100644 (file)
@@ -243,8 +243,8 @@ static WERROR dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TA
        status = ntptr_EnumPrinters(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, ic, r->out.info, r->in.level, *r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, ic, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
        *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -379,8 +379,8 @@ static WERROR dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_ca
        status = ntptr_EnumPrinterDrivers(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, ic, r->out.info, r->in.level, *r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, ic, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
        *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -802,8 +802,8 @@ static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLO
                        return WERR_FOOBAR;
        }
 
-       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, ic, r->out.info, r->in.level, *r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, ic, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
        *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -825,8 +825,8 @@ static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLO
        status = ntptr_EnumPorts(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, ic, r->out.info, r->in.level, *r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, ic, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
        *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -848,8 +848,8 @@ static WERROR dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TA
        status = ntptr_EnumMonitors(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, ic, r->out.info, r->in.level, *r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, ic, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
        *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -1001,7 +1001,7 @@ static WERROR dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_c
 static WERROR dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumPrintProcDataTypes *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       return WERR_OK;
 }
 
 
index 39e6cff2744e7675b77ddef7e038e6ea3055af2c..821db064146eb0ff1daf6ac2c36c2be09db71b5a 100755 (executable)
@@ -291,7 +291,7 @@ if test x"${PIDL_TESTS_SKIP}" = x"yes"; then
    echo "Skipping pidl tests - PIDL_TESTS_SKIP=yes"
 elif $PERL -e 'eval require Test::More;' > /dev/null 2>&1; then
   for f in $samba4srcdir/../pidl/tests/*.pl; do
-     plantest "pidl.`basename $f .pl`" none $PERL $f "|" $samba4srcdir/../lib/subunit/harness2subunit.pl
+     plantest "pidl.`basename $f .pl`" none $PERL $f "|" $PERL $samba4srcdir/../lib/subunit/harness2subunit.pl
   done
 else 
    echo "Skipping pidl tests - Test::More not installed"
index 7cacba7418190b9628ee175a2b1982cf131b23cd..fe128fea52b0a4a7958d7dd1a4c2aaf5e450909a 100644 (file)
@@ -2619,6 +2619,7 @@ static bool enumprinters(TALLOC_CTX *mem_ctx, struct dcerpc_pipe *pipe,
        DATA_BLOB blob;
        uint32_t needed;
        uint32_t count;
+       union spoolss_PrinterInfo *info;
 
        r.in.flags = PRINTER_ENUM_LOCAL;
        r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", servername);
@@ -2627,6 +2628,7 @@ static bool enumprinters(TALLOC_CTX *mem_ctx, struct dcerpc_pipe *pipe,
        r.in.offered = 0;
        r.out.needed = &needed;
        r.out.count = &count;
+       r.out.info = &info;
 
        status = dcerpc_spoolss_EnumPrinters(pipe, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
index 9d8bc4b186e517fe7b8ee03e673d8cd078eb6ae9..ad8158d9562c6d11676e1a42abe8a9c2403c7c41 100644 (file)
@@ -108,6 +108,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
                DATA_BLOB blob;
                uint32_t needed;
                uint32_t count;
+               union spoolss_PortInfo *info;
 
                r.in.servername = "";
                r.in.level = level;
@@ -115,6 +116,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
                r.in.offered = 0;
                r.out.needed = &needed;
                r.out.count = &count;
+               r.out.info = &info;
 
                torture_comment(tctx, "Testing EnumPorts level %u\n", r.in.level);
 
@@ -137,8 +139,10 @@ static bool test_EnumPorts(struct torture_context *tctx,
 
                torture_assert_werr_ok(tctx, r.out.result, "EnumPorts failed");
 
+               torture_assert(tctx, info, "EnumPorts returned no info");
+
                ctx->port_count[level]  = count;
-               ctx->ports[level]       = r.out.info;
+               ctx->ports[level]       = info;
        }
 
        for (i=1;i<ARRAY_SIZE(levels);i++) {
@@ -307,6 +311,7 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                DATA_BLOB blob;
                uint32_t needed;
                uint32_t count;
+               union spoolss_DriverInfo *info;
 
                r.in.server             = "";
                r.in.environment        = SPOOLSS_ARCHITECTURE_NT_X86;
@@ -315,6 +320,7 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                r.in.offered            = 0;
                r.out.needed            = &needed;
                r.out.count             = &count;
+               r.out.info              = &info;
 
                torture_comment(tctx, "Testing EnumPrinterDrivers level %u\n", r.in.level);
 
@@ -339,7 +345,7 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");
 
                ctx->driver_count[level]        = count;
-               ctx->drivers[level]             = r.out.info;
+               ctx->drivers[level]             = info;
        }
 
        for (i=1;i<ARRAY_SIZE(levels);i++) {
@@ -426,6 +432,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
                DATA_BLOB blob;
                uint32_t needed;
                uint32_t count;
+               union spoolss_MonitorInfo *info;
 
                r.in.servername = "";
                r.in.level = level;
@@ -433,6 +440,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
                r.in.offered = 0;
                r.out.needed = &needed;
                r.out.count = &count;
+               r.out.info = &info;
 
                torture_comment(tctx, "Testing EnumMonitors level %u\n", r.in.level);
 
@@ -456,7 +464,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
                torture_assert_werr_ok(tctx, r.out.result, "EnumMonitors failed");
 
                ctx->monitor_count[level]       = count;
-               ctx->monitors[level]            = r.out.info;
+               ctx->monitors[level]            = info;
        }
 
        for (i=1;i<ARRAY_SIZE(levels);i++) {
@@ -499,6 +507,7 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
                DATA_BLOB blob;
                uint32_t needed;
                uint32_t count;
+               union spoolss_PrintProcessorInfo *info;
 
                r.in.servername = "";
                r.in.environment = "Windows NT x86";
@@ -507,6 +516,7 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
                r.in.offered = 0;
                r.out.needed = &needed;
                r.out.count = &count;
+               r.out.info = &info;
 
                torture_comment(tctx, "Testing EnumPrintProcessors level %u\n", r.in.level);
 
@@ -530,7 +540,7 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrintProcessors failed");
 
                ctx->print_processor_count[level]       = count;
-               ctx->print_processors[level]            = r.out.info;
+               ctx->print_processors[level]            = info;
        }
 
        for (i=1;i<ARRAY_SIZE(levels);i++) {
@@ -558,6 +568,57 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
        return true;
 }
 
+static bool test_EnumPrintProcDataTypes(struct torture_context *tctx,
+                                       struct dcerpc_pipe *p,
+                                       struct test_spoolss_context *ctx)
+{
+       NTSTATUS status;
+       struct spoolss_EnumPrintProcDataTypes r;
+       uint16_t levels[] = { 1 };
+       int i, j;
+
+       for (i=0;i<ARRAY_SIZE(levels);i++) {
+               int level = levels[i];
+               DATA_BLOB blob;
+               uint32_t needed;
+               uint32_t count;
+               union spoolss_PrintProcDataTypesInfo *info;
+
+               r.in.servername = "";
+               r.in.print_processor_name = "winprint";
+               r.in.level = level;
+               r.in.buffer = NULL;
+               r.in.offered = 0;
+               r.out.needed = &needed;
+               r.out.count = &count;
+               r.out.info = &info;
+
+               torture_comment(tctx, "Testing EnumPrintProcDataTypes level %u\n", r.in.level);
+
+               status = dcerpc_spoolss_EnumPrintProcDataTypes(p, ctx, &r);
+               torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcDataType failed");
+               if (W_ERROR_IS_OK(r.out.result)) {
+                       /* TODO: do some more checks here */
+                       continue;
+               }
+               torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
+                       "EnumPrintProcDataTypes unexpected return code");
+
+               blob = data_blob_talloc(ctx, NULL, needed);
+               data_blob_clear(&blob);
+               r.in.buffer = &blob;
+               r.in.offered = needed;
+
+               status = dcerpc_spoolss_EnumPrintProcDataTypes(p, ctx, &r);
+               torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcDataTypes failed");
+
+               torture_assert_werr_ok(tctx, r.out.result, "EnumPrintProcDataTypes failed");
+       }
+
+       return true;
+}
+
+
 static bool test_EnumPrinters(struct torture_context *tctx, 
                              struct dcerpc_pipe *p,
                              struct test_spoolss_context *ctx)
@@ -572,6 +633,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
                DATA_BLOB blob;
                uint32_t needed;
                uint32_t count;
+               union spoolss_PrinterInfo *info;
 
                r.in.flags      = PRINTER_ENUM_LOCAL;
                r.in.server     = "";
@@ -580,6 +642,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
                r.in.offered    = 0;
                r.out.needed    = &needed;
                r.out.count     = &count;
+               r.out.info      = &info;
 
                torture_comment(tctx, "Testing EnumPrinters level %u\n", r.in.level);
 
@@ -603,7 +666,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed");
 
                ctx->printer_count[level]       = count;
-               ctx->printers[level]            = r.out.info;
+               ctx->printers[level]            = info;
        }
 
        for (i=1;i<ARRAY_SIZE(levels);i++) {
@@ -793,12 +856,15 @@ static bool test_EnumForms(struct torture_context *tctx,
 
        for (i=0; i<ARRAY_SIZE(levels); i++) {
 
+               union spoolss_FormInfo *info;
+
                r.in.handle = handle;
                r.in.level = levels[i];
                r.in.buffer = NULL;
                r.in.offered = 0;
                r.out.needed = &needed;
                r.out.count = &count;
+               r.out.info = &info;
 
                torture_comment(tctx, "Testing EnumForms level %d\n", levels[i]);
 
@@ -813,7 +879,6 @@ static bool test_EnumForms(struct torture_context *tctx,
                        torture_fail(tctx, "EnumForms on the PrintServer isn't supported by test server (NT4)");
 
                if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-                       union spoolss_FormInfo *info;
                        int j;
                        DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
                        data_blob_clear(&blob);
@@ -822,9 +887,7 @@ static bool test_EnumForms(struct torture_context *tctx,
 
                        status = dcerpc_spoolss_EnumForms(p, tctx, &r);
 
-                       torture_assert(tctx, r.out.info, "No forms returned");
-
-                       info = r.out.info;
+                       torture_assert(tctx, info, "No forms returned");
 
                        for (j = 0; j < count; j++) {
                                if (!print_server)
@@ -928,6 +991,7 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
        struct spoolss_EnumPorts r;
        uint32_t needed;
        uint32_t count;
+       union spoolss_PortInfo *info;
 
        r.in.servername = talloc_asprintf(tctx, "\\\\%s", 
                                          dcerpc_server_name(p));
@@ -936,6 +1000,7 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
        r.in.offered = 0;
        r.out.needed = &needed;
        r.out.count = &count;
+       r.out.info = &info;
 
        torture_comment(tctx, "Testing EnumPorts\n");
 
@@ -952,7 +1017,7 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
                status = dcerpc_spoolss_EnumPorts(p, tctx, &r);
                torture_assert_ntstatus_ok(tctx, status, "EnumPorts failed");
 
-               torture_assert(tctx, r.out.info, "No ports returned");
+               torture_assert(tctx, info, "No ports returned");
        }
 
        return true;
@@ -1080,6 +1145,7 @@ static bool test_EnumJobs(struct torture_context *tctx,
        struct spoolss_EnumJobs r;
        uint32_t needed;
        uint32_t count;
+       union spoolss_JobInfo *info;
 
        r.in.handle = handle;
        r.in.firstjob = 0;
@@ -1089,6 +1155,7 @@ static bool test_EnumJobs(struct torture_context *tctx,
        r.in.offered = 0;
        r.out.needed = &needed;
        r.out.count = &count;
+       r.out.info = &info;
 
        torture_comment(tctx, "Testing EnumJobs\n");
 
@@ -1097,7 +1164,6 @@ static bool test_EnumJobs(struct torture_context *tctx,
        torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
 
        if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-               union spoolss_JobInfo *info;
                int j;
                DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
                data_blob_clear(&blob);
@@ -1106,9 +1172,7 @@ static bool test_EnumJobs(struct torture_context *tctx,
 
                status = dcerpc_spoolss_EnumJobs(p, tctx, &r);
 
-               torture_assert(tctx, r.out.info, "No jobs returned");
-
-               info = r.out.info;
+               torture_assert(tctx, info, "No jobs returned");
 
                for (j = 0; j < count; j++) {
 
@@ -1722,6 +1786,7 @@ static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pi
                r.in.offered    = 0;
                r.out.needed    = &needed;
                r.out.count     = &count;
+               r.out.info      = &info;
 
                torture_comment(tctx, "Testing EnumPrinters level %u\n", r.in.level);
 
@@ -1740,13 +1805,11 @@ static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pi
 
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed");
 
-               if (!r.out.info) {
+               if (!info) {
                        torture_comment(tctx, "No printers returned\n");
                        return true;
                }
 
-               info = r.out.info;
-
                for (j=0;j<count;j++) {
                        if (r.in.level == 1) {
                                /* the names appear to be comma-separated name lists? */
@@ -1829,6 +1892,7 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
 
                uint32_t needed;
                uint32_t count;
+               union spoolss_DriverInfo *info;
 
                r.in.server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
                r.in.environment = "Windows NT x86";
@@ -1837,6 +1901,7 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
                r.in.offered = 0;
                r.out.needed = &needed;
                r.out.count = &count;
+               r.out.info = &info;
 
                torture_comment(tctx, "Testing EnumPrinterDrivers level %u\n", r.in.level);
 
@@ -1856,7 +1921,7 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
 
                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");
 
-               if (!r.out.info) {
+               if (!info) {
                        torture_comment(tctx, "No printer drivers returned\n");
                        break;
                }
@@ -1937,6 +2002,7 @@ bool torture_rpc_spoolss(struct torture_context *torture)
        ret &= test_EnumPrinterDrivers(torture, p, ctx);
        ret &= test_EnumMonitors(torture, p, ctx);
        ret &= test_EnumPrintProcessors(torture, p, ctx);
+       ret &= test_EnumPrintProcDataTypes(torture, p, ctx);
        ret &= test_EnumPrinters(torture, p, ctx);
        ret &= test_OpenPrinter_badname(torture, p, "__INVALID_PRINTER__");
        ret &= test_OpenPrinter_badname(torture, p, "\\\\__INVALID_HOST__");
index 08fadafe2c86e32374ad1d52823ff8f88c6c2bdc..add06522c615402bbda8f0570213409c37151602 100644 (file)
@@ -188,6 +188,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
        DATA_BLOB blob = data_blob_talloc_zero(ctx, initial_blob_size);
        uint32_t needed;
        uint32_t count;
+       union spoolss_PrinterInfo *info;
 
        ep.in.flags = PRINTER_ENUM_NAME;
        ep.in.server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
@@ -196,6 +197,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
        ep.in.offered = initial_blob_size;
        ep.out.needed = &needed;
        ep.out.count = &count;
+       ep.out.info = &info;
 
        status = dcerpc_spoolss_EnumPrinters(p, ctx, &ep);
        torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed.");
@@ -211,7 +213,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
        torture_assert_werr_ok(tctx, ep.out.result, "EnumPrinters failed.");
 
        ctx->printer_count = count;
-       ctx->printer_info = ep.out.info;
+       ctx->printer_info = info;
 
        torture_comment(tctx, "Found %d printer(s).\n", ctx->printer_count);
 
@@ -264,6 +266,7 @@ static bool test_EnumJobs(struct torture_context *tctx,
        DATA_BLOB blob = data_blob_talloc_zero(tctx, 1024);
        uint32_t needed;
        uint32_t count;
+       union spoolss_JobInfo *info;
 
        torture_comment(tctx, "Test EnumJobs\n");
 
@@ -273,6 +276,7 @@ static bool test_EnumJobs(struct torture_context *tctx,
        ej.in.offered = 1024;
        ej.out.needed = &needed;
        ej.out.count = &count;
+       ej.out.info = &info;
 
        status = dcerpc_spoolss_EnumJobs(p, tctx, &ej);
        torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
@@ -323,6 +327,7 @@ static bool test_EnumForms(struct torture_context *tctx,
        DATA_BLOB blob = data_blob_talloc_zero(tctx, initial_blob_size);
        uint32_t needed;
        uint32_t count;
+       union spoolss_FormInfo *info;
 
        torture_comment(tctx, "Testing EnumForms\n");
 
@@ -332,6 +337,7 @@ static bool test_EnumForms(struct torture_context *tctx,
        ef.in.offered = initial_blob_size;
        ef.out.needed = &needed;
        ef.out.count = &count;
+       ef.out.info = &info;
 
        status = dcerpc_spoolss_EnumForms(p, tctx, &ef);
        torture_assert_ntstatus_ok(tctx, status, "EnumForms failed");