From 8709182fd3c740619fdb075b24023b1eaf192fcd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 8 Apr 2004 19:06:37 +0000 Subject: r126: - add first srvsvc and wkssvc server side stuff - we know can browse the server via the Windows Explorer - some little fixes to the winreg server pipe metze (This used to be commit 6f213a3494d3b5ab629944394b20a84075a04438) --- source4/rpc_server/common/common.h | 28 + source4/rpc_server/common/server_info.c | 55 ++ source4/rpc_server/common/share_info.c | 105 +++ source4/rpc_server/config.m4 | 7 +- source4/rpc_server/srvsvc/dcesrv_srvsvc.c | 1210 +++++++++++++++++++++++++++++ source4/rpc_server/winreg/rpc_winreg.c | 4 +- source4/rpc_server/wkssvc/dcesrv_wkssvc.c | 378 +++++++++ 7 files changed, 1784 insertions(+), 3 deletions(-) create mode 100644 source4/rpc_server/common/common.h create mode 100644 source4/rpc_server/common/server_info.c create mode 100644 source4/rpc_server/common/share_info.c create mode 100644 source4/rpc_server/srvsvc/dcesrv_srvsvc.c create mode 100644 source4/rpc_server/wkssvc/dcesrv_wkssvc.c diff --git a/source4/rpc_server/common/common.h b/source4/rpc_server/common/common.h new file mode 100644 index 0000000000..bf31958b89 --- /dev/null +++ b/source4/rpc_server/common/common.h @@ -0,0 +1,28 @@ +/* + Unix SMB/CIFS implementation. + + common macros for the dcerpc server interfaces + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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. +*/ + +#define WERR_TALLOC_CHECK(x) do {\ + if (!(x)) {\ + r->out.result = WERR_NOMEM;\ + return NT_STATUS_OK;\ + }\ +} while (0) diff --git a/source4/rpc_server/common/server_info.c b/source4/rpc_server/common/server_info.c new file mode 100644 index 0000000000..9c57d819e1 --- /dev/null +++ b/source4/rpc_server/common/server_info.c @@ -0,0 +1,55 @@ +/* + Unix SMB/CIFS implementation. + + common server info functions + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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" + +/* + Here are common server info functions used by some dcerpc server interfaces +*/ + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_platform_id(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + return 500; +} + +const char *dcesrv_common_get_server_name(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + return lp_netbios_name(); +} + +const char *dcesrv_common_get_domain_name(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + return lp_workgroup(); +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_version_major(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + return 5; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_version_minor(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + return 2; +} diff --git a/source4/rpc_server/common/share_info.c b/source4/rpc_server/common/share_info.c new file mode 100644 index 0000000000..68b770437d --- /dev/null +++ b/source4/rpc_server/common/share_info.c @@ -0,0 +1,105 @@ +/* + Unix SMB/CIFS implementation. + + common share info functions + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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" + +/* + Here are common server info functions used by some dcerpc server interfaces +*/ + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_count_of_shares(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx) +{ + /* what's about int -> uint32 overflow */ + return lp_numservices(); +} + +const char *dcesrv_common_get_share_name(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return lp_servicename(snum); +} + +const char *dcesrv_common_get_share_comment(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return lp_comment(snum); +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_permissions(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return 0; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_max_users(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return 10; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_current_users(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return 1; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_type(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + /* for disk share 0x00000000 + * for IPC$ share 0x00000003 + * + * administrative shares: + * ADMIN$, C$ and IPC$ are type |= 0x80000000 + * this ones are hidden in NetShareEnum, but shown in NetShareEnumAll + */ + return 0; +} + +/* This hardcoded value should go into a ldb database! */ +const char *dcesrv_common_get_share_path(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return "C:\\"; +} + +/* This hardcoded value should go into a ldb database! */ +const char *dcesrv_common_get_share_password(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return NULL; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_csc_policy(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return 0; +} + +/* This hardcoded value should go into a ldb database! */ +uint32 dcesrv_common_get_share_unknown(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return 0; +} + +/* This hardcoded value should go into a ldb database! */ +struct security_decriptor *dcesrv_common_get_security_descriptor(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, int snum) +{ + return NULL; +} diff --git a/source4/rpc_server/config.m4 b/source4/rpc_server/config.m4 index 388208c09d..eeecc7642f 100644 --- a/source4/rpc_server/config.m4 +++ b/source4/rpc_server/config.m4 @@ -1,10 +1,15 @@ dnl # DCERPC Server subsystem +SMB_SUBSYSTEM(DCERPC_COMMON,[], + [rpc_server/common/server_info.o rpc_server/common/share_info.o]) + SMB_MODULE(dcerpc_rpcecho,DCERPC,STATIC,[rpc_server/echo/rpc_echo.o]) SMB_MODULE(dcerpc_epmapper,DCERPC,STATIC,[rpc_server/epmapper/rpc_epmapper.o]) SMB_MODULE(dcerpc_remote,DCERPC,STATIC,[rpc_server/remote/dcesrv_remote.o]) +SMB_MODULE(dcerpc_srvsvc,DCERPC,STATIC,[rpc_server/srvsvc/dcesrv_srvsvc.o]) +SMB_MODULE(dcerpc_wkssvc,DCERPC,STATIC,[rpc_server/wkssvc/dcesrv_wkssvc.o]) SMB_MODULE(dcerpc_winreg,DCERPC,STATIC,[rpc_server/winreg/rpc_winreg.o \$(REG_OBJS)],[],[\$(REG_LIBS)]) SMB_SUBSYSTEM(DCERPC,rpc_server/dcerpc_server.o, - [rpc_server/dcerpc_tcp.o rpc_server/dcesrv_auth.o rpc_server/handles.o], + [rpc_server/dcerpc_tcp.o rpc_server/dcesrv_auth.o rpc_server/handles.o \$(DCERPC_COMMON_OBJS)], rpc_server/dcesrv_public_proto.h) diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c new file mode 100644 index 0000000000..2cf886c12b --- /dev/null +++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c @@ -0,0 +1,1210 @@ +/* + Unix SMB/CIFS implementation. + + endpoint server for the srvsvc pipe + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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" +#include "rpc_server/common/common.h" + +/* + srvsvc_NetCharDevEnum +*/ +static NTSTATUS srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevEnum *r) +{ + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = 0; + r->out.ctr.ctr0->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = 0; + r->out.ctr.ctr1->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevGetInfo +*/ +static NTSTATUS srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevGetInfo *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + r->out.info.info1 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevControl +*/ +static NTSTATUS srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevControl *r) +{ + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevQEnum +*/ +static NTSTATUS srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevQEnum *r) +{ + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = 0; + r->out.ctr.ctr0->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = 0; + r->out.ctr.ctr1->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevQGetInfo +*/ +static NTSTATUS srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevQGetInfo *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + r->out.info.info1 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevQSetInfo +*/ +static NTSTATUS srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevQSetInfo *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevQPurge +*/ +static NTSTATUS srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevQPurge *r) +{ + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NetCharDevQPurgeSelf +*/ +static NTSTATUS srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetCharDevQPurgeSelf *r) +{ + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NetConnEnum +*/ +static NTSTATUS srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetConnEnum *r) +{ + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = 0; + r->out.ctr.ctr0->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 1: { + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = 0; + r->out.ctr.ctr1->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetFileEnum +*/ +static NTSTATUS srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetFileEnum *r) +{ + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 2: { + r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr2); + WERR_TALLOC_CHECK(r->out.ctr.ctr2); + + r->out.ctr.ctr2->count = 0; + r->out.ctr.ctr2->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 3: { + r->out.ctr.ctr3 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr3); + WERR_TALLOC_CHECK(r->out.ctr.ctr3); + + r->out.ctr.ctr3->count = 0; + r->out.ctr.ctr3->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetFileGetInfo +*/ +static NTSTATUS srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetFileGetInfo *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 2: { + r->out.info.info2 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 3: { + r->out.info.info3 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetFileClose +*/ +static NTSTATUS srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetFileClose *r) +{ + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NetSessEnum +*/ +static NTSTATUS srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetSessEnum *r) +{ + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = 0; + r->out.ctr.ctr0->array = talloc(mem_ctx, r->out.ctr.ctr0->count*sizeof(struct srvsvc_NetSessInfo0)); + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 1: { + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = 0; + r->out.ctr.ctr1->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 2: { + r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr2); + WERR_TALLOC_CHECK(r->out.ctr.ctr2); + + r->out.ctr.ctr2->count = 0; + r->out.ctr.ctr2->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 10:{ + r->out.ctr.ctr10 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr10); + WERR_TALLOC_CHECK(r->out.ctr.ctr10); + + r->out.ctr.ctr2->count = 0; + r->out.ctr.ctr2->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 502:{ + r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr502); + WERR_TALLOC_CHECK(r->out.ctr.ctr502); + + r->out.ctr.ctr2->count = 0; + r->out.ctr.ctr2->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetSessDel +*/ +static NTSTATUS srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetSessDel *r) +{ + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NetShareAdd +*/ +static NTSTATUS srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareAdd *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + case 1: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + case 2: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + case 501: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + case 502: + if (r->in.parm_error) { + r->out.parm_error = r->in.parm_error; + } + r->out.result = WERR_NOT_SUPPORTED; + break; + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetShareEnumAll +*/ +static NTSTATUS srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareEnumAll *r) +{ + struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx; + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + int i; + + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr0->array = NULL; + + if (r->out.ctr.ctr0->count == 0) break; + + r->out.ctr.ctr0->array = talloc(mem_ctx, r->out.ctr.ctr0->count*sizeof(struct srvsvc_NetShareInfo0)); + WERR_TALLOC_CHECK(r->out.ctr.ctr0->array); + + for (i=0;iout.ctr.ctr0->count;i++) { + r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name); + } + + r->out.totalentries = r->out.ctr.ctr0->count; + + break; + } + case 1: { + int i; + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr1->array = NULL; + + if (r->out.ctr.ctr1->count == 0) break; + + r->out.ctr.ctr1->array = talloc(mem_ctx, r->out.ctr.ctr1->count*sizeof(struct srvsvc_NetShareInfo1)); + WERR_TALLOC_CHECK(r->out.ctr.ctr1->array); + + for (i=0;iout.ctr.ctr1->count;i++) { + r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr1->count; + + break; + } + case 2: { + int i; + r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2); + WERR_TALLOC_CHECK(r->out.ctr.ctr2); + + r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr2->array = NULL; + + if (r->out.ctr.ctr2->count == 0) break; + + r->out.ctr.ctr2->array = talloc(mem_ctx, r->out.ctr.ctr2->count*sizeof(struct srvsvc_NetShareInfo2)); + WERR_TALLOC_CHECK(r->out.ctr.ctr2->array); + + for (i=0;iout.ctr.ctr2->count;i++) { + r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr2->count; + + break; + } + case 501:{ + int i; + r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501); + WERR_TALLOC_CHECK(r->out.ctr.ctr501); + + r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr501->array = NULL; + + if (r->out.ctr.ctr501->count == 0) break; + + r->out.ctr.ctr501->array = talloc(mem_ctx, r->out.ctr.ctr501->count*sizeof(struct srvsvc_NetShareInfo501)); + WERR_TALLOC_CHECK(r->out.ctr.ctr501->array); + + for (i=0;iout.ctr.ctr501->count;i++) { + r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr501->count; + + break; + } + case 502:{ + int i; + r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502); + WERR_TALLOC_CHECK(r->out.ctr.ctr502); + + r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr502->array = NULL; + + if (r->out.ctr.ctr502->count == 0) break; + + r->out.ctr.ctr502->array = talloc(mem_ctx, r->out.ctr.ctr502->count*sizeof(struct srvsvc_NetShareInfo502)); + WERR_TALLOC_CHECK(r->out.ctr.ctr502->array); + + for (i=0;iout.ctr.ctr502->count;i++) { + r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr502->count; + + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetShareGetInfo +*/ +static NTSTATUS srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareGetInfo *r) +{ + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 1: { + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 2: { + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 501:{ + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 502:{ + r->out.info.info0 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NetShareSetInfo +*/ +static NTSTATUS srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareSetInfo *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetShareDel +*/ +static NTSTATUS srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareDel *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetShareDelSticky +*/ +static NTSTATUS srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareDelSticky *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetShareCheck +*/ +static NTSTATUS srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareCheck *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetSrvGetInfo +*/ +static NTSTATUS srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetSrvGetInfo *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetSrvSetInfo +*/ +static NTSTATUS srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetSrvSetInfo *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetDiskEnum +*/ +static NTSTATUS srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetDiskEnum *r) +{ + r->out.count = 0; + r->out.ctr0 = NULL; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + r->out.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetDiskCtr0); + WERR_TALLOC_CHECK(r->out.ctr0); + + r->out.ctr0->unknown = 0x1; + r->out.ctr0->count = 0; + r->out.ctr0->array = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NETRSERVERSTATISTICSGET +*/ +static NTSTATUS srvsvc_NETRSERVERSTATISTICSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERSTATISTICSGET *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSERVERTRANSPORTADD +*/ +static NTSTATUS srvsvc_NETRSERVERTRANSPORTADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERTRANSPORTADD *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetTransportEnum +*/ +static NTSTATUS srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetTransportEnum *r) +{ + ZERO_STRUCT(r->out); + r->out.result = WERR_NOT_SUPPORTED; + return NT_STATUS_OK; +} + + +/* + srvsvc_NETRSERVERTRANSPORTDEL +*/ +static NTSTATUS srvsvc_NETRSERVERTRANSPORTDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERTRANSPORTDEL *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NET_REMOTE_TOD +*/ +static NTSTATUS srvsvc_NET_REMOTE_TOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NET_REMOTE_TOD *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSERVERSETSERVICEBITS +*/ +static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERSETSERVICEBITS *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRPRPATHTYPE +*/ +static NTSTATUS srvsvc_NETRPRPATHTYPE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRPRPATHTYPE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRPRPATHCANONICALIZE +*/ +static NTSTATUS srvsvc_NETRPRPATHCANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRPRPATHCANONICALIZE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRPRPATHCOMPARE +*/ +static NTSTATUS srvsvc_NETRPRPATHCOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRPRPATHCOMPARE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NET_NAME_VALIDATE +*/ +static NTSTATUS srvsvc_NET_NAME_VALIDATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NET_NAME_VALIDATE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRPRNAMECANONICALIZE +*/ +static NTSTATUS srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRPRNAMECANONICALIZE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRPRNAMECOMPARE +*/ +static NTSTATUS srvsvc_NETRPRNAMECOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRPRNAMECOMPARE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NetShareEnum +*/ +static NTSTATUS srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NetShareEnum *r) +{ + struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx; + r->out.level = r->in.level; + r->out.totalentries = 0; + r->out.resume_handle = NULL; + r->out.result = WERR_OK; + + switch (r->in.level) { + case 0: { + int i; + + r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0); + WERR_TALLOC_CHECK(r->out.ctr.ctr0); + + r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr0->array = NULL; + + if (r->out.ctr.ctr0->count == 0) break; + + r->out.ctr.ctr0->array = talloc(mem_ctx, r->out.ctr.ctr0->count*sizeof(struct srvsvc_NetShareInfo0)); + WERR_TALLOC_CHECK(r->out.ctr.ctr0->array); + + for (i=0;iout.ctr.ctr0->count;i++) { + r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name); + } + + r->out.totalentries = r->out.ctr.ctr0->count; + + break; + } + case 1: { + int i; + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1); + WERR_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr1->array = NULL; + + if (r->out.ctr.ctr1->count == 0) break; + + r->out.ctr.ctr1->array = talloc(mem_ctx, r->out.ctr.ctr1->count*sizeof(struct srvsvc_NetShareInfo1)); + WERR_TALLOC_CHECK(r->out.ctr.ctr1->array); + + for (i=0;iout.ctr.ctr1->count;i++) { + r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr1->count; + + break; + } + case 2: { + int i; + r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2); + WERR_TALLOC_CHECK(r->out.ctr.ctr2); + + r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr2->array = NULL; + + if (r->out.ctr.ctr2->count == 0) break; + + r->out.ctr.ctr2->array = talloc(mem_ctx, r->out.ctr.ctr2->count*sizeof(struct srvsvc_NetShareInfo2)); + WERR_TALLOC_CHECK(r->out.ctr.ctr2->array); + + for (i=0;iout.ctr.ctr2->count;i++) { + r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i); + r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr2->count; + + break; + } + case 501:{ + int i; + r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501); + WERR_TALLOC_CHECK(r->out.ctr.ctr501); + + r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr501->array = NULL; + + if (r->out.ctr.ctr501->count == 0) break; + + r->out.ctr.ctr501->array = talloc(mem_ctx, r->out.ctr.ctr501->count*sizeof(struct srvsvc_NetShareInfo501)); + WERR_TALLOC_CHECK(r->out.ctr.ctr501->array); + + for (i=0;iout.ctr.ctr501->count;i++) { + r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr501->count; + + break; + } + case 502:{ + int i; + r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502); + WERR_TALLOC_CHECK(r->out.ctr.ctr502); + + r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx); + r->out.ctr.ctr502->array = NULL; + + if (r->out.ctr.ctr502->count == 0) break; + + r->out.ctr.ctr502->array = talloc(mem_ctx, r->out.ctr.ctr502->count*sizeof(struct srvsvc_NetShareInfo502)); + WERR_TALLOC_CHECK(r->out.ctr.ctr502->array); + + for (i=0;iout.ctr.ctr502->count;i++) { + r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i); + r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i); + } + + r->out.totalentries = r->out.ctr.ctr502->count; + + break; + } + default: + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + + return NT_STATUS_OK; +} + + +/* + srvsvc_NETRSHAREDELSTART +*/ +static NTSTATUS srvsvc_NETRSHAREDELSTART(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSHAREDELSTART *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSHAREDELCOMMIT +*/ +static NTSTATUS srvsvc_NETRSHAREDELCOMMIT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSHAREDELCOMMIT *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NET_FILE_QUERY_SECDESC +*/ +static NTSTATUS srvsvc_NET_FILE_QUERY_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NET_FILE_QUERY_SECDESC *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NET_FILE_SET_SECDESC +*/ +static NTSTATUS srvsvc_NET_FILE_SET_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NET_FILE_SET_SECDESC *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSERVERTRANSPORTADDEX +*/ +static NTSTATUS srvsvc_NETRSERVERTRANSPORTADDEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERTRANSPORTADDEX *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSERVERSETSERVICEBITSEX +*/ +static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITSEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERSETSERVICEBITSEX *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSGETVERSION +*/ +static NTSTATUS srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSGETVERSION *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSCREATELOCALPARTITION +*/ +static NTSTATUS srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSCREATELOCALPARTITION *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSDELETELOCALPARTITION +*/ +static NTSTATUS srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSDELETELOCALPARTITION *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSSETLOCALVOLUMESTATE +*/ +static NTSTATUS srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSSETSERVERINFO +*/ +static NTSTATUS srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSSETSERVERINFO *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSCREATEEXITPOINT +*/ +static NTSTATUS srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSCREATEEXITPOINT *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSDELETEEXITPOINT +*/ +static NTSTATUS srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSDELETEEXITPOINT *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSMODIFYPREFIX +*/ +static NTSTATUS srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSMODIFYPREFIX *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSFIXLOCALVOLUME +*/ +static NTSTATUS srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSFIXLOCALVOLUME *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRDFSMANAGERREPORTSITEINFO +*/ +static NTSTATUS srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + srvsvc_NETRSERVERTRANSPORTDELEX +*/ +static NTSTATUS srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct srvsvc_NETRSERVERTRANSPORTDELEX *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* include the generated boilerplate */ +#include "librpc/gen_ndr/ndr_srvsvc_s.c" diff --git a/source4/rpc_server/winreg/rpc_winreg.c b/source4/rpc_server/winreg/rpc_winreg.c index c50512d48e..c1d6d6ad69 100644 --- a/source4/rpc_server/winreg/rpc_winreg.c +++ b/source4/rpc_server/winreg/rpc_winreg.c @@ -33,14 +33,14 @@ struct _privatedata { static void winreg_unbind(struct dcesrv_connection *dc, const struct dcesrv_interface *di) { struct _privatedata *data = dc->private; - reg_free(data->registry); + if (data) reg_free(data->registry); } static NTSTATUS winreg_bind(struct dcesrv_call_state *dc, const struct dcesrv_interface *di) { struct _privatedata *data; data = talloc(dc->mem_ctx, sizeof(struct _privatedata)); - data->registry = reg_open("nt4", "/home/aurelia/jelmer/NTUSER.DAT", False); + data->registry = reg_open(lp_parm_string(-1,"winreg","subsystem"),lp_parm_string(-1,"winreg", "file"), False); if(!data->registry) return NT_STATUS_UNSUCCESSFUL; dc->conn->private = data; return NT_STATUS_OK; diff --git a/source4/rpc_server/wkssvc/dcesrv_wkssvc.c b/source4/rpc_server/wkssvc/dcesrv_wkssvc.c new file mode 100644 index 0000000000..f114dda1c0 --- /dev/null +++ b/source4/rpc_server/wkssvc/dcesrv_wkssvc.c @@ -0,0 +1,378 @@ +/* + Unix SMB/CIFS implementation. + + endpoint server for the wkssvc pipe + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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" +#include "rpc_server/common/common.h" + +/* + wkssvc_NetWkstaGetInfo +*/ +static NTSTATUS wkssvc_NetWkstaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct wkssvc_NetWkstaGetInfo *r) +{ + struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx; + r->out.result = WERR_OK; + + /* NOTE: win2k3 ignores r->in.server_name completly so we do --metze */ + + switch(r->in.level) { + case 100: { + r->out.info.info100 = talloc_p(mem_ctx, struct wkssvc_NetWkstaInfo100); + WERR_TALLOC_CHECK(r->out.info.info100); + + r->out.info.info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx); + r->out.info.info100->server = dcesrv_common_get_server_name(mem_ctx, dce_ctx); + r->out.info.info100->domain = dcesrv_common_get_domain_name(mem_ctx, dce_ctx); + r->out.info.info100->ver_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx); + r->out.info.info100->ver_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx); + break; + } + case 101: { + r->out.info.info101 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 102: { + r->out.info.info102 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + case 502: { + r->out.info.info502 = NULL; + + r->out.result = WERR_NOT_SUPPORTED; + break; + } + default: { + r->out.result = WERR_UNKNOWN_LEVEL; + break; + } + } + + return NT_STATUS_OK; +} + + +/* + wkssvc_NetWkstaSetInfo +*/ +static NTSTATUS wkssvc_NetWkstaSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct wkssvc_NetWkstaSetInfo *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWKSTAUSERENUM +*/ +static NTSTATUS WKSSVC_NETRWKSTAUSERENUM(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWKSTAUSERENUM *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWKSTAUSERGETINFO +*/ +static NTSTATUS WKSSVC_NETRWKSTAUSERGETINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWKSTAUSERGETINFO *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWKSTAUSERSETINFO +*/ +static NTSTATUS WKSSVC_NETRWKSTAUSERSETINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWKSTAUSERSETINFO *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + wkssvc_NetWkstaTransportEnum +*/ +static NTSTATUS wkssvc_NetWkstaTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct wkssvc_NetWkstaTransportEnum *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWKSTATRANSPORTADD +*/ +static NTSTATUS WKSSVC_NETRWKSTATRANSPORTADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWKSTATRANSPORTADD *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWKSTATRANSPORTDEL +*/ +static NTSTATUS WKSSVC_NETRWKSTATRANSPORTDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWKSTATRANSPORTDEL *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUSEADD +*/ +static NTSTATUS WKSSVC_NETRUSEADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUSEADD *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUSEGETINFO +*/ +static NTSTATUS WKSSVC_NETRUSEGETINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUSEGETINFO *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUSEDEL +*/ +static NTSTATUS WKSSVC_NETRUSEDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUSEDEL *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUSEENUM +*/ +static NTSTATUS WKSSVC_NETRUSEENUM(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUSEENUM *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRMESSAGEBUFFERSEND +*/ +static NTSTATUS WKSSVC_NETRMESSAGEBUFFERSEND(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRMESSAGEBUFFERSEND *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRWORKSTATIONSTATISTICSGET +*/ +static NTSTATUS WKSSVC_NETRWORKSTATIONSTATISTICSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRWORKSTATIONSTATISTICSGET *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRLOGONDOMAINNAMEADD +*/ +static NTSTATUS WKSSVC_NETRLOGONDOMAINNAMEADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRLOGONDOMAINNAMEADD *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRLOGONDOMAINNAMEDEL +*/ +static NTSTATUS WKSSVC_NETRLOGONDOMAINNAMEDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRLOGONDOMAINNAMEDEL *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRJOINDOMAIN +*/ +static NTSTATUS WKSSVC_NETRJOINDOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRJOINDOMAIN *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUNJOINDOMAIN +*/ +static NTSTATUS WKSSVC_NETRUNJOINDOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUNJOINDOMAIN *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRRENAMEMACHINEINDOMAIN +*/ +static NTSTATUS WKSSVC_NETRRENAMEMACHINEINDOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRRENAMEMACHINEINDOMAIN *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRVALIDATENAME +*/ +static NTSTATUS WKSSVC_NETRVALIDATENAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRVALIDATENAME *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRGETJOININFORMATION +*/ +static NTSTATUS WKSSVC_NETRGETJOININFORMATION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRGETJOININFORMATION *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRGETJOINABLEOUS +*/ +static NTSTATUS WKSSVC_NETRGETJOINABLEOUS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRGETJOINABLEOUS *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRJOINDOMAIN2 +*/ +static NTSTATUS WKSSVC_NETRJOINDOMAIN2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRJOINDOMAIN2 *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRUNJOINDOMAIN2 +*/ +static NTSTATUS WKSSVC_NETRUNJOINDOMAIN2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRUNJOINDOMAIN2 *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRRENAMEMACHINEINDOMAIN2 +*/ +static NTSTATUS WKSSVC_NETRRENAMEMACHINEINDOMAIN2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRRENAMEMACHINEINDOMAIN2 *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRVALIDATENAME2 +*/ +static NTSTATUS WKSSVC_NETRVALIDATENAME2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRVALIDATENAME2 *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRGETJOINABLEOUS2 +*/ +static NTSTATUS WKSSVC_NETRGETJOINABLEOUS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRGETJOINABLEOUS2 *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRADDALTERNATECOMPUTERNAME +*/ +static NTSTATUS WKSSVC_NETRADDALTERNATECOMPUTERNAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRADDALTERNATECOMPUTERNAME *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRREMOVEALTERNATECOMPUTERNAME +*/ +static NTSTATUS WKSSVC_NETRREMOVEALTERNATECOMPUTERNAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRREMOVEALTERNATECOMPUTERNAME *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRSETPRIMARYCOMPUTERNAME +*/ +static NTSTATUS WKSSVC_NETRSETPRIMARYCOMPUTERNAME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRSETPRIMARYCOMPUTERNAME *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* + WKSSVC_NETRENUMERATECOMPUTERNAMES +*/ +static NTSTATUS WKSSVC_NETRENUMERATECOMPUTERNAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct WKSSVC_NETRENUMERATECOMPUTERNAMES *r) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + + +/* include the generated boilerplate */ +#include "librpc/gen_ndr/ndr_wkssvc_s.c" -- cgit