s3: remove POLICY_HND.
[samba.git] / source3 / libads / ldap_printer.c
index 169c3bba1de6f5ef455ec22c808cbd483ca27e28..9be366dc29d599334c443a6da3b6935984325b6e 100644 (file)
@@ -310,66 +310,88 @@ WERROR get_remote_printer_publishing_data(struct rpc_pipe_client *cli,
                                          const char *printer)
 {
        WERROR result;
-       char *printername, *servername;
-       REGVAL_CTR *dsdriver_ctr, *dsspooler_ctr;
+       char *printername;
+       struct spoolss_PrinterEnumValues *info;
+       uint32_t count;
        uint32 i;
-       POLICY_HND pol;
+       struct policy_handle pol;
 
-       if ((asprintf(&servername, "\\\\%s", cli->desthost) == -1)
-           || (asprintf(&printername, "%s\\%s", servername, printer) == -1)) {
+       if ((asprintf(&printername, "%s\\%s", cli->srv_name_slash, printer) == -1)) {
                DEBUG(3, ("Insufficient memory\n"));
                return WERR_NOMEM;
        }
-       
-       result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, 
-                                            "", MAXIMUM_ALLOWED_ACCESS, 
-                                            servername, cli->auth->user_name,
-                                            &pol);
+
+       result = rpccli_spoolss_openprinter_ex(cli, mem_ctx,
+                                              printername,
+                                              SEC_FLAG_MAXIMUM_ALLOWED,
+                                              &pol);
        if (!W_ERROR_IS_OK(result)) {
                DEBUG(3, ("Unable to open printer %s, error is %s.\n",
                          printername, win_errstr(result)));
+               SAFE_FREE(printername);
                return result;
        }
-       
-       if ( !(dsdriver_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) ) 
-               return WERR_NOMEM;
 
-       result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSDRIVER_KEY, dsdriver_ctr);
+       result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol,
+                                                 SPOOL_DSDRIVER_KEY,
+                                                 0,
+                                                 &count,
+                                                 &info);
 
        if (!W_ERROR_IS_OK(result)) {
                DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
                          printername, win_errstr(result)));
        } else {
-               uint32 num_values = regval_ctr_numvals( dsdriver_ctr );
-
                /* Have the data we need now, so start building */
-               for (i=0; i < num_values; i++) {
-                       map_regval_to_ads(mem_ctx, mods, dsdriver_ctr->values[i]);
+               for (i=0; i < count; i++) {
+                       REGISTRY_VALUE v;
+                       DATA_BLOB blob;
+
+                       result = push_spoolss_PrinterData(mem_ctx, &blob,
+                                                         info[i].type,
+                                                         info[i].data);
+                       if (W_ERROR_IS_OK(result)) {
+                               fstrcpy(v.valuename, info[i].value_name);
+                               v.type = info[i].type;
+                               v.data_p = blob.data;
+                               v.size = blob.length;
+
+                               map_regval_to_ads(mem_ctx, mods, &v);
+                       }
                }
        }
-       
-       if ( !(dsspooler_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) )
-               return WERR_NOMEM;
-
-       result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSSPOOLER_KEY, dsspooler_ctr);
 
+       result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol,
+                                                 SPOOL_DSSPOOLER_KEY,
+                                                 0,
+                                                 &count,
+                                                 &info);
        if (!W_ERROR_IS_OK(result)) {
                DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
                          printername, win_errstr(result)));
        } else {
-               uint32 num_values = regval_ctr_numvals( dsspooler_ctr );
-
-               for (i=0; i<num_values; i++) {
-                       map_regval_to_ads(mem_ctx, mods, dsspooler_ctr->values[i]);
+               for (i=0; i < count; i++) {
+                       REGISTRY_VALUE v;
+                       DATA_BLOB blob;
+
+                       result = push_spoolss_PrinterData(mem_ctx, &blob,
+                                                         info[i].type,
+                                                         info[i].data);
+                       if (W_ERROR_IS_OK(result)) {
+                               fstrcpy(v.valuename, info[i].value_name);
+                               v.type = info[i].type;
+                               v.data_p = blob.data;
+                               v.size = blob.length;
+
+                               map_regval_to_ads(mem_ctx, mods, &v);
+                       }
                }
        }
-       
-       ads_mod_str(mem_ctx, mods, SPOOL_REG_PRINTERNAME, printer);
 
-       TALLOC_FREE( dsdriver_ctr );
-       TALLOC_FREE( dsspooler_ctr );
+       ads_mod_str(mem_ctx, mods, SPOOL_REG_PRINTERNAME, printer);
 
-       rpccli_spoolss_close_printer(cli, mem_ctx, &pol);
+       rpccli_spoolss_ClosePrinter(cli, mem_ctx, &pol, NULL);
+       SAFE_FREE(printername);
 
        return result;
 }