diff options
-rw-r--r-- | source4/libnet/libnet_share.c | 160 | ||||
-rw-r--r-- | source4/libnet/libnet_share.h | 72 |
2 files changed, 232 insertions, 0 deletions
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 <gleocadie@idealx.com> + + 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 <gleocadie@idealx.com> + + 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; +}; |