diff options
Diffstat (limited to 'source/rpcclient/cmd_spoolss.c')
-rw-r--r-- | source/rpcclient/cmd_spoolss.c | 415 |
1 files changed, 103 insertions, 312 deletions
diff --git a/source/rpcclient/cmd_spoolss.c b/source/rpcclient/cmd_spoolss.c index 15648e4d1b5..0296afd776a 100644 --- a/source/rpcclient/cmd_spoolss.c +++ b/source/rpcclient/cmd_spoolss.c @@ -92,9 +92,10 @@ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, pstring printername; fstring servername, user; POLICY_HND hnd; - - if (argc != 2) { - printf("Usage: %s <printername>\n", argv[0]); + uint32 desired_access = MAXIMUM_ALLOWED_ACCESS; + + if (argc != 2 && argc != 3) { + printf("Usage: %s <printername> [0xallowed_access]\n", argv[0]); return NT_STATUS_OK; } @@ -106,10 +107,13 @@ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, fstrcpy (user, cli->user_name); fstrcpy (printername, argv[1]); + if (argc == 3) + desired_access = strtol(argv[2], NULL, 16); + /* Open the printer handle */ werror = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, - "", MAXIMUM_ALLOWED_ACCESS, + "", desired_access, servername, user, &hnd); if (W_ERROR_IS_OK(werror)) { @@ -118,8 +122,11 @@ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, if (!W_ERROR_IS_OK(werror)) { printf("Error closing printer handle! (%s)\n", - get_dos_error_msg(werror)); + dos_errstr(werror)); } + } else { + printf("Failed to open printer %s: %s\n", printername, + dos_errstr(werror)); } return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; @@ -138,10 +145,10 @@ static void display_print_info_0(PRINTER_INFO_0 *i0) return; if (i0->printername.buffer) - rpcstr_pull(name, i0->printername.buffer, sizeof(name), -1, STR_TERMINATE); + rpcstr_pull(name, i0->printername.buffer, sizeof(name), 0, STR_TERMINATE); if (i0->servername.buffer) - rpcstr_pull(servername, i0->servername.buffer, sizeof(servername), -1,STR_TERMINATE); + rpcstr_pull(servername, i0->servername.buffer, sizeof(servername), 0,STR_TERMINATE); printf("\tprintername:[%s]\n", name); printf("\tservername:[%s]\n", servername); @@ -182,7 +189,7 @@ static void display_print_info_0(PRINTER_INFO_0 *i0) printf("\tunknown27:[0x%x]\n", i0->unknown27); printf("\tunknown28:[0x%x]\n", i0->unknown28); printf("\tunknown29:[0x%x]\n", i0->unknown29); - + printf("\n"); } @@ -196,15 +203,15 @@ static void display_print_info_1(PRINTER_INFO_1 *i1) fstring comm = ""; if (i1->description.buffer) - rpcstr_pull(desc, i1->description.buffer, sizeof(desc), -1, + rpcstr_pull(desc, i1->description.buffer, sizeof(desc), 0, STR_TERMINATE); if (i1->name.buffer) - rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, + rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); if (i1->comment.buffer) - rpcstr_pull(comm, i1->comment.buffer, sizeof(comm), -1, + rpcstr_pull(comm, i1->comment.buffer, sizeof(comm), 0, STR_TERMINATE); printf("\tflags:[0x%x]\n", i1->flags); @@ -233,37 +240,37 @@ static void display_print_info_2(PRINTER_INFO_2 *i2) fstring parameters = ""; if (i2->servername.buffer) - rpcstr_pull(servername, i2->servername.buffer,sizeof(servername), -1, STR_TERMINATE); + rpcstr_pull(servername, i2->servername.buffer,sizeof(servername), 0, STR_TERMINATE); if (i2->printername.buffer) - rpcstr_pull(printername, i2->printername.buffer,sizeof(printername), -1, STR_TERMINATE); + rpcstr_pull(printername, i2->printername.buffer,sizeof(printername), 0, STR_TERMINATE); if (i2->sharename.buffer) - rpcstr_pull(sharename, i2->sharename.buffer,sizeof(sharename), -1, STR_TERMINATE); + rpcstr_pull(sharename, i2->sharename.buffer,sizeof(sharename), 0, STR_TERMINATE); if (i2->portname.buffer) - rpcstr_pull(portname, i2->portname.buffer,sizeof(portname), -1, STR_TERMINATE); + rpcstr_pull(portname, i2->portname.buffer,sizeof(portname), 0, STR_TERMINATE); if (i2->drivername.buffer) - rpcstr_pull(drivername, i2->drivername.buffer,sizeof(drivername), -1, STR_TERMINATE); + rpcstr_pull(drivername, i2->drivername.buffer,sizeof(drivername), 0, STR_TERMINATE); if (i2->comment.buffer) - rpcstr_pull(comment, i2->comment.buffer,sizeof(comment), -1, STR_TERMINATE); + rpcstr_pull(comment, i2->comment.buffer,sizeof(comment), 0, STR_TERMINATE); if (i2->location.buffer) - rpcstr_pull(location, i2->location.buffer,sizeof(location), -1, STR_TERMINATE); + rpcstr_pull(location, i2->location.buffer,sizeof(location), 0, STR_TERMINATE); if (i2->sepfile.buffer) - rpcstr_pull(sepfile, i2->sepfile.buffer,sizeof(sepfile), -1, STR_TERMINATE); + rpcstr_pull(sepfile, i2->sepfile.buffer,sizeof(sepfile), 0, STR_TERMINATE); if (i2->printprocessor.buffer) - rpcstr_pull(printprocessor, i2->printprocessor.buffer,sizeof(printprocessor), -1, STR_TERMINATE); + rpcstr_pull(printprocessor, i2->printprocessor.buffer,sizeof(printprocessor), 0, STR_TERMINATE); if (i2->datatype.buffer) - rpcstr_pull(datatype, i2->datatype.buffer,sizeof(datatype), -1, STR_TERMINATE); + rpcstr_pull(datatype, i2->datatype.buffer,sizeof(datatype), 0, STR_TERMINATE); if (i2->parameters.buffer) - rpcstr_pull(parameters, i2->parameters.buffer,sizeof(parameters), -1, STR_TERMINATE); + rpcstr_pull(parameters, i2->parameters.buffer,sizeof(parameters), 0, STR_TERMINATE); printf("\tservername:[%s]\n", servername); printf("\tprintername:[%s]\n", printername); @@ -313,22 +320,15 @@ static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, uint32 info_level = 1; PRINTER_INFO_CTR ctr; uint32 i = 0, num_printers, needed; - fstring name; - if (argc > 3) + if (argc > 2) { - printf("Usage: %s [level] [name]\n", argv[0]); + printf("Usage: %s [level]\n", argv[0]); return NT_STATUS_OK; } - if (argc == 2) + if (argc == 2) { info_level = atoi(argv[1]); - - if (argc == 3) - fstrcpy(name, argv[2]); - else { - slprintf(name, sizeof(name)-1, "\\\\%s", cli->desthost); - strupper(name); } /* Enumerate printers -- Should we enumerate types other @@ -337,12 +337,12 @@ static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, ZERO_STRUCT(ctr); result = cli_spoolss_enum_printers( - cli, mem_ctx, 0, &needed, name, PRINTER_ENUM_LOCAL, + cli, mem_ctx, 0, &needed, PRINTER_ENUM_LOCAL, info_level, &num_printers, &ctr); if (W_ERROR_V(result) == ERRinsufficientbuffer) result = cli_spoolss_enum_printers( - cli, mem_ctx, needed, NULL, name, PRINTER_ENUM_LOCAL, + cli, mem_ctx, needed, NULL, PRINTER_ENUM_LOCAL, info_level, &num_printers, &ctr); if (W_ERROR_IS_OK(result)) { @@ -353,21 +353,21 @@ static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, } for (i = 0; i < num_printers; i++) { - switch(info_level) { - case 0: + switch(info_level) { + case 0: display_print_info_0(&ctr.printers_0[i]); - break; - case 1: + break; + case 1: display_print_info_1(&ctr.printers_1[i]); - break; - case 2: + break; + case 2: display_print_info_2(&ctr.printers_2[i]); - break; - case 3: + break; + case 3: display_print_info_3(&ctr.printers_3[i]); - break; - default: - printf("unknown info level %d\n", info_level); + break; + default: + printf("unknown info level %d\n", info_level); goto done; } } @@ -384,7 +384,7 @@ static void display_port_info_1(PORT_INFO_1 *i1) { fstring buffer; - rpcstr_pull(buffer, i1->port_name.buffer, sizeof(buffer), -1, STR_TERMINATE); + rpcstr_pull(buffer, i1->port_name.buffer, sizeof(buffer), 0, STR_TERMINATE); printf("\tPort Name:\t[%s]\n", buffer); } @@ -395,12 +395,12 @@ static void display_port_info_2(PORT_INFO_2 *i2) { fstring buffer; - rpcstr_pull(buffer, i2->port_name.buffer, sizeof(buffer), -1, STR_TERMINATE); + rpcstr_pull(buffer, i2->port_name.buffer, sizeof(buffer), 0, STR_TERMINATE); printf("\tPort Name:\t[%s]\n", buffer); - rpcstr_pull(buffer, i2->monitor_name.buffer, sizeof(buffer), -1, STR_TERMINATE); + rpcstr_pull(buffer, i2->monitor_name.buffer, sizeof(buffer), 0, STR_TERMINATE); printf("\tMonitor Name:\t[%s]\n", buffer); - rpcstr_pull(buffer, i2->description.buffer, sizeof(buffer), -1, STR_TERMINATE); + rpcstr_pull(buffer, i2->description.buffer, sizeof(buffer), 0, STR_TERMINATE); printf("\tDescription:\t[%s]\n", buffer); printf("\tPort Type:\t[%d]\n", i2->port_type); @@ -445,7 +445,7 @@ static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, switch (info_level) { case 1: display_port_info_1(&ctr.port.info_1[i]); - break; + break; case 2: display_port_info_2(&ctr.port.info_2[i]); break; @@ -455,14 +455,14 @@ static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, } } } - + return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } /*********************************************************************** * Set printer comment - use a level2 set. */ -static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, +static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, char **argv) { @@ -472,14 +472,14 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, uint32 info_level = 2; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; - fstring printername, + fstring printername, servername, user, comment; if (argc == 1 || argc > 3) { printf("Usage: %s printername comment\n", argv[0]); - + return NT_STATUS_OK; } @@ -492,15 +492,15 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, strupper (servername); fstrcpy (printername, argv[1]); fstrcpy (user, cli->user_name); - + /* get a printer handle */ result = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, - user, &pol); + user, &pol); if (!W_ERROR_IS_OK(result)) goto done; - + opened_hnd = True; /* Get printer info */ @@ -510,7 +510,7 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, result = cli_spoolss_getprinter(cli, mem_ctx, needed, NULL, &pol, info_level, &ctr); if (!W_ERROR_IS_OK(result)) - goto done; + goto done; /* Modify the comment. */ @@ -518,12 +518,12 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, ctr.printers_2->devmode = NULL; ctr.printers_2->secdesc = NULL; - result = cli_spoolss_setprinter(cli, mem_ctx, &pol, info_level, &ctr, 0); + result = cli_spoolss_setprinter(cli, mem_ctx, &pol, info_level, &ctr, 0); if (W_ERROR_IS_OK(result)) printf("Success in setting comment.\n"); - done: - if (opened_hnd) + done: + if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; @@ -532,7 +532,7 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, /*********************************************************************** * Get printer information */ -static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, +static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, char **argv) { @@ -541,7 +541,7 @@ static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, uint32 info_level = 1; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; - fstring printername, + fstring printername, servername, user; uint32 needed; @@ -620,7 +620,7 @@ static void display_print_driver_1(DRIVER_INFO_1 *i1) if (i1 == NULL) return; - rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); + rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); printf ("Printer Driver Info 1:\n"); printf ("\tDriver Name: [%s]\n\n", name); @@ -641,11 +641,11 @@ static void display_print_driver_2(DRIVER_INFO_2 *i1) if (i1 == NULL) return; - rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); - rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), -1, STR_TERMINATE); - rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, STR_TERMINATE); - rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, STR_TERMINATE); - rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, STR_TERMINATE); + rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); + rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), 0, STR_TERMINATE); + rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), 0, STR_TERMINATE); + rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), 0, STR_TERMINATE); + rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), 0, STR_TERMINATE); printf ("Printer Driver Info 2:\n"); printf ("\tVersion: [%x]\n", i1->version); @@ -679,14 +679,14 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1) if (i1 == NULL) return; - rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); - rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), -1, STR_TERMINATE); - rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, STR_TERMINATE); - rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, STR_TERMINATE); - rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, STR_TERMINATE); - rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), -1, STR_TERMINATE); - rpcstr_pull(monitorname, i1->monitorname.buffer, sizeof(monitorname), -1, STR_TERMINATE); - rpcstr_pull(defaultdatatype, i1->defaultdatatype.buffer, sizeof(defaultdatatype), -1, STR_TERMINATE); + rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); + rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), 0, STR_TERMINATE); + rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), 0, STR_TERMINATE); + rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), 0, STR_TERMINATE); + rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), 0, STR_TERMINATE); + rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), 0, STR_TERMINATE); + rpcstr_pull(monitorname, i1->monitorname.buffer, sizeof(monitorname), 0, STR_TERMINATE); + rpcstr_pull(defaultdatatype, i1->defaultdatatype.buffer, sizeof(defaultdatatype), 0, STR_TERMINATE); printf ("Printer Driver Info 3:\n"); printf ("\tVersion: [%x]\n", i1->version); @@ -699,7 +699,7 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1) while (valid) { - rpcstr_pull(dependentfiles, i1->dependentfiles+length, sizeof(dependentfiles), -1, STR_TERMINATE); + rpcstr_pull(dependentfiles, i1->dependentfiles+length, sizeof(dependentfiles), 0, STR_TERMINATE); length+=strlen(dependentfiles)+1; @@ -780,13 +780,13 @@ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, if (W_ERROR_V(werror) == ERRinsufficientbuffer) werror = cli_spoolss_getprinterdriver( cli, mem_ctx, needed, NULL, &pol, info_level, - archi_table[i].long_archi, &ctr); + archi_table[i].long_archi, &ctr); if (!W_ERROR_IS_OK(werror)) continue; printf ("\n[%s]\n", archi_table[i].long_archi); - + switch (info_level) { case 1: display_print_driver_1 (ctr.info1); @@ -894,7 +894,7 @@ static void display_printdriverdir_1(DRIVER_DIRECTORY_1 *i1) if (i1 == NULL) return; - rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); + rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); printf ("\tDirectory Name:[%s]\n", name); } @@ -931,7 +931,7 @@ static NTSTATUS cmd_spoolss_getdriverdir(struct cli_state *cli, if (W_ERROR_V(result) == ERRinsufficientbuffer) result = cli_spoolss_getprinterdriverdir( cli, mem_ctx, needed, NULL, 1, env, &ctr); - + if (W_ERROR_IS_OK(result)) display_printdriverdir_1(ctr.info1); @@ -1090,7 +1090,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, if (W_ERROR_IS_OK(result)) { rpcstr_pull(driver_name, info3.name.buffer, - sizeof(driver_name), -1, STR_TERMINATE); + sizeof(driver_name), 0, STR_TERMINATE); printf ("Printer Driver %s successfully installed.\n", driver_name); } @@ -1100,7 +1100,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, - TALLOC_CTX *mem_ctx, + TALLOC_CTX *mem_ctx, int argc, char **argv) { WERROR result; @@ -1151,13 +1151,12 @@ static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, result = cli_spoolss_addprinterex (cli, mem_ctx, level, &ctr); if (W_ERROR_IS_OK(result)) - printf ("Printer %s successfully installed.\n", argv[1]); + printf ("Printer %s successfully installed.\n", argv[1]); return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } -static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, - TALLOC_CTX *mem_ctx, +static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, char **argv) { POLICY_HND pol; @@ -1185,8 +1184,8 @@ static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, /* Get a printer handle */ - result = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", - MAXIMUM_ALLOWED_ACCESS, + result = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", + PRINTER_ALL_ACCESS, servername, user, &pol); if (!W_ERROR_IS_OK(result)) @@ -1199,12 +1198,10 @@ static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, ZERO_STRUCT (info2); ctr.printers_2 = &info2; - result = cli_spoolss_getprinter(cli, mem_ctx, 0, &needed, - &pol, level, &ctr); + result = cli_spoolss_getprinter(cli, mem_ctx, 0, &needed, &pol, level, &ctr); if (W_ERROR_V(result) == ERRinsufficientbuffer) - result = cli_spoolss_getprinter( - cli, mem_ctx, needed, NULL, &pol, level, &ctr); + result = cli_spoolss_getprinter(cli, mem_ctx, needed, NULL, &pol, level, &ctr); if (!W_ERROR_IS_OK(result)) { printf ("Unable to retrieve printer information!\n"); @@ -1234,7 +1231,7 @@ done: } -static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, +static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, char **argv) { @@ -1291,7 +1288,7 @@ static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, strupper(servername); if (asprintf(&environment, "%s", (argc == 2) ? argv[1] : - PRINTER_DRIVER_ARCHITECTURE) < 0) { + PRINTER_DRIVER_ARCHITECTURE) < 0) { SAFE_FREE(servername); return NT_STATUS_NO_MEMORY; } @@ -1595,7 +1592,7 @@ static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, if (forms[i].name.buffer) rpcstr_pull(form_name, forms[i].name.buffer, - sizeof(form_name), -1, STR_TERMINATE); + sizeof(form_name), 0, STR_TERMINATE); printf("%s\n", form_name); } @@ -1620,8 +1617,7 @@ static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, POLICY_HND pol; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; - PRINTER_INFO_0 info; - REGISTRY_VALUE value; + PRINTER_INFO_0 *info = NULL; /* parse the command arguements */ if (argc != 4) { @@ -1642,30 +1638,23 @@ static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, goto done; opened_hnd = True; - - ctr.printers_0 = &info; - + result = cli_spoolss_getprinter(cli, mem_ctx, 0, &needed, &pol, 0, &ctr); if (W_ERROR_V(result) == ERRinsufficientbuffer) result = cli_spoolss_getprinter(cli, mem_ctx, needed, NULL, &pol, 0, &ctr); - + if (!W_ERROR_IS_OK(result)) - goto done; + goto done; printf("%s\n", timestring(True)); - printf("\tchange_id (before set)\t:[0x%x]\n", info.change_id); + printf("\tchange_id (before set)\t:[0x%x]\n", info->change_id); + /* Set the printer data */ - fstrcpy(value.valuename, argv[2]); - value.type = REG_SZ; - value.size = strlen(argv[3]) + 1; - value.data_p = talloc_memdup(mem_ctx, argv[3], value.size); - - result = cli_spoolss_setprinterdata(cli, mem_ctx, &pol, &value); - + result = cli_spoolss_setprinterdata(cli, mem_ctx, &pol, argv[2], argv[3]); if (!W_ERROR_IS_OK(result)) { printf ("Unable to set [%s=%s]!\n", argv[2], argv[3]); goto done; @@ -1678,10 +1667,10 @@ static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, result = cli_spoolss_getprinter(cli, mem_ctx, needed, NULL, &pol, 0, &ctr); if (!W_ERROR_IS_OK(result)) - goto done; + goto done; printf("%s\n", timestring(True)); - printf("\tchange_id (after set)\t:[0x%x]\n", info.change_id); + printf("\tchange_id (after set)\t:[0x%x]\n", info->change_id); done: /* cleanup */ @@ -1691,203 +1680,6 @@ done: return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } -static void display_job_info_1(JOB_INFO_1 *job) -{ - fstring username = "", document = "", text_status = ""; - - if (job->username.buffer) - rpcstr_pull(username, job->username.buffer, - sizeof(username), -1, STR_TERMINATE); - - if (job->document.buffer) - rpcstr_pull(document, job->document.buffer, - sizeof(document), -1, STR_TERMINATE); - - if (job->text_status.buffer) - rpcstr_pull(text_status, job->text_status.buffer, - sizeof(text_status), -1, STR_TERMINATE); - - printf("%d: jobid[%d]: %s %s %s %d/%d pages\n", job->position, job->jobid, - username, document, text_status, job->pagesprinted, - job->totalpages); -} - -static void display_job_info_2(JOB_INFO_2 *job) -{ - fstring username = "", document = "", text_status = ""; - - if (job->username.buffer) - rpcstr_pull(username, job->username.buffer, - sizeof(username), -1, STR_TERMINATE); - - if (job->document.buffer) - rpcstr_pull(document, job->document.buffer, - sizeof(document), -1, STR_TERMINATE); - - if (job->text_status.buffer) - rpcstr_pull(text_status, job->text_status.buffer, - sizeof(text_status), -1, STR_TERMINATE); - - printf("%d: jobid[%d]: %s %s %s %d/%d pages, %d bytes\n", job->position, job->jobid, - username, document, text_status, job->pagesprinted, - job->totalpages, job->size); -} - -/* Enumerate jobs */ - -static NTSTATUS cmd_spoolss_enum_jobs(struct cli_state *cli, - TALLOC_CTX *mem_ctx, int argc, - char **argv) -{ - WERROR result; - uint32 needed, level = 1, num_jobs, i; - BOOL got_hnd = False; - pstring printername; - fstring servername, user; - POLICY_HND hnd; - JOB_INFO_CTR ctr; - - if (argc < 2 || argc > 3) { - printf("Usage: %s printername [level]\n", argv[0]); - return NT_STATUS_OK; - } - - if (argc == 3) - level = atoi(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 ports */ - - result = cli_spoolss_enumjobs( - cli, mem_ctx, 0, &needed, &hnd, level, 0, 1000, - &num_jobs, &ctr); - - if (W_ERROR_V(result) == ERRinsufficientbuffer) - result = cli_spoolss_enumjobs( - cli, mem_ctx, needed, NULL, &hnd, level, 0, - 1000, &num_jobs, &ctr); - - if (!W_ERROR_IS_OK(result)) - goto done; - - for (i = 0; i < num_jobs; i++) { - switch(level) { - case 1: - display_job_info_1(&ctr.job.job_info_1[i]); - break; - case 2: - display_job_info_2(&ctr.job.job_info_2[i]); - break; - default: - d_printf("unknown info level %d\n", level); - break; - } - } - -done: - if (got_hnd) - cli_spoolss_close_printer(cli, mem_ctx, &hnd); - - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS cmd_spoolss_rffpcnex(struct cli_state *cli, - TALLOC_CTX *mem_ctx, int argc, - char **argv) -{ - fstring servername, printername; - POLICY_HND hnd; - BOOL got_hnd = False; - WERROR result; - SPOOL_NOTIFY_OPTION option; - - if (argc != 2) { - printf("Usage: %s printername\n", argv[0]); - result = WERR_OK; - goto done; - } - - /* Open printer */ - - slprintf(servername, sizeof(fstring) - 1, "\\\\%s", cli->desthost); - strupper(servername); - - slprintf(printername, sizeof(fstring) - 1, "\\\\%s\\%s", cli->desthost, - argv[1]); - strupper(printername); - - result = cli_spoolss_open_printer_ex( - cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, - servername, cli->user_name, &hnd); - - if (!W_ERROR_IS_OK(result)) { - printf("Error opening %s\n", argv[1]); - goto done; - } - - got_hnd = True; - - /* Create spool options */ - - ZERO_STRUCT(option); - - option.version = 2; - option.option_type_ptr = 1; - option.count = option.ctr.count = 2; - - option.ctr.type = (SPOOL_NOTIFY_OPTION_TYPE *)talloc( - mem_ctx, sizeof(SPOOL_NOTIFY_OPTION_TYPE) * 2); - - ZERO_STRUCT(option.ctr.type[0]); - option.ctr.type[0].type = PRINTER_NOTIFY_TYPE; - option.ctr.type[0].count = option.ctr.type[0].count2 = 1; - option.ctr.type[0].fields_ptr = 1; - option.ctr.type[0].fields[0] = PRINTER_NOTIFY_SERVER_NAME; - - ZERO_STRUCT(option.ctr.type[1]); - option.ctr.type[1].type = JOB_NOTIFY_TYPE; - option.ctr.type[1].count = option.ctr.type[1].count2 = 1; - option.ctr.type[1].fields_ptr = 1; - option.ctr.type[1].fields[0] = JOB_NOTIFY_PRINTER_NAME; - - /* Send rffpcnex */ - - slprintf(servername, sizeof(fstring) - 1, "\\\\%s", myhostname()); - strupper(servername); - - result = cli_spoolss_rffpcnex( - cli, mem_ctx, &hnd, 0, 0, servername, 123, &option); - - if (!W_ERROR_IS_OK(result)) { - printf("Error rffpcnex %s\n", argv[1]); - goto done; - } - -done: - if (got_hnd) - cli_spoolss_close_printer(cli, mem_ctx, &hnd); - - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - /* List of commands exported by this module */ struct cmd_set spoolss_commands[] = { @@ -1897,7 +1689,7 @@ struct cmd_set spoolss_commands[] = { { "addprinter", cmd_spoolss_addprinterex, PIPE_SPOOLSS, "Add a printer", "" }, { "deldriver", cmd_spoolss_deletedriver, PIPE_SPOOLSS, "Delete a printer driver", "" }, { "enumdata", cmd_spoolss_not_implemented, PIPE_SPOOLSS, "Enumerate printer data (*)", "" }, - { "enumjobs", cmd_spoolss_enum_jobs, PIPE_SPOOLSS, "Enumerate print jobs", "" }, + { "enumjobs", cmd_spoolss_not_implemented, PIPE_SPOOLSS, "Enumerate print jobs (*)", "" }, { "enumports", cmd_spoolss_enum_ports, PIPE_SPOOLSS, "Enumerate printer ports", "" }, { "enumdrivers", cmd_spoolss_enum_drivers, PIPE_SPOOLSS, "Enumerate installed printer drivers", "" }, { "enumprinters", cmd_spoolss_enum_printers, PIPE_SPOOLSS, "Enumerate printers", "" }, @@ -1916,7 +1708,6 @@ struct cmd_set spoolss_commands[] = { { "enumforms", cmd_spoolss_enum_forms, PIPE_SPOOLSS, "Enumerate forms", "" }, { "setprinter", cmd_spoolss_setprinter, PIPE_SPOOLSS, "Set printer comment", "" }, { "setprinterdata", cmd_spoolss_setprinterdata, PIPE_SPOOLSS, "Set REG_SZ printer data", "" }, - { "rffpcnex", cmd_spoolss_rffpcnex, PIPE_SPOOLSS, "Rffpcnex test", "" }, { NULL } }; |