Author: mimir Date: 2005-05-24 22:47:01 +0000 (Tue, 24 May 2005) New Revision: 6962
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6962 Log: 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 <[EMAIL PROTECTED]> My apologies if I have written your name incorrectly. rafal Added: branches/SAMBA_4_0/source/libnet/libnet_share.c branches/SAMBA_4_0/source/libnet/libnet_share.h Changeset: Added: branches/SAMBA_4_0/source/libnet/libnet_share.c =================================================================== --- branches/SAMBA_4_0/source/libnet/libnet_share.c 2005-05-24 21:59:01 UTC (rev 6961) +++ branches/SAMBA_4_0/source/libnet/libnet_share.c 2005-05-24 22:47:01 UTC (rev 6962) @@ -0,0 +1,160 @@ +/* + Unix SMB/CIFS implementation. + + Copyright (C) Grégory LEOCADIE <[EMAIL PROTECTED]> + + 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; +} Added: branches/SAMBA_4_0/source/libnet/libnet_share.h =================================================================== --- branches/SAMBA_4_0/source/libnet/libnet_share.h 2005-05-24 21:59:01 UTC (rev 6961) +++ branches/SAMBA_4_0/source/libnet/libnet_share.h 2005-05-24 22:47:01 UTC (rev 6962) @@ -0,0 +1,72 @@ +/* + Unix SMB/CIFS implementation. + + Copyright (C) Grégory LEOCADIE <[EMAIL PROTECTED]> + + 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; +};