1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-22 22:04:08 +03:00

added rpcecho EchoData test

(This used to be commit 9c7e4db4712d1b2b7d8125e3ae535efd50b80f58)
This commit is contained in:
Andrew Tridgell 2003-11-03 09:18:38 +00:00
parent 87ef172531
commit 399fff106d
5 changed files with 133 additions and 1 deletions

View File

@ -91,7 +91,19 @@ NTSTATUS ndr_pull_u32(struct ndr_pull *ndr, uint32 *v)
} else {
*v = IVAL(ndr->data, ndr->offset);
}
ndr->offset += 2;
ndr->offset += 4;
return NT_STATUS_OK;
}
/*
parse a set of bytes
*/
NTSTATUS ndr_pull_bytes(struct ndr_pull *ndr, char **data, uint32 n)
{
NDR_PULL_NEED_BYTES(ndr, n);
NDR_ALLOC_N(ndr, *data, n);
memcpy(*data, ndr->data + ndr->offset, n);
ndr->offset += n;
return NT_STATUS_OK;
}
@ -138,3 +150,14 @@ NTSTATUS ndr_push_u32(struct ndr_push *ndr, uint32 v)
ndr->offset += 4;
return NT_STATUS_OK;
}
/*
push some bytes
*/
NTSTATUS ndr_push_bytes(struct ndr_push *ndr, const char *data, uint32 n)
{
NDR_PUSH_NEED_BYTES(ndr, n);
memcpy(ndr->data + ndr->offset, data, n);
ndr->offset += n;
return NT_STATUS_OK;
}

View File

@ -44,3 +44,27 @@ NTSTATUS ndr_push_rpcecho_addone(struct ndr_push *ndr,
NDR_CHECK(ndr_push_u32(ndr, r->in.data));
return NT_STATUS_OK;
}
/*
parse a echodata
*/
NTSTATUS ndr_pull_rpcecho_echodata(struct ndr_pull *ndr,
struct rpcecho_echodata *r)
{
NDR_CHECK(ndr_pull_u32(ndr, &r->out.len));
NDR_CHECK(ndr_pull_bytes(ndr, &r->out.data, r->out.len));
return NT_STATUS_OK;
}
/*
push a echodata
*/
NTSTATUS ndr_push_rpcecho_echodata(struct ndr_push *ndr,
struct rpcecho_echodata *r)
{
NDR_CHECK(ndr_push_u32(ndr, r->in.len));
NDR_CHECK(ndr_push_u32(ndr, r->in.len));
NDR_CHECK(ndr_push_bytes(ndr, r->in.data, r->in.len));
return NT_STATUS_OK;
}

View File

@ -35,6 +35,18 @@ struct rpcecho_addone {
} out;
};
/* EchoData interface */
struct rpcecho_echodata {
struct {
int len;
const char *data;
} in;
struct {
int len;
char *data;
} out;
};
/* define the command codes */
enum {
RPCECHO_CALL_ADDONE=0,

View File

@ -52,3 +52,34 @@ NTSTATUS dcerpc_rpcecho_addone(struct dcerpc_pipe *p,
talloc_destroy(mem_ctx);
return status;
}
/*
echodata interface
*/
NTSTATUS dcerpc_rpcecho_echodata(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx,
int len,
const char *in_data,
int *out_len,
char **out_data)
{
struct rpcecho_echodata r;
NTSTATUS status;
/* fill the .in side of the call */
r.in.len = len;
r.in.data = in_data;
/* make the call */
status = dcerpc_ndr_request(p, RPCECHO_CALL_ECHODATA, mem_ctx,
(ndr_push_fn_t) ndr_push_rpcecho_echodata,
(ndr_pull_fn_t) ndr_pull_rpcecho_echodata,
&r);
/* and extract the .out parameters */
*out_len = r.out.len;
*out_data = r.out.data;
return status;
}

View File

@ -45,6 +45,44 @@ static BOOL test_addone(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
return True;
}
/*
test the EchoData interface
*/
static BOOL test_echodata(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
int i;
NTSTATUS status;
char *data_in, *data_out;
int len = 10;
int len_out;
printf("\nTesting EchoData\n");
data_in = talloc(mem_ctx, len);
for (i=0;i<len;i++) {
data_in[i] = i+1;
}
status = dcerpc_rpcecho_echodata(p, mem_ctx,
len,
data_in,
&len_out,
&data_out);
if (!NT_STATUS_IS_OK(status)) {
printf("EchoData(%d) failed\n", len);
return False;
}
printf("EchoData(%d) returned %d bytes\n", len, len_out);
if (memcmp(data_in, data_out, len) != 0) {
printf("Bad data returned!\n");
return False;
}
return True;
}
BOOL torture_rpc_echo(int dummy)
{
NTSTATUS status;
@ -63,6 +101,10 @@ BOOL torture_rpc_echo(int dummy)
ret = False;
}
if (!test_echodata(p, mem_ctx)) {
ret = False;
}
printf("\n");
torture_rpc_close(p);