s3-lib Replace StrCaseCmp() with strcasecmp_m()
[ddiss/samba.git] / source3 / rpcclient / cmd_spoolss.c
index 26112b960fb22ec1c2852c676e1774a93ac6326f..da9826ae0e441b837dccf6b9f6fbbd36c873dd98 100644 (file)
 
 #include "includes.h"
 #include "rpcclient.h"
-#include "../librpc/gen_ndr/cli_spoolss.h"
+#include "../librpc/gen_ndr/ndr_spoolss_c.h"
 #include "rpc_client/cli_spoolss.h"
 #include "rpc_client/init_spoolss.h"
-#include "registry.h"
 #include "registry/reg_objects.h"
 #include "nt_printing.h"
+#include "../libcli/security/display_sec.h"
+#include "../libcli/security/security_descriptor.h"
+#include "../libcli/registry/util_reg.h"
+#include "libsmb/libsmb.h"
 
 #define RPCCLIENT_PRINTERNAME(_printername, _cli, _arg) \
 { \
@@ -76,11 +79,11 @@ static const char *cmd_spoolss_get_short_archi(const char *long_archi)
 {
         int i=-1;
 
-        DEBUG(107,("Getting architecture dependant directory\n"));
+        DEBUG(107,("Getting architecture dependent directory\n"));
         do {
                 i++;
         } while ( (archi_table[i].long_archi!=NULL ) &&
-                  StrCaseCmp(long_archi, archi_table[i].long_archi) );
+                  strcasecmp_m(long_archi, archi_table[i].long_archi) );
 
         if (archi_table[i].long_archi==NULL) {
                 DEBUGADD(10,("Unknown architecture [%s] !\n", long_archi));
@@ -107,6 +110,7 @@ static WERROR cmd_spoolss_open_printer_ex(struct rpc_pipe_client *cli,
        WERROR          werror;
        struct policy_handle    hnd;
        uint32_t access_mask = PRINTER_ALL_ACCESS;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc < 2) {
                printf("Usage: %s <printername> [access_mask]\n", argv[0]);
@@ -125,7 +129,7 @@ static WERROR cmd_spoolss_open_printer_ex(struct rpc_pipe_client *cli,
                                               &hnd);
        if (W_ERROR_IS_OK(werror)) {
                printf("Printer %s opened successfully\n", argv[1]);
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, &werror);
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &werror);
 
                if (!W_ERROR_IS_OK(werror)) {
                        printf("Error closing printer handle! (%s)\n",
@@ -148,6 +152,7 @@ static WERROR cmd_spoolss_open_printer(struct rpc_pipe_client *cli,
        uint32_t access_mask = PRINTER_ALL_ACCESS;
        NTSTATUS status;
        struct spoolss_DevmodeContainer devmode_ctr;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        ZERO_STRUCT(devmode_ctr);
 
@@ -162,16 +167,19 @@ static WERROR cmd_spoolss_open_printer(struct rpc_pipe_client *cli,
 
        /* Open the printer handle */
 
-       status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+       status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
                                            argv[1],
                                            NULL,
                                            devmode_ctr,
                                            access_mask,
                                            &hnd,
                                            &werror);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
        if (W_ERROR_IS_OK(werror)) {
                printf("Printer %s opened successfully\n", argv[1]);
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, &werror);
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &werror);
 
                if (!W_ERROR_IS_OK(werror)) {
                        printf("Error closing printer handle! (%s)\n",
@@ -518,6 +526,7 @@ static WERROR cmd_spoolss_setprinter(struct rpc_pipe_client *cli,
        const char      *printername, *comment = NULL;
        struct spoolss_DevmodeContainer devmode_ctr;
        struct sec_desc_buf secdesc_ctr;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc == 1 || argc > 3) {
                printf("Usage: %s printername comment\n", argv[0]);
@@ -560,19 +569,25 @@ static WERROR cmd_spoolss_setprinter(struct rpc_pipe_client *cli,
        info_ctr.level = 2;
        info_ctr.info.info2 = &info2;
 
-       status = rpccli_spoolss_SetPrinter(cli, mem_ctx,
+       status = dcerpc_spoolss_SetPrinter(b, mem_ctx,
                                           &pol,
                                           &info_ctr,
                                           &devmode_ctr,
                                           &secdesc_ctr,
                                           0, /* command */
                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (W_ERROR_IS_OK(result))
                printf("Success in setting comment.\n");
 
  done:
-       if (is_valid_policy_hnd(&pol))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       if (is_valid_policy_hnd(&pol)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
+       }
 
        return result;
 }
@@ -595,6 +610,7 @@ static WERROR cmd_spoolss_setprintername(struct rpc_pipe_client *cli,
        struct spoolss_SetPrinterInfo2 info2;
        struct spoolss_DevmodeContainer devmode_ctr;
        struct sec_desc_buf secdesc_ctr;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        ZERO_STRUCT(devmode_ctr);
        ZERO_STRUCT(secdesc_ctr);
@@ -636,19 +652,25 @@ static WERROR cmd_spoolss_setprintername(struct rpc_pipe_client *cli,
        info_ctr.level = 2;
        info_ctr.info.info2 = &info2;
 
-       status = rpccli_spoolss_SetPrinter(cli, mem_ctx,
+       status = dcerpc_spoolss_SetPrinter(b, mem_ctx,
                                           &pol,
                                           &info_ctr,
                                           &devmode_ctr,
                                           &secdesc_ctr,
                                           0, /* command */
                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (W_ERROR_IS_OK(result))
                printf("Success in setting printername.\n");
 
  done:
-       if (is_valid_policy_hnd(&pol))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       if (is_valid_policy_hnd(&pol)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
+       }
 
        return result;
 }
@@ -665,6 +687,7 @@ static WERROR cmd_spoolss_getprinter(struct rpc_pipe_client *cli,
        uint32_t        level = 1;
        const char      *printername;
        union spoolss_PrinterInfo info;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc == 1 || argc > 3) {
                printf("Usage: %s <printername> [level]\n", argv[0]);
@@ -731,7 +754,8 @@ static WERROR cmd_spoolss_getprinter(struct rpc_pipe_client *cli,
        }
  done:
        if (is_valid_policy_hnd(&pol)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
        }
 
        return result;
@@ -867,6 +891,7 @@ static WERROR cmd_spoolss_getprinterdata(struct rpc_pipe_client *cli,
        enum winreg_Type type;
        uint8_t *data;
        uint32_t needed;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc != 3) {
                printf("Usage: %s <printername> <valuename>\n", argv[0]);
@@ -909,8 +934,10 @@ static WERROR cmd_spoolss_getprinterdata(struct rpc_pipe_client *cli,
        display_printer_data(valuename, type, data, needed);
 
  done:
-       if (is_valid_policy_hnd(&pol))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       if (is_valid_policy_hnd(&pol)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
+       }
 
        return result;
 }
@@ -932,6 +959,7 @@ static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli,
        uint8_t *data = NULL;
        uint32_t offered = 0;
        uint32_t needed;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc != 4) {
                printf("Usage: %s <printername> <keyname> <valuename>\n",
@@ -966,7 +994,7 @@ static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli,
                goto done;
        }
 
-       status = rpccli_spoolss_GetPrinterDataEx(cli, mem_ctx,
+       status = dcerpc_spoolss_GetPrinterDataEx(b, mem_ctx,
                                                 &pol,
                                                 keyname,
                                                 valuename,
@@ -975,13 +1003,17 @@ static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli,
                                                 offered,
                                                 &needed,
                                                 &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (W_ERROR_EQUAL(result, WERR_MORE_DATA)) {
                offered = needed;
                data = talloc_zero_array(mem_ctx, uint8_t, offered);
                if (!data) {
                        goto done;
                }
-               status = rpccli_spoolss_GetPrinterDataEx(cli, mem_ctx,
+               status = dcerpc_spoolss_GetPrinterDataEx(b, mem_ctx,
                                                         &pol,
                                                         keyname,
                                                         valuename,
@@ -993,6 +1025,7 @@ static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli,
        }
 
        if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
                goto done;
        }
 
@@ -1005,8 +1038,10 @@ static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli,
 
 
  done:
-       if (is_valid_policy_hnd(&pol))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       if (is_valid_policy_hnd(&pol)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
+       }
 
        return result;
 }
@@ -1238,6 +1273,7 @@ static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
        union spoolss_DriverInfo info;
        uint32_t server_major_version;
        uint32_t server_minor_version;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if ((argc == 1) || (argc > 3)) {
                printf("Usage: %s <printername> [level]\n", argv[0]);
@@ -1318,7 +1354,8 @@ static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
        /* Cleanup */
 
        if (is_valid_policy_hnd(&pol)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
        }
 
        if (success) {
@@ -1480,6 +1517,7 @@ static WERROR cmd_spoolss_getdriverdir(struct rpc_pipe_client *cli,
        uint32_t offered;
        union spoolss_DriverDirectoryInfo info;
        uint32_t needed;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc > 2) {
                printf("Usage: %s [environment]\n", argv[0]);
@@ -1494,7 +1532,7 @@ static WERROR cmd_spoolss_getdriverdir(struct rpc_pipe_client *cli,
 
        /* Get the directory.  Only use Info level 1 */
 
-       status = rpccli_spoolss_GetPrinterDriverDirectory(cli, mem_ctx,
+       status = dcerpc_spoolss_GetPrinterDriverDirectory(b, mem_ctx,
                                                          cli->srv_name_slash,
                                                          env,
                                                          1,
@@ -1503,11 +1541,14 @@ static WERROR cmd_spoolss_getdriverdir(struct rpc_pipe_client *cli,
                                                          NULL, /* info */
                                                          &needed,
                                                          &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
        if (W_ERROR_EQUAL(result, WERR_INSUFFICIENT_BUFFER)) {
                offered = needed;
                buffer = data_blob_talloc_zero(mem_ctx, needed);
 
-               status = rpccli_spoolss_GetPrinterDriverDirectory(cli, mem_ctx,
+               status = dcerpc_spoolss_GetPrinterDriverDirectory(b, mem_ctx,
                                                                  cli->srv_name_slash,
                                                                  env,
                                                                  1,
@@ -1516,6 +1557,9 @@ static WERROR cmd_spoolss_getdriverdir(struct rpc_pipe_client *cli,
                                                                  &info,
                                                                  &needed,
                                                                  &result);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return ntstatus_to_werror(status);
+               }
        }
 
        if (W_ERROR_IS_OK(result)) {
@@ -1572,7 +1616,7 @@ static char *get_driver_3_param(TALLOC_CTX *mem_ctx, char *str,
           parameter because two consecutive delimiters
           will not return an empty string.  See man strtok(3)
           for details */
-       if (ptr && (StrCaseCmp(ptr, "NULL") == 0)) {
+       if (ptr && (strcasecmp_m(ptr, "NULL") == 0)) {
                ptr = NULL;
        }
 
@@ -1661,6 +1705,7 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
        struct spoolss_AddDriverInfo3 info3;
        const char              *arch;
        char                    *driver_args;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* parse the command arguments */
        if (argc != 3 && argc != 4)
@@ -1679,7 +1724,7 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
 
        arch = cmd_spoolss_get_short_archi(argv[1]);
        if (!arch) {
-               printf ("Error Unknown architechture [%s]\n", argv[1]);
+               printf ("Error Unknown architecture [%s]\n", argv[1]);
                return WERR_INVALID_PARAM;
        }
 
@@ -1704,7 +1749,7 @@ static WERROR cmd_spoolss_addprinterdriver(struct rpc_pipe_client *cli,
        info_ctr.level          = level;
        info_ctr.info.info3     = &info3;
 
-       status = rpccli_spoolss_AddPrinterDriver(cli, mem_ctx,
+       status = dcerpc_spoolss_AddPrinterDriver(b, mem_ctx,
                                                 cli->srv_name_slash,
                                                 &info_ctr,
                                                 &result);
@@ -1792,6 +1837,7 @@ static WERROR cmd_spoolss_setdriver(struct rpc_pipe_client *cli,
        struct spoolss_SetPrinterInfo2 info2;
        struct spoolss_DevmodeContainer devmode_ctr;
        struct sec_desc_buf secdesc_ctr;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        ZERO_STRUCT(devmode_ctr);
        ZERO_STRUCT(secdesc_ctr);
@@ -1834,16 +1880,20 @@ static WERROR cmd_spoolss_setdriver(struct rpc_pipe_client *cli,
        info_ctr.level = 2;
        info_ctr.info.info2 = &info2;
 
-       status = rpccli_spoolss_SetPrinter(cli, mem_ctx,
+       status = dcerpc_spoolss_SetPrinter(b, mem_ctx,
                                           &pol,
                                           &info_ctr,
                                           &devmode_ctr,
                                           &secdesc_ctr,
                                           0, /* command */
                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (!W_ERROR_IS_OK(result)) {
                printf("SetPrinter call failed!\n");
-               goto done;;
+               goto done;
        }
 
        printf("Successfully set %s to driver %s.\n", argv[1], argv[2]);
@@ -1851,8 +1901,10 @@ static WERROR cmd_spoolss_setdriver(struct rpc_pipe_client *cli,
 done:
        /* Cleanup */
 
-       if (is_valid_policy_hnd(&pol))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       if (is_valid_policy_hnd(&pol)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
+       }
 
        return result;
 }
@@ -1867,6 +1919,7 @@ static WERROR cmd_spoolss_deletedriverex(struct rpc_pipe_client *cli,
 {
        WERROR result, ret = WERR_UNKNOWN_PRINTER_DRIVER;
        NTSTATUS status;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        int   i;
        int vers = -1;
@@ -1899,14 +1952,16 @@ static WERROR cmd_spoolss_deletedriverex(struct rpc_pipe_client *cli,
                        continue;
 
                /* make the call to remove the driver */
-               status = rpccli_spoolss_DeletePrinterDriverEx(cli, mem_ctx,
+               status = dcerpc_spoolss_DeletePrinterDriverEx(b, mem_ctx,
                                                              cli->srv_name_slash,
                                                              archi_table[i].long_archi,
                                                              argv[1],
                                                              delete_flags,
                                                              archi_table[i].version,
                                                              &result);
-
+               if (!NT_STATUS_IS_OK(status)) {
+                       return ntstatus_to_werror(status);
+               }
                if ( !W_ERROR_IS_OK(result) )
                {
                        if ( !W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ) {
@@ -1936,6 +1991,7 @@ static WERROR cmd_spoolss_deletedriver(struct rpc_pipe_client *cli,
        WERROR result = WERR_OK;
        NTSTATUS status;
        int                     i;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* parse the command arguments */
        if (argc != 2) {
@@ -1945,20 +2001,23 @@ static WERROR cmd_spoolss_deletedriver(struct rpc_pipe_client *cli,
 
        /* delete the driver for all architectures */
        for (i=0; archi_table[i].long_archi; i++) {
+               result = WERR_OK;
+
                /* make the call to remove the driver */
-               status = rpccli_spoolss_DeletePrinterDriver(cli, mem_ctx,
+               status = dcerpc_spoolss_DeletePrinterDriver(b, mem_ctx,
                                                            cli->srv_name_slash,
                                                            archi_table[i].long_archi,
                                                            argv[1],
                                                            &result);
                if (!NT_STATUS_IS_OK(status)) {
-                       return result;
+                       result = ntstatus_to_werror(status);
+                       continue;
                }
                if ( !W_ERROR_IS_OK(result) ) {
                        if ( !W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ) {
-                               printf ("Failed to remove driver %s for arch [%s] - error 0x%x!\n",
+                               printf ("Failed to remove driver %s for arch [%s] - error %s!\n",
                                        argv[1], archi_table[i].long_archi,
-                                       W_ERROR_V(result));
+                                       win_errstr(result));
                        }
                } else {
                        printf ("Driver %s removed for arch [%s].\n", argv[1],
@@ -1983,6 +2042,7 @@ static WERROR cmd_spoolss_getprintprocdir(struct rpc_pipe_client *cli,
        uint32_t offered;
        union spoolss_PrintProcessorDirectoryInfo info;
        uint32_t needed;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* parse the command arguments */
        if (argc > 2) {
@@ -1994,7 +2054,7 @@ static WERROR cmd_spoolss_getprintprocdir(struct rpc_pipe_client *cli,
                environment = argv[1];
        }
 
-       status = rpccli_spoolss_GetPrintProcessorDirectory(cli, mem_ctx,
+       status = dcerpc_spoolss_GetPrintProcessorDirectory(b, mem_ctx,
                                                           cli->srv_name_slash,
                                                           environment,
                                                           1,
@@ -2003,11 +2063,14 @@ static WERROR cmd_spoolss_getprintprocdir(struct rpc_pipe_client *cli,
                                                           NULL, /* info */
                                                           &needed,
                                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
        if (W_ERROR_EQUAL(result, WERR_INSUFFICIENT_BUFFER)) {
                offered = needed;
                buffer = data_blob_talloc_zero(mem_ctx, needed);
 
-               status = rpccli_spoolss_GetPrintProcessorDirectory(cli, mem_ctx,
+               status = dcerpc_spoolss_GetPrintProcessorDirectory(b, mem_ctx,
                                                                   cli->srv_name_slash,
                                                                   environment,
                                                                   1,
@@ -2016,6 +2079,9 @@ static WERROR cmd_spoolss_getprintprocdir(struct rpc_pipe_client *cli,
                                                                   &info,
                                                                   &needed,
                                                                   &result);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return ntstatus_to_werror(status);
+               }
        }
 
        if (W_ERROR_IS_OK(result)) {
@@ -2039,6 +2105,7 @@ static WERROR cmd_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
        struct spoolss_AddFormInfo1 info1;
        struct spoolss_AddFormInfo2 info2;
        uint32_t level = 1;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* Parse the command arguments */
 
@@ -2097,20 +2164,28 @@ static WERROR cmd_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
                info.info2 = &info2;
 
                break;
+       default:
+               werror = WERR_INVALID_PARAM;
+               goto done;
        }
 
        /* Add the form */
 
 
-       status = rpccli_spoolss_AddForm(cli, mem_ctx,
+       status = dcerpc_spoolss_AddForm(b, mem_ctx,
                                        &handle,
                                        level,
                                        info,
                                        &werror);
-
+       if (!NT_STATUS_IS_OK(status)) {
+               werror = ntstatus_to_werror(status);
+               goto done;
+       }
  done:
-       if (is_valid_policy_hnd(&handle))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+       if (is_valid_policy_hnd(&handle)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
+       }
 
        return werror;
 }
@@ -2127,6 +2202,7 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
        const char *printername;
        union spoolss_AddFormInfo info;
        struct spoolss_AddFormInfo1 info1;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* Parse the command arguments */
 
@@ -2161,16 +2237,21 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 
        /* Set the form */
 
-       status = rpccli_spoolss_SetForm(cli, mem_ctx,
+       status = dcerpc_spoolss_SetForm(b, mem_ctx,
                                        &handle,
                                        argv[2],
                                        1,
                                        info,
                                        &werror);
-
+       if (!NT_STATUS_IS_OK(status)) {
+               werror = ntstatus_to_werror(status);
+               goto done;
+       }
  done:
-       if (is_valid_policy_hnd(&handle))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+       if (is_valid_policy_hnd(&handle)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
+       }
 
        return werror;
 }
@@ -2244,6 +2325,7 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
        union spoolss_FormInfo info;
        uint32_t needed;
        uint32_t level = 1;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* Parse the command arguments */
 
@@ -2269,7 +2351,7 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
 
        /* Get the form */
 
-       status = rpccli_spoolss_GetForm(cli, mem_ctx,
+       status = dcerpc_spoolss_GetForm(b, mem_ctx,
                                        &handle,
                                        argv[2],
                                        level,
@@ -2278,10 +2360,14 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
                                        &info,
                                        &needed,
                                        &werror);
+       if (!NT_STATUS_IS_OK(status)) {
+               werror = ntstatus_to_werror(status);
+               goto done;
+       }
        if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
                buffer = data_blob_talloc_zero(mem_ctx, needed);
                offered = needed;
-               status = rpccli_spoolss_GetForm(cli, mem_ctx,
+               status = dcerpc_spoolss_GetForm(b, mem_ctx,
                                                &handle,
                                                argv[2],
                                                level,
@@ -2290,10 +2376,14 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
                                                &info,
                                                &needed,
                                                &werror);
+               if (!NT_STATUS_IS_OK(status)) {
+                       werror = ntstatus_to_werror(status);
+                       goto done;
+               }
        }
 
-       if (!NT_STATUS_IS_OK(status)) {
-               return werror;
+       if (!W_ERROR_IS_OK(werror)) {
+               goto done;
        }
 
        switch (level) {
@@ -2306,8 +2396,10 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
        }
 
  done:
-       if (is_valid_policy_hnd(&handle))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+       if (is_valid_policy_hnd(&handle)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
+       }
 
        return werror;
 }
@@ -2323,6 +2415,7 @@ static WERROR cmd_spoolss_deleteform(struct rpc_pipe_client *cli,
        WERROR werror;
        NTSTATUS status;
        const char *printername;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* Parse the command arguments */
 
@@ -2344,17 +2437,20 @@ static WERROR cmd_spoolss_deleteform(struct rpc_pipe_client *cli,
 
        /* Delete the form */
 
-       status = rpccli_spoolss_DeleteForm(cli, mem_ctx,
+       status = dcerpc_spoolss_DeleteForm(b, mem_ctx,
                                           &handle,
                                           argv[2],
                                           &werror);
        if (!NT_STATUS_IS_OK(status)) {
-               return ntstatus_to_werror(status);
+               werror = ntstatus_to_werror(status);
+               goto done;
        }
 
  done:
-       if (is_valid_policy_hnd(&handle))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+       if (is_valid_policy_hnd(&handle)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
+       }
 
        return werror;
 }
@@ -2371,6 +2467,7 @@ static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli,
        const char *printername;
        uint32_t num_forms, level = 1, i;
        union spoolss_FormInfo *forms;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* Parse the command arguments */
 
@@ -2420,8 +2517,10 @@ static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli,
        }
 
  done:
-       if (is_valid_policy_hnd(&handle))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+       if (is_valid_policy_hnd(&handle)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
+       }
 
        return werror;
 }
@@ -2441,6 +2540,7 @@ static WERROR cmd_spoolss_setprinterdata(struct rpc_pipe_client *cli,
        enum winreg_Type type;
        union spoolss_PrinterData data;
        DATA_BLOB blob;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        /* parse the command arguments */
        if (argc < 5) {
@@ -2547,13 +2647,18 @@ static WERROR cmd_spoolss_setprinterdata(struct rpc_pipe_client *cli,
                goto done;
        }
 
-       status = rpccli_spoolss_SetPrinterData(cli, mem_ctx,
+       status = dcerpc_spoolss_SetPrinterData(b, mem_ctx,
                                               &pol,
                                               argv[3], /* value_name */
                                               type,
                                               blob.data,
                                               blob.length,
                                               &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf ("Unable to set [%s=%s]!\n", argv[3], argv[4]);
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (!W_ERROR_IS_OK(result)) {
                printf ("Unable to set [%s=%s]!\n", argv[3], argv[4]);
                goto done;
@@ -2575,7 +2680,8 @@ static WERROR cmd_spoolss_setprinterdata(struct rpc_pipe_client *cli,
 done:
        /* cleanup */
        if (is_valid_policy_hnd(&pol)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &_result);
        }
 
        return result;
@@ -2634,6 +2740,7 @@ static WERROR cmd_spoolss_enum_jobs(struct rpc_pipe_client *cli,
        const char *printername;
        struct policy_handle hnd;
        union spoolss_JobInfo *info;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc < 2 || argc > 3) {
                printf("Usage: %s printername [level]\n", argv[0]);
@@ -2685,7 +2792,8 @@ static WERROR cmd_spoolss_enum_jobs(struct rpc_pipe_client *cli,
 
 done:
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -2704,6 +2812,7 @@ static WERROR cmd_spoolss_get_job(struct rpc_pipe_client *cli,
        uint32_t job_id;
        uint32_t level = 1;
        union spoolss_JobInfo info;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc < 3 || argc > 4) {
                printf("Usage: %s printername job_id [level]\n", argv[0]);
@@ -2761,7 +2870,8 @@ static WERROR cmd_spoolss_get_job(struct rpc_pipe_client *cli,
 
 done:
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -2807,6 +2917,7 @@ static WERROR cmd_spoolss_set_job(struct rpc_pipe_client *cli,
        struct policy_handle hnd;
        uint32_t job_id;
        enum spoolss_JobControl command;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc != 4) {
                printf("Usage: %s printername job_id command\n", argv[0]);
@@ -2832,20 +2943,24 @@ static WERROR cmd_spoolss_set_job(struct rpc_pipe_client *cli,
 
        /* Set Job */
 
-       status = rpccli_spoolss_SetJob(cli, mem_ctx,
+       status = dcerpc_spoolss_SetJob(b, mem_ctx,
                                       &hnd,
                                       job_id,
                                       NULL,
                                       command,
                                       &result);
-
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (!W_ERROR_IS_OK(result)) {
                goto done;
        }
 
 done:
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -2860,16 +2975,13 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
 {
        WERROR result;
        NTSTATUS status;
-       uint32_t i = 0;
        const char *printername;
        struct policy_handle hnd;
-       uint32_t value_offered = 0;
-       const char *value_name = NULL;
        uint32_t value_needed;
        enum winreg_Type type;
-       uint8_t *data = NULL;
-       uint32_t data_offered = 0;
        uint32_t data_needed;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
+       struct spoolss_EnumPrinterData r;
 
        if (argc != 2) {
                printf("Usage: %s printername\n", argv[0]);
@@ -2890,44 +3002,55 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
 
        /* Enumerate data */
 
-       status = rpccli_spoolss_EnumPrinterData(cli, mem_ctx,
-                                               &hnd,
-                                               i,
-                                               value_name,
-                                               value_offered,
-                                               &value_needed,
-                                               &type,
-                                               data,
-                                               data_offered,
-                                               &data_needed,
-                                               &result);
+       r.in.handle = &hnd;
+       r.in.enum_index = 0;
+       r.in.value_offered = 0;
+       r.in.data_offered = 0;
+       r.out.value_name = NULL;
+       r.out.value_needed = &value_needed;
+       r.out.type = &type;
+       r.out.data = NULL;
+       r.out.data_needed = &data_needed;
+
+       status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
+
+       if (!W_ERROR_IS_OK(r.out.result)) {
+               result = r.out.result;
+               goto done;
+       }
+
+       r.in.data_offered       = *r.out.data_needed;
+       r.in.value_offered      = *r.out.value_needed;
+       r.out.data              = talloc_zero_array(mem_ctx, uint8_t, r.in.data_offered);
+       r.out.value_name        = talloc_zero_array(mem_ctx, char, r.in.value_offered);
+
+       do {
+
+               status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
+               if (!NT_STATUS_IS_OK(status)) {
+                       result = ntstatus_to_werror(status);
+                       goto done;
+               }
+
+               if (W_ERROR_EQUAL(r.out.result, WERR_NO_MORE_ITEMS)) {
+                       result = WERR_OK;
+                       break;
+               }
 
-       data_offered    = data_needed;
-       value_offered   = value_needed;
-       data            = talloc_zero_array(mem_ctx, uint8_t, data_needed);
-       value_name      = talloc_zero_array(mem_ctx, char, value_needed);
-
-       while (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
-
-               status = rpccli_spoolss_EnumPrinterData(cli, mem_ctx,
-                                                       &hnd,
-                                                       i++,
-                                                       value_name,
-                                                       value_offered,
-                                                       &value_needed,
-                                                       &type,
-                                                       data,
-                                                       data_offered,
-                                                       &data_needed,
-                                                       &result);
-               if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
+               r.in.enum_index++;
+
+               {
                        struct regval_blob *v;
 
                        v = regval_compose(talloc_tos(),
-                                          value_name,
-                                          type,
-                                          data,
-                                          data_offered);
+                                          r.out.value_name,
+                                          *r.out.type,
+                                          r.out.data,
+                                          r.in.data_offered);
                        if (v == NULL) {
                                result = WERR_NOMEM;
                                goto done;
@@ -2936,15 +3059,13 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
                        display_reg_value(v);
                        talloc_free(v);
                }
-       }
 
-       if (W_ERROR_V(result) == ERRnomoreitems) {
-               result = W_ERROR(ERRsuccess);
-       }
+       } while (W_ERROR_IS_OK(r.out.result));
 
 done:
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -2963,6 +3084,7 @@ static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli,
        struct policy_handle hnd;
        uint32_t count;
        struct spoolss_PrinterEnumValues *info;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc != 3) {
                printf("Usage: %s printername <keyname>\n", argv[0]);
@@ -3002,7 +3124,8 @@ static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli,
 
  done:
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -3022,6 +3145,7 @@ static WERROR cmd_spoolss_enum_printerkey(struct rpc_pipe_client *cli,
        const char **key_buffer = NULL;
        int i;
        uint32_t offered = 0;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc < 2 || argc > 4) {
                printf("Usage: %s printername [keyname] [offered]\n", argv[0]);
@@ -3069,7 +3193,8 @@ static WERROR cmd_spoolss_enum_printerkey(struct rpc_pipe_client *cli,
  done:
 
        if (is_valid_policy_hnd(&hnd)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
        }
 
        return result;
@@ -3088,6 +3213,7 @@ static WERROR cmd_spoolss_rffpcnex(struct rpc_pipe_client *cli,
        WERROR result;
        NTSTATUS status;
        struct spoolss_NotifyOption option;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        if (argc != 2) {
                printf("Usage: %s printername\n", argv[0]);
@@ -3145,7 +3271,7 @@ static WERROR cmd_spoolss_rffpcnex(struct rpc_pipe_client *cli,
 
        /* Send rffpcnex */
 
-       status = rpccli_spoolss_RemoteFindFirstPrinterChangeNotifyEx(cli, mem_ctx,
+       status = dcerpc_spoolss_RemoteFindFirstPrinterChangeNotifyEx(b, mem_ctx,
                                                                     &hnd,
                                                                     0,
                                                                     0,
@@ -3153,14 +3279,20 @@ static WERROR cmd_spoolss_rffpcnex(struct rpc_pipe_client *cli,
                                                                     123,
                                                                     &option,
                                                                     &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (!W_ERROR_IS_OK(result)) {
                printf("Error rffpcnex %s\n", argv[1]);
                goto done;
        }
 
 done:
-       if (is_valid_policy_hnd(&hnd))
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &hnd, NULL);
+       if (is_valid_policy_hnd(&hnd)) {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &_result);
+       }
 
        return result;
 }
@@ -3304,7 +3436,7 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
                                        lp_workgroup(),
                                        get_cmdline_auth_info_password(rpcclient_auth_info),
                                        get_cmdline_auth_info_use_kerberos(rpcclient_auth_info) ? CLI_FULL_CONNECTION_USE_KERBEROS : 0,
-                                       get_cmdline_auth_info_signing_state(rpcclient_auth_info), NULL);
+                                       get_cmdline_auth_info_signing_state(rpcclient_auth_info));
 
        if ( !NT_STATUS_IS_OK(nt_status) )
                return WERR_GENERAL_FAILURE;
@@ -3357,8 +3489,11 @@ done:
        /* cleanup */
 
        printf("Closing printers...");
-       rpccli_spoolss_ClosePrinter( cli, mem_ctx, &hPrinter1, NULL );
-       rpccli_spoolss_ClosePrinter( cli2, mem_ctx, &hPrinter2, NULL );
+       {
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(cli->binding_handle, mem_ctx, &hPrinter1, &_result);
+               dcerpc_spoolss_ClosePrinter(cli2->binding_handle, mem_ctx, &hPrinter2, &_result);
+       }
        printf("ok\n");
 
        /* close the second remote connection */
@@ -3546,6 +3681,7 @@ static WERROR cmd_spoolss_create_printer_ic(struct rpc_pipe_client *cli,
        struct policy_handle handle, gdi_handle;
        const char *printername;
        struct spoolss_DevmodeContainer devmode_ctr;
+       struct dcerpc_binding_handle *b = cli->binding_handle;
 
        RPCCLIENT_PRINTERNAME(printername, cli, argv[1]);
 
@@ -3559,21 +3695,27 @@ static WERROR cmd_spoolss_create_printer_ic(struct rpc_pipe_client *cli,
 
        ZERO_STRUCT(devmode_ctr);
 
-       status = rpccli_spoolss_CreatePrinterIC(cli, mem_ctx,
+       status = dcerpc_spoolss_CreatePrinterIC(b, mem_ctx,
                                                &handle,
                                                &gdi_handle,
                                                &devmode_ctr,
                                                &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
        if (!W_ERROR_IS_OK(result)) {
                goto done;
        }
 
  done:
        if (is_valid_policy_hnd(&gdi_handle)) {
-               rpccli_spoolss_DeletePrinterIC(cli, mem_ctx, &gdi_handle, NULL);
+               WERROR _result;
+               dcerpc_spoolss_DeletePrinterIC(b, mem_ctx, &gdi_handle, &_result);
        }
        if (is_valid_policy_hnd(&handle)) {
-               rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+               WERROR _result;
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &_result);
        }
 
        return result;