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:
parent
ef5414676e
commit
e909bfa708
@ -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
|
||||
);
|
||||
|
||||
/******************/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user