summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2010-11-21 20:40:50 +1100
committerAndrew Bartlett <abartlet@samba.org>2010-11-24 08:37:04 +0100
commit88d020ade07bfe5cd7570b8c9b80a162adb39891 (patch)
treec37d970b1061b74655d19725c754e15c71816a53
parent58920aab0237aaa9f4a81577800bddba97e279a5 (diff)
downloadsamba-88d020ade07bfe5cd7570b8c9b80a162adb39891.tar.gz
samba-88d020ade07bfe5cd7570b8c9b80a162adb39891.tar.bz2
samba-88d020ade07bfe5cd7570b8c9b80a162adb39891.zip
s3-netapi Add libnetapi_net_init(), don't double-init common Samba subsystems
The issue here is that libnet and net were both trying to load the smb.conf files, the case tables and set the debug levels. The set of the debug levels caused problems, because it would force the level to 0, not (say) 10 as requested on the command line. This regression was apparently introduced in cf4de8ec2c8df2ceabbe3d836d296b058e7b19fb when eliminating AllowDebugChange. Andrew Bartlett
-rw-r--r--source3/lib/netapi/netapi.c46
-rw-r--r--source3/lib/netapi/netapi_net.h24
-rw-r--r--source3/lib/netapi/netapi_private.h2
-rw-r--r--source3/utils/net_dom.c3
-rw-r--r--source3/utils/net_rpc.c11
-rw-r--r--source3/utils/net_rpc_shell.c3
6 files changed, 70 insertions, 19 deletions
diff --git a/source3/lib/netapi/netapi.c b/source3/lib/netapi/netapi.c
index 7b3ab321af..7eb0764849 100644
--- a/source3/lib/netapi/netapi.c
+++ b/source3/lib/netapi/netapi.c
@@ -49,14 +49,14 @@ static NET_API_STATUS libnetapi_init_private_context(struct libnetapi_ctx *ctx)
}
/****************************************************************
+Create a libnetapi context, for use in non-Samba applications. This
+loads the smb.conf file and sets the debug level to 0, so that
+applications are not flooded with debug logs at level 10, when they
+were not expecting it.
****************************************************************/
NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
{
- NET_API_STATUS status;
- struct libnetapi_ctx *ctx = NULL;
- char *krb5_cc_env = NULL;
-
if (stat_ctx && libnetapi_initialized) {
*context = stat_ctx;
return NET_API_STATUS_SUCCESS;
@@ -67,15 +67,10 @@ NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
#endif
frame = talloc_stackframe();
- ctx = talloc_zero(frame, struct libnetapi_ctx);
- if (!ctx) {
- TALLOC_FREE(frame);
- return W_ERROR_V(WERR_NOMEM);
- }
-
+ /* When libnetapi is invoked from an application, it does not
+ * want to be swamped with level 10 debug messages, even if
+ * this has been set for the server in smb.conf */
lp_set_cmdline("log level", "0");
-
- /* prevent setup_logging() from closing x_stderr... */
setup_logging("libnetapi", DEBUG_STDERR);
load_case_tables();
@@ -92,6 +87,33 @@ NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
BlockSignals(True, SIGPIPE);
+ return libnetapi_net_init(context);
+}
+
+/****************************************************************
+Create a libnetapi context, for use inside the 'net' binary.
+
+As we know net has already loaded the smb.conf file, and set the debug
+level etc, this avoids doing so again (which causes trouble with -d on
+the command line).
+****************************************************************/
+
+NET_API_STATUS libnetapi_net_init(struct libnetapi_ctx **context)
+{
+ NET_API_STATUS status;
+ struct libnetapi_ctx *ctx = NULL;
+ char *krb5_cc_env = NULL;
+
+ frame = talloc_stackframe();
+
+ ctx = talloc_zero(frame, struct libnetapi_ctx);
+ if (!ctx) {
+ TALLOC_FREE(frame);
+ return W_ERROR_V(WERR_NOMEM);
+ }
+
+ BlockSignals(True, SIGPIPE);
+
krb5_cc_env = getenv(KRB5_ENV_CCNAME);
if (!krb5_cc_env || (strlen(krb5_cc_env) == 0)) {
ctx->krb5_cc_env = talloc_strdup(frame, "MEMORY:libnetapi");
diff --git a/source3/lib/netapi/netapi_net.h b/source3/lib/netapi/netapi_net.h
new file mode 100644
index 0000000000..c1b06ade3b
--- /dev/null
+++ b/source3/lib/netapi/netapi_net.h
@@ -0,0 +1,24 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * NetApi Support
+ * Copyright (C) Andrew Bartlett 2010
+ *
+ * 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/>.
+ */
+
+/* This API header is private between the 'net' binary and and libnet */
+
+/* This function is to init the libnetapi subsystem, without
+ * re-reading config files or setting debug levels etc */
+NET_API_STATUS libnetapi_net_init(struct libnetapi_ctx **ctx);
diff --git a/source3/lib/netapi/netapi_private.h b/source3/lib/netapi/netapi_private.h
index 859c064223..fe8d72ec0f 100644
--- a/source3/lib/netapi/netapi_private.h
+++ b/source3/lib/netapi/netapi_private.h
@@ -20,6 +20,8 @@
#ifndef __LIB_NETAPI_PRIVATE_H__
#define __LIB_NETAPI_PRIVATE_H__
+#include "lib/netapi/netapi_net.h"
+
#define LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, fn) \
DEBUG(10,("redirecting call %s to localhost\n", #fn)); \
if (!r->in.server_name) { \
diff --git a/source3/utils/net_dom.c b/source3/utils/net_dom.c
index d07a1d4f04..d1eb9edba8 100644
--- a/source3/utils/net_dom.c
+++ b/source3/utils/net_dom.c
@@ -22,6 +22,7 @@
#include "../librpc/gen_ndr/cli_initshutdown.h"
#include "../librpc/gen_ndr/ndr_winreg.h"
#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_net.h"
int net_dom_usage(struct net_context *c, int argc, const char **argv)
{
@@ -372,7 +373,7 @@ int net_dom(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
index 1b0e469afc..228f7eb852 100644
--- a/source3/utils/net_rpc.c
+++ b/source3/utils/net_rpc.c
@@ -35,6 +35,7 @@
#include "../librpc/gen_ndr/cli_winreg.h"
#include "secrets.h"
#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_net.h"
#include "rpc_client/init_lsa.h"
#include "../libcli/security/security.h"
@@ -1050,7 +1051,7 @@ int net_rpc_user(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
@@ -2899,7 +2900,7 @@ int net_rpc_group(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
@@ -4745,7 +4746,7 @@ int net_rpc_share(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
@@ -5021,7 +5022,7 @@ int net_rpc_file(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
@@ -7428,7 +7429,7 @@ int net_rpc(struct net_context *c, int argc, const char **argv)
{NULL, NULL, 0, NULL, NULL}
};
- status = libnetapi_init(&c->netapi_ctx);
+ status = libnetapi_net_init(&c->netapi_ctx);
if (status != 0) {
return -1;
}
diff --git a/source3/utils/net_rpc_shell.c b/source3/utils/net_rpc_shell.c
index 82f9f29ced..c2384254ab 100644
--- a/source3/utils/net_rpc_shell.c
+++ b/source3/utils/net_rpc_shell.c
@@ -23,6 +23,7 @@
#include "utils/net.h"
#include "../librpc/gen_ndr/ndr_samr.h"
#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_net.h"
#include "../libcli/smbreadline/smbreadline.h"
static NTSTATUS rpc_sh_info(struct net_context *c,
@@ -222,7 +223,7 @@ int net_rpc_shell(struct net_context *c, int argc, const char **argv)
return -1;
}
- if (libnetapi_init(&c->netapi_ctx) != 0) {
+ if (libnetapi_net_init(&c->netapi_ctx) != 0) {
return -1;
}
libnetapi_set_username(c->netapi_ctx, c->opt_user_name);