summaryrefslogtreecommitdiffstats
path: root/source/rpcclient/cmd_spoolss.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/rpcclient/cmd_spoolss.c')
-rw-r--r--source/rpcclient/cmd_spoolss.c415
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 }
};