1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-24 13:57:43 +03:00

r2209: patch from volker to add EnumPorts spoolss IDL and test code

the ndr->offset=0; stuff is ugly. We need a better way to handle this.
This commit is contained in:
Andrew Tridgell 2004-09-03 13:36:58 +00:00 committed by Gerald (Jerry) Carter
parent ef5414676e
commit e909bfa708
3 changed files with 109 additions and 0 deletions

View File

@ -464,9 +464,31 @@
[out] uint32 count
);
typedef [flag(RELATIVE_CURRENT)] struct {
[relative] nstring *port_name;
} spoolss_PortInfo1;
typedef struct {
[relative] nstring *port_name;
[relative] nstring *monitor_name;
[relative] nstring *description;
uint32 port_type;
uint32 reserved;
} spoolss_PortInfo2;
typedef [nondiscriminant,public] union {
[case(1)] spoolss_PortInfo1 info1;
[case(2)] spoolss_PortInfo2 info2;
} spoolss_PortInfo;
/******************/
/* Function: 0x23 */
WERROR spoolss_EnumPorts(
[in] unistr *servername,
[in] uint32 level,
[in,out] DATA_BLOB *buffer,
[in,out,ref] uint32 *buf_size,
[out] uint32 count
);
/******************/

View File

@ -36,6 +36,8 @@ NTSTATUS pull_spoolss_PrinterInfoArray(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
}
NDR_ALLOC_N(ndr, *info, count);
for (i=0;i<count;i++) {
ndr->data += ndr->offset;
ndr->offset = 0;
NDR_CHECK(ndr_pull_spoolss_PrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, level, &(*info)[i]));
}
return NT_STATUS_OK;
@ -91,3 +93,22 @@ NTSTATUS pull_spoolss_DriverInfoArray(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
}
return NT_STATUS_OK;
}
NTSTATUS pull_spoolss_PortInfoArray(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
uint32_t level, uint32_t count,
union spoolss_PortInfo **info)
{
int i;
struct ndr_pull *ndr;
ndr = ndr_pull_init_blob(blob, mem_ctx);
if (!ndr) {
return NT_STATUS_NO_MEMORY;
}
NDR_ALLOC_N(ndr, *info, count);
for (i=0;i<count;i++) {
ndr->data += ndr->offset;
ndr->offset = 0;
NDR_CHECK(ndr_pull_spoolss_PortInfo(ndr, NDR_SCALARS|NDR_BUFFERS, level, &(*info)[i]));
}
return NT_STATUS_OK;
}

View File

@ -270,6 +270,68 @@ static BOOL test_AddForm(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return ret;
}
static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
NTSTATUS status;
struct spoolss_EnumPorts r;
uint32_t buf_size;
r.in.servername = talloc_asprintf(mem_ctx, "\\\\%s",
dcerpc_server_name(p));
r.in.level = 2;
r.in.buffer = NULL;
buf_size = 0;
r.in.buf_size = &buf_size;
r.out.buf_size = &buf_size;
printf("Testing EnumPorts\n");
status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumPorts failed -- %s\n", nt_errstr(status));
return False;
}
if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
union spoolss_PortInfo *info;
int j;
data_blob_clear(&blob);
r.in.buffer = &blob;
status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumPorts failed -- %s\n", nt_errstr(status));
return False;
}
if (!r.out.buffer) {
printf("No ports returned");
return False;
}
status = pull_spoolss_PortInfoArray(r.out.buffer, mem_ctx,
r.in.level, r.out.count,
&info);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumPortArray parse failed - %s\n",
nt_errstr(status));
return False;
}
for (j=0;j<r.out.count;j++) {
printf("Port %d\n", j);
NDR_PRINT_UNION_DEBUG(spoolss_PortInfo, r.in.level,
&info[j]);
}
}
return True;
}
static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, uint32_t job_id)
{
@ -973,6 +1035,10 @@ BOOL torture_rpc_spoolss(int dummy)
return False;
}
if (!test_EnumPorts(p, mem_ctx)) {
ret = False;
}
if (!test_EnumPrinters(p, mem_ctx)) {
ret = False;
}