From 65ff3d265cba715e2d1bab0191c00d603d8ed739 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Tue, 24 May 2005 22:47:01 +0000 Subject: r6962: Severely simplified share functions. Removed call levels as we don't seem to need them at the moment. Functions completely untested so assumed broken. Original patch submitted by Gregory Leocadie My apologies if I have written your name incorrectly. rafal (This used to be commit 83460e01ee98267c1ae5f5cfca52ca8df4b30b0a) --- source4/libnet/libnet_share.c | 160 ++++++++++++++++++++++++++++++++++++++++++ source4/libnet/libnet_share.h | 72 +++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 source4/libnet/libnet_share.c create mode 100644 source4/libnet/libnet_share.h (limited to 'source4/libnet') diff --git a/source4/libnet/libnet_share.c b/source4/libnet/libnet_share.c new file mode 100644 index 0000000000..702cde6c77 --- /dev/null +++ b/source4/libnet/libnet_share.c @@ -0,0 +1,160 @@ +/* + Unix SMB/CIFS implementation. + + Copyright (C) Grégory LEOCADIE + + 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 "libnet/libnet.h" +#include "librpc/gen_ndr/ndr_srvsvc.h" + + +NTSTATUS libnet_ListShares(struct libnet_context *ctx, + TALLOC_CTX *mem_ctx, struct libnet_ListShares *r) +{ + NTSTATUS status; + union libnet_rpc_connect c; + struct srvsvc_NetShareEnumAll s; + uint32_t resume_handle; + struct srvsvc_NetShareCtr0 ctr0; + + c.standard.level = LIBNET_RPC_CONNECT_STANDARD; + c.standard.in.server_name = r->in.server_name; + c.standard.in.dcerpc_iface_name = DCERPC_SRVSVC_NAME; + c.standard.in.dcerpc_iface_uuid = DCERPC_SRVSVC_UUID; + c.standard.in.dcerpc_iface_version = DCERPC_SRVSVC_VERSION; + + status = libnet_rpc_connect(ctx, mem_ctx, &c); + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "Connection to SRVSVC pipe of server %s " + "failed: %s\n", + r->in.server_name, + nt_errstr(status)); + return status; + } + + s.in.level = r->in.level; + s.in.ctr.ctr0 = &ctr0; + s.in.max_buffer = ~0; + s.in.resume_handle = &resume_handle; + + ZERO_STRUCT(ctr0); + + status = dcerpc_srvsvc_NetShareEnumAll(c.standard.out.dcerpc_pipe, mem_ctx, &s); + + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "srvsvc_NetShareEnumAll on server '%s' failed" + ": %s\n", + r->in.server_name, nt_errstr(status)); + goto disconnect; + } + + if (!W_ERROR_IS_OK(s.out.result) && !W_ERROR_EQUAL(s.out.result, WERR_MORE_DATA)) { + goto disconnect; + } + + r->out.ctr = s.out.ctr; + +disconnect: + talloc_free(c.standard.out.dcerpc_pipe); + + return status; +} + + +NTSTATUS libnet_AddShare(struct libnet_context *ctx, + TALLOC_CTX *mem_ctx, struct libnet_AddShare *r) +{ + NTSTATUS status; + union libnet_rpc_connect c; + struct srvsvc_NetShareAdd s; + + c.standard.level = LIBNET_RPC_CONNECT_STANDARD; + c.standard.in.server_name = r->in.server_name; + c.standard.in.dcerpc_iface_name = DCERPC_SRVSVC_NAME; + c.standard.in.dcerpc_iface_uuid = DCERPC_SRVSVC_UUID; + c.standard.in.dcerpc_iface_version = DCERPC_SRVSVC_VERSION; + + status = libnet_rpc_connect(ctx, mem_ctx, &c); + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "Connection to SRVSVC pipe of server %s " + "failed: %s\n", + r->in.server_name, nt_errstr(status)); + return status; + } + + s.in.level = r->in.level; + s.in.info.info2 = &r->in.share; + s.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", r->in.server_name); + + status = dcerpc_srvsvc_NetShareAdd(c.standard.out.dcerpc_pipe, mem_ctx,&s); + + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "srvsvc_NetShareAdd on server '%s' failed" + ": %s\n", + r->in.server_name, nt_errstr(status)); + } + +disconnect: + talloc_free(c.standard.out.dcerpc_pipe); + + return status; +} + + +NTSTATUS libnet_DelShare(struct libnet_context *ctx, + TALLOC_CTX *mem_ctx, struct libnet_DelShare *r) +{ + NTSTATUS status; + union libnet_rpc_connect c; + struct srvsvc_NetShareDel s; + + c.standard.level = LIBNET_RPC_CONNECT_STANDARD; + c.standard.in.server_name = r->in.server_name; + c.standard.in.dcerpc_iface_name = DCERPC_SRVSVC_NAME; + c.standard.in.dcerpc_iface_uuid = DCERPC_SRVSVC_UUID; + c.standard.in.dcerpc_iface_version = DCERPC_SRVSVC_VERSION; + + status = libnet_rpc_connect(ctx, mem_ctx, &c); + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "Connection to SRVSVC pipe of server %s " + "failed: %s\n", + r->in.server_name, nt_errstr(status)); + return status; + } + + s.in.server_unc = talloc_asprintf(mem_ctx, "\\\\%s", r->in.server_name); + s.in.share_name = r->in.share_name; + + status = dcerpc_srvsvc_NetShareDel(c.standard.out.dcerpc_pipe, mem_ctx, &s); + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "srvsvc_NetShareDel on server '%s' failed" + ": %s\n", + r->in.server_name, nt_errstr(status)); + } + +disconnect: + talloc_free(c.standard.out.dcerpc_pipe); + + return status; +} diff --git a/source4/libnet/libnet_share.h b/source4/libnet/libnet_share.h new file mode 100644 index 0000000000..efe5474271 --- /dev/null +++ b/source4/libnet/libnet_share.h @@ -0,0 +1,72 @@ +/* + Unix SMB/CIFS implementation. + + Copyright (C) Grégory LEOCADIE + + 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 "librpc/gen_ndr/ndr_srvsvc.h" + +enum libnet_ListShares_level { + LIBNET_LIST_SHARES_GENERIC, + LIBNET_LIST_SHARES_SRVSVC +}; + +struct libnet_ListShares { + struct { + const char *server_name; + uint32_t *resume_handle; + uint32_t level; + } in; + struct { + const char *error_string; + union srvsvc_NetShareCtr ctr; + uint32_t *resume_handle; + } out; +}; + +enum libnet_AddShare_level { + LIBNET_ADD_SHARE_GENERIC, + LIBNET_ADD_SHARE_SRVSVC +}; + +struct libnet_AddShare { + enum libnet_AddShare_level level; + struct { + const char * server_name; + uint32_t level; + struct srvsvc_NetShareInfo2 share; + } in; + struct { + const char* error_string; + } out; +}; + +enum libnet_DelShare_level { + LIBNET_DEL_SHARE_GENERIC, + LIBNET_DEL_SHARE_SRVSVC +}; + +struct libnet_DelShare { + enum libnet_DelShare_level level; + struct { + const char *server_name; + const char *share_name; + } in; + struct { + const char *error_string; + } out; +}; -- cgit