r6962: Severely simplified share functions. Removed call levels as we don't
authorRafal Szczesniak <mimir@samba.org>
Tue, 24 May 2005 22:47:01 +0000 (22:47 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:17:00 +0000 (13:17 -0500)
seem to need them at the moment. Functions completely untested so assumed
broken.

Original patch submitted by Gregory Leocadie <gleocadie@idealx.com>
My apologies if I have written your name incorrectly.

rafal
(This used to be commit 83460e01ee98267c1ae5f5cfca52ca8df4b30b0a)

source4/libnet/libnet_share.c [new file with mode: 0644]
source4/libnet/libnet_share.h [new file with mode: 0644]

diff --git a/source4/libnet/libnet_share.c b/source4/libnet/libnet_share.c
new file mode 100644 (file)
index 0000000..702cde6
--- /dev/null
@@ -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 (file)
index 0000000..efe5474
--- /dev/null
@@ -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;
+};