summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2011-05-31 13:18:37 +1000
committerAndrew Tridgell <tridge@samba.org>2011-06-21 15:54:51 +1000
commitb373d0e777df8770c24cfcc5cc80bf4808faa815 (patch)
treeaeb149d1bc9290a7ddfe0b9aba4cb1fe5314a59b /source3/lib
parente00b1fa2b032012e741d94f3fe0057d6ea53bf4c (diff)
downloadsamba-b373d0e777df8770c24cfcc5cc80bf4808faa815.tar.gz
samba-b373d0e777df8770c24cfcc5cc80bf4808faa815.tar.bz2
samba-b373d0e777df8770c24cfcc5cc80bf4808faa815.zip
s3-build: Provide a run-time shim to work around duplicate symbols
The become_root() and similar 'smbd' functions that are used widely in Samba libraries had 'dummy' copies in dummysmbd.c and dummyroot.c. These have been replaced by a runtime plugin mechanim, which ensures that standlone binaries still do nothing, while in smbd the correct function is used. This avoids having these as duplicate symbols in the smbd binary, which can cause unpredictable behaviour. Andrew Bartlett Signed-off-by: Andrew Tridgell <tridge@samba.org>
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/dummyroot.c34
-rw-r--r--source3/lib/smbd_shim.c (renamed from source3/lib/dummysmbd.c)47
-rw-r--r--source3/lib/smbd_shim.h51
3 files changed, 97 insertions, 35 deletions
diff --git a/source3/lib/dummyroot.c b/source3/lib/dummyroot.c
deleted file mode 100644
index 64ea75814a..0000000000
--- a/source3/lib/dummyroot.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- RPC pipe client
-
- Copyright (C) Tim Potter 2003
-
- 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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-/* Stupid dummy functions required due to the horrible dependency mess
- in Samba. */
-
-#include "includes.h"
-
-void become_root(void)
-{
- return;
-}
-
-void unbecome_root(void)
-{
- return;
-}
diff --git a/source3/lib/dummysmbd.c b/source3/lib/smbd_shim.c
index 541b59e0cc..72ae366ec3 100644
--- a/source3/lib/dummysmbd.c
+++ b/source3/lib/smbd_shim.c
@@ -3,6 +3,7 @@
RPC pipe client
Copyright (C) Gerald (Jerry) Carter 2004.
+ Copyright (C) Andrew Bartlett 2011.
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
@@ -18,30 +19,52 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Stupid dummy functions required due to the horrible dependency mess
+/* Shim functions required due to the horrible dependency mess
in Samba. */
#include "includes.h"
+#include "smbd_shim.h"
+#include "smbd/proto.h"
+
+static struct smbd_shim shim;
+
+void set_smbd_shim(const struct smbd_shim *shim_functions)
+{
+ shim = *shim_functions;
+}
void cancel_pending_lock_requests_by_fid(files_struct *fsp,
struct byte_range_lock *br_lck,
enum file_close_type close_type)
{
+ if (shim.cancel_pending_lock_requests_by_fid) {
+
+ shim.cancel_pending_lock_requests_by_fid(fsp, br_lck, close_type);
+ }
}
void send_stat_cache_delete_message(struct messaging_context *msg_ctx,
const char *name)
{
+ if (shim.send_stat_cache_delete_message) {
+ shim.send_stat_cache_delete_message(msg_ctx, name);
+ }
}
NTSTATUS can_delete_directory(struct connection_struct *conn,
const char *dirname)
{
+ if (shim.can_delete_directory) {
+ return shim.can_delete_directory(conn, dirname);
+ }
return NT_STATUS_OK;
}
bool change_to_root_user(void)
{
+ if (shim.change_to_root_user) {
+ return shim.change_to_root_user();
+ }
return false;
}
@@ -55,11 +78,33 @@ bool change_to_root_user(void)
void contend_level2_oplocks_begin(files_struct *fsp,
enum level2_contention_type type)
{
+ if (shim.contend_level2_oplocks_begin) {
+ shim.contend_level2_oplocks_begin(fsp, type);
+ }
return;
}
void contend_level2_oplocks_end(files_struct *fsp,
enum level2_contention_type type)
{
+ if (shim.contend_level2_oplocks_end) {
+ shim.contend_level2_oplocks_end(fsp, type);
+ }
+ return;
+}
+
+void become_root(void)
+{
+ if (shim.become_root) {
+ shim.become_root();
+ }
+ return;
+}
+
+void unbecome_root(void)
+{
+ if (shim.unbecome_root) {
+ shim.unbecome_root();
+ }
return;
}
diff --git a/source3/lib/smbd_shim.h b/source3/lib/smbd_shim.h
new file mode 100644
index 0000000000..415f81bf36
--- /dev/null
+++ b/source3/lib/smbd_shim.h
@@ -0,0 +1,51 @@
+/*
+ Unix SMB/CIFS implementation.
+ RPC pipe client
+
+ Copyright (C) Gerald (Jerry) Carter 2004.
+ Copyright (C) Andrew Bartlett 2011.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Shim functions required due to the horrible dependency mess
+ in Samba. */
+
+struct smbd_shim
+{
+ void (*cancel_pending_lock_requests_by_fid)(files_struct *fsp,
+ struct byte_range_lock *br_lck,
+ enum file_close_type close_type);
+ void (*send_stat_cache_delete_message)(struct messaging_context *msg_ctx,
+ const char *name);
+
+ NTSTATUS (*can_delete_directory)(struct connection_struct *conn,
+ const char *dirname);
+
+ bool (*change_to_root_user)(void);
+
+ void (*contend_level2_oplocks_begin)(files_struct *fsp,
+ enum level2_contention_type type);
+
+ void (*contend_level2_oplocks_end)(files_struct *fsp,
+ enum level2_contention_type type);
+
+ void (*become_root)(void);
+
+ void (*unbecome_root)(void);
+};
+
+void set_smbd_shim(const struct smbd_shim *shim_functions);
+
+