1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

added wkssvc.idl and test code

I think this is our first complete pipe for Samba4 (albeit a simple
one). Of course, there may be lots more info levels that Samba3 didn't
do. Time to explore :)
(This used to be commit 3305226140793f39af827b63c270486c1966718e)
This commit is contained in:
Andrew Tridgell 2003-11-17 12:43:18 +00:00
parent d285c6f14f
commit 892aa2fc75
8 changed files with 312 additions and 3 deletions

View File

@ -196,11 +196,11 @@ LIBCLIUTIL_OBJ = libcli/util/asn1.o \
LIBRAW_NDR_OBJ = librpc/ndr/ndr.o librpc/ndr/ndr_basic.o librpc/ndr/ndr_sec.o \
librpc/ndr/ndr_echo.o librpc/ndr/ndr_misc.o librpc/ndr/ndr_lsa.o \
librpc/ndr/ndr_dfs.o librpc/ndr/ndr_samr.o \
librpc/ndr/ndr_spoolss.o librpc/ndr/ndr_spoolss_buf.o
librpc/ndr/ndr_spoolss.o librpc/ndr/ndr_spoolss_buf.o librpc/ndr/ndr_wkssvc.o
LIBRAW_RPC_OBJ = librpc/rpc/dcerpc.o librpc/rpc/rpc_echo.o librpc/rpc/rpc_lsa.o \
librpc/rpc/dcerpc_smb.o librpc/rpc/rpc_dfs.o librpc/rpc/rpc_spoolss.o \
librpc/rpc/rpc_samr.o
librpc/rpc/rpc_samr.o librpc/rpc/rpc_wkssvc.o
LIBRAW_OBJ = libcli/raw/rawfile.o libcli/raw/smb_signing.o \
libcli/raw/clisocket.o libcli/raw/clitransport.o \
@ -509,7 +509,7 @@ SMBTORTURE_RAW_OBJ = torture/raw/qfsinfo.o torture/raw/qfileinfo.o torture/raw/s
torture/raw/write.o torture/raw/lock.o torture/raw/rename.o torture/raw/seek.o
SMBTORTURE_RPC_OBJ = torture/rpc/lsa.o torture/rpc/echo.o torture/rpc/dfs.o \
torture/rpc/spoolss.o torture/rpc/samr.o
torture/rpc/spoolss.o torture/rpc/samr.o torture/rpc/wkssvc.o
SMBTORTURE_OBJ1 = torture/torture.o torture/torture_util.o torture/nbio.o torture/scanner.o \
torture/utable.o torture/denytest.o torture/mangle_test.o \

View File

@ -0,0 +1,30 @@
/*
wkssvc interface definitions
*/
[ uuid(6bffd098-a112-3610-9833-46c3f87e345a),
version(1.0),
pointer_default(unique)
] interface wkssvc
{
/******************/
/* Function: 0x00 */
typedef struct {
uint32 platform_id; /* 0x0000 01f4 - unknown */
unistr *uni_compname; /* unicode server name */
unistr *uni_lan_grp; /* unicode domain name */
uint32 ver_major; /* 4 - unknown */
uint32 ver_minor; /* 0 - unknown */
} wks_Info100;
typedef union {
case (100) wks_Info100 *info100;
} wks_Info;
NTSTATUS wks_QueryInfo(
[in] unistr *server_name,
[in] uint32 level,
[out,switch_is(level)] wks_Info info
);
}

View File

@ -195,3 +195,4 @@ typedef void (*ndr_print_union_fn_t)(struct ndr_print *, const char *, uint16, v
#include "librpc/ndr/ndr_spoolss.h"
#include "librpc/ndr/ndr_spoolss_buf.h"
#include "librpc/ndr/ndr_samr.h"
#include "librpc/ndr/ndr_wkssvc.h"

View File

@ -0,0 +1,162 @@
/* parser auto-generated by pidl */
#include "includes.h"
NTSTATUS ndr_push_wks_QueryInfo(struct ndr_push *ndr, struct wks_QueryInfo *r)
{
NDR_CHECK(ndr_push_ptr(ndr, r->in.server_name));
if (r->in.server_name) {
NDR_CHECK(ndr_push_unistr(ndr, r->in.server_name));
}
NDR_CHECK(ndr_push_uint32(ndr, r->in.level));
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_wks_Info100(struct ndr_pull *ndr, int ndr_flags, struct wks_Info100 *r)
{
uint32 _ptr_uni_compname;
uint32 _ptr_uni_lan_grp;
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_uint32(ndr, &r->platform_id));
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_uni_compname));
if (_ptr_uni_compname) {
NDR_ALLOC(ndr, r->uni_compname);
} else {
r->uni_compname = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_uni_lan_grp));
if (_ptr_uni_lan_grp) {
NDR_ALLOC(ndr, r->uni_lan_grp);
} else {
r->uni_lan_grp = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &r->ver_major));
NDR_CHECK(ndr_pull_uint32(ndr, &r->ver_minor));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->uni_compname) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->uni_compname));
}
if (r->uni_lan_grp) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->uni_lan_grp));
}
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_wks_Info(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union wks_Info *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_struct_start(ndr));
NDR_CHECK(ndr_pull_uint16(ndr, level));
switch (*level) {
case 100: {
uint32 _ptr_info100;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info100));
if (_ptr_info100) {
NDR_ALLOC(ndr, r->info100);
} else {
r->info100 = NULL;
}
break; }
default:
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
}
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
switch (*level) {
case 100:
if (r->info100) {
NDR_CHECK(ndr_pull_wks_Info100(ndr, NDR_SCALARS|NDR_BUFFERS, r->info100));
}
break;
default:
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
}
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_wks_QueryInfo(struct ndr_pull *ndr, struct wks_QueryInfo *r)
{
{ uint16 _level = r->in.level;
NDR_CHECK(ndr_pull_wks_Info(ndr, NDR_SCALARS|NDR_BUFFERS, &_level, &r->out.info));
if (((NDR_SCALARS|NDR_BUFFERS) & NDR_SCALARS) && (_level != r->in.level)) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u in info");
}
NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result));
return NT_STATUS_OK;
}
void ndr_print_wks_Info100(struct ndr_print *ndr, const char *name, struct wks_Info100 *r)
{
ndr_print_struct(ndr, name, "wks_Info100");
ndr->depth++;
ndr_print_uint32(ndr, "platform_id", r->platform_id);
ndr_print_ptr(ndr, "uni_compname", r->uni_compname);
ndr->depth++;
if (r->uni_compname) {
ndr_print_unistr(ndr, "uni_compname", r->uni_compname);
}
ndr->depth--;
ndr_print_ptr(ndr, "uni_lan_grp", r->uni_lan_grp);
ndr->depth++;
if (r->uni_lan_grp) {
ndr_print_unistr(ndr, "uni_lan_grp", r->uni_lan_grp);
}
ndr->depth--;
ndr_print_uint32(ndr, "ver_major", r->ver_major);
ndr_print_uint32(ndr, "ver_minor", r->ver_minor);
ndr->depth--;
}
void ndr_print_wks_Info(struct ndr_print *ndr, const char *name, uint16 level, union wks_Info *r)
{
ndr_print_union(ndr, name, level, "wks_Info");
switch (level) {
case 100:
ndr_print_ptr(ndr, "info100", r->info100);
ndr->depth++;
if (r->info100) {
ndr_print_wks_Info100(ndr, "info100", r->info100);
}
ndr->depth--;
break;
default:
ndr_print_bad_level(ndr, name, level);
}
}
void ndr_print_wks_QueryInfo(struct ndr_print *ndr, const char *name, int flags, struct wks_QueryInfo *r)
{
ndr_print_struct(ndr, name, "wks_QueryInfo");
ndr->depth++;
if (flags & NDR_IN) {
ndr_print_struct(ndr, "in", "wks_QueryInfo");
ndr->depth++;
ndr_print_ptr(ndr, "server_name", r->in.server_name);
ndr->depth++;
if (r->in.server_name) {
ndr_print_unistr(ndr, "server_name", r->in.server_name);
}
ndr->depth--;
ndr_print_uint32(ndr, "level", r->in.level);
ndr->depth--;
}
if (flags & NDR_OUT) {
ndr_print_struct(ndr, "out", "wks_QueryInfo");
ndr->depth++;
ndr_print_wks_Info(ndr, "info", r->in.level, &r->out.info);
ndr->depth--;
}
ndr->depth--;
}

View File

@ -0,0 +1,28 @@
/* header auto-generated by pidl */
struct wks_Info100 {
uint32 platform_id;
const char *uni_compname;
const char *uni_lan_grp;
uint32 ver_major;
uint32 ver_minor;
};
union wks_Info {
/* [case(100)] */ struct wks_Info100 *info100;
};
struct wks_QueryInfo {
struct {
const char *server_name;
uint32 level;
} in;
struct {
union wks_Info info;
NTSTATUS result;
} out;
};
#define DCERPC_WKS_QUERYINFO 0

View File

@ -0,0 +1,18 @@
/* dcerpc client calls auto-generated by pidl */
#include "includes.h"
NTSTATUS dcerpc_wks_QueryInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct wks_QueryInfo *r)
{
NTSTATUS status;
status = dcerpc_ndr_request(p, DCERPC_WKS_QUERYINFO, mem_ctx,
(ndr_push_fn_t) ndr_push_wks_QueryInfo,
(ndr_pull_fn_t) ndr_pull_wks_QueryInfo,
r);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
return r->out.result;
}

View File

@ -0,0 +1,69 @@
/*
Unix SMB/CIFS implementation.
test suite for wkssvc rpc operations
Copyright (C) Andrew Tridgell 2003
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
static BOOL test_QueryInfo(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx)
{
NTSTATUS status;
struct wks_QueryInfo r;
printf("testing QueryInfo\n");
r.in.server_name = dcerpc_server_name(p);
r.in.level = 100;
status = dcerpc_wks_QueryInfo(p, mem_ctx, &r);
if (!NT_STATUS_IS_OK(status)) {
printf("QueryInfo failed - %s\n", nt_errstr(status));
return False;
}
NDR_PRINT_BOTH_DEBUG(wks_QueryInfo, &r);
return True;
}
BOOL torture_rpc_wkssvc(int dummy)
{
NTSTATUS status;
struct dcerpc_pipe *p;
TALLOC_CTX *mem_ctx;
BOOL ret = True;
struct policy_handle handle;
mem_ctx = talloc_init("torture_rpc_wkssvc");
status = torture_rpc_connection(&p, "wkssvc");
if (!NT_STATUS_IS_OK(status)) {
return False;
}
if (!test_QueryInfo(p, mem_ctx)) {
ret = False;
}
torture_rpc_close(p);
return ret;
}

View File

@ -3989,6 +3989,7 @@ static struct {
{"RPC-DFS", torture_rpc_dfs, 0},
{"RPC-SPOOLSS", torture_rpc_spoolss, 0},
{"RPC-SAMR", torture_rpc_samr, 0},
{"RPC-WKSSVC", torture_rpc_wkssvc, 0},
{NULL, NULL, 0}};