Add enumdataex command
authorJim McDonough <jmcd@samba.org>
Fri, 8 Nov 2002 21:40:31 +0000 (21:40 +0000)
committerJim McDonough <jmcd@samba.org>
Fri, 8 Nov 2002 21:40:31 +0000 (21:40 +0000)
(This used to be commit 932a5012731b133d49d1c2d6b28f15e4480ddf53)

source3/rpcclient/cmd_spoolss.c

index 5149c051e188a3671206fe3ad18db71fd80a827d..4b5c6676e88aa71a87fc3ddb0b139791013ab450 100644 (file)
@@ -1827,6 +1827,19 @@ static void display_reg_value(REGISTRY_VALUE value)
                printf("%s: REG_BINARY: unknown length value not displayed\n",
                       value.valuename);
                break;
+       case REG_MULTI_SZ: {
+               uint16 *curstr = (uint16 *) value.data_p;
+               uint8 *start = value.data_p;
+               printf("%s: REG_MULTI_SZ:\n", value.valuename);
+               while ((*curstr != 0) && 
+                      ((uint8 *) curstr < start + value.size)) {
+                       rpcstr_pull(text, curstr, sizeof(text), -1, 
+                                   STR_TERMINATE);
+                       printf("  %s\n", text);
+                       curstr += strlen(text) + 1;
+               }
+       }
+       break;
        default:
                printf("%s: unknown type %d\n", value.valuename, value.type);
        }
@@ -1892,6 +1905,72 @@ done:
        return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
 }
 
+/* enumerate data for a given key */
+
+static NTSTATUS cmd_spoolss_enum_data_ex( struct cli_state *cli, 
+                                         TALLOC_CTX *mem_ctx, int argc, 
+                                         char **argv)
+{
+       WERROR result;
+       uint32 needed, i;
+       BOOL got_hnd = False;
+       pstring printername;
+       fstring servername, user;
+       char *keyname = NULL;
+       POLICY_HND hnd;
+       REGVAL_CTR ctr;
+
+       if (argc != 3) {
+               printf("Usage: %s printername <keyname>\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+       
+       keyname = argv[2];
+
+       /* Open printer handle */
+
+       slprintf(servername, sizeof(fstring)-1, "\\\\%s", cli->desthost);
+       strupper(servername);
+       fstrcpy(user, cli->user_name);
+       fstrcpy(printername, argv[1]);
+       slprintf(printername, sizeof(pstring)-1, "\\\\%s\\", cli->desthost);
+       strupper(printername);
+       pstrcat(printername, argv[1]);
+
+       result = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, 
+                                            "", MAXIMUM_ALLOWED_ACCESS, 
+                                            servername, user, &hnd);
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+       got_hnd = True;
+
+       /* Enumerate subkeys */
+
+       result = cli_spoolss_enumprinterdataex(
+               cli, mem_ctx, 0, &needed, &hnd, keyname, NULL);
+
+       if (W_ERROR_V(result) == ERRmoredata)
+               result = cli_spoolss_enumprinterdataex(
+                       cli, mem_ctx, needed, NULL, &hnd, keyname, &ctr);
+
+       if (!W_ERROR_IS_OK(result))
+               goto done;
+
+       for (i=0; i < ctr.num_values; i++) {
+               display_reg_value(*(ctr.values[i]));
+       }
+
+       regval_ctr_destroy(&ctr);
+
+done:
+       if (got_hnd)
+               cli_spoolss_close_printer(cli, mem_ctx, &hnd);
+
+       return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+}
+
 /* enumerate subkeys */
 
 static NTSTATUS cmd_spoolss_enum_printerkey( struct cli_state *cli, 
@@ -2055,6 +2134,7 @@ struct cmd_set spoolss_commands[] = {
        { "addprinter",         cmd_spoolss_addprinterex,       PI_SPOOLSS, "Add a printer",                       "" },
        { "deldriver",          cmd_spoolss_deletedriver,       PI_SPOOLSS, "Delete a printer driver",             "" },
        { "enumdata",           cmd_spoolss_enum_data,          PI_SPOOLSS, "Enumerate printer data",              "" },
+       { "enumdataex",         cmd_spoolss_enum_data_ex,       PI_SPOOLSS, "Enumerate printer data for a key",    "" },
        { "enumkey",            cmd_spoolss_enum_printerkey,    PI_SPOOLSS, "Enumerate printer keys",              "" },
        { "enumjobs",           cmd_spoolss_enum_jobs,          PI_SPOOLSS, "Enumerate print jobs",                "" },
        { "enumports",          cmd_spoolss_enum_ports,         PI_SPOOLSS, "Enumerate printer ports",             "" },