summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/libsmbclient/testbrowse.c46
-rw-r--r--source3/include/libsmb_internal.h18
-rw-r--r--source3/libsmb/libsmbclient.c30
3 files changed, 75 insertions, 19 deletions
diff --git a/examples/libsmbclient/testbrowse.c b/examples/libsmbclient/testbrowse.c
index 6fa70eab41..eba6fff4eb 100644
--- a/examples/libsmbclient/testbrowse.c
+++ b/examples/libsmbclient/testbrowse.c
@@ -29,6 +29,7 @@ int
main(int argc, char * argv[])
{
int debug = 0;
+ int debug_stderr = 0;
int scan = 0;
int iterations = -1;
int again;
@@ -37,6 +38,7 @@ main(int argc, char * argv[])
char * q;
char buf[1024];
poptContext pc;
+ SMBCCTX * context;
struct poptOption long_options[] =
{
POPT_AUTOHELP
@@ -45,6 +47,10 @@ main(int argc, char * argv[])
0, "Set debug level", "integer"
},
{
+ "stderr", 'e', POPT_ARG_NONE, &debug_stderr,
+ 0, "Debug log to stderr instead of stdout", "integer"
+ },
+ {
"scan", 's', POPT_ARG_NONE, &scan,
0, "Scan for servers and shares", "integer"
},
@@ -69,14 +75,36 @@ main(int argc, char * argv[])
}
}
+ /* Allocate a new context */
+ context = smbc_new_context();
+ if (!context) {
+ printf("Could not allocate new smbc context\n");
+ return 1;
+ }
+
+ /* Set mandatory options (is that a contradiction in terms?) */
+ context->debug = debug;
+ context->callbacks.auth_fn = (scan ? no_auth_data_fn : get_auth_data_fn);
+
+ /* If we've been asked to log to stderr instead of stdout... */
+ if (debug_stderr) {
+ /* ... then set the option to do so */
+ smbc_option_set(context, "debug_stderr", NULL);
+ }
+
+ /* Initialize the context using the previously specified options */
+ if (!smbc_init_context(context)) {
+ smbc_free_context(context, 0);
+ printf("Could not initialize smbc context\n");
+ return 1;
+ }
+
+ /* Tell the compatibility layer to use this context */
+ smbc_set_context(context);
+
+
if (scan)
{
- if (smbc_init(no_auth_data_fn, debug) != 0)
- {
- printf("Could not initialize smbc_ library\n");
- return 1;
- }
-
for (;
iterations == -1 || iterations > 0;
iterations = (iterations == -1 ? iterations : --iterations))
@@ -87,12 +115,6 @@ main(int argc, char * argv[])
}
else
{
- if (smbc_init(get_auth_data_fn, debug) != 0)
- {
- printf("Could not initialize smbc_ library\n");
- return 1;
- }
-
for (;
iterations == -1 || iterations > 0;
iterations = (iterations == -1 ? iterations : --iterations))
diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h
index 081bb415e5..0426430328 100644
--- a/source3/include/libsmb_internal.h
+++ b/source3/include/libsmb_internal.h
@@ -47,11 +47,12 @@ struct _SMBCFILE {
struct smbc_internal_data {
- /** INTERNAL: is this handle initialized ?
+ /*
+ * Is this handle initialized ?
*/
- int _initialized;
+ BOOL _initialized;
- /** INTERNAL: dirent pointer location
+ /* dirent pointer location
*
* Leave room for any urlencoded filename and the comment field.
*
@@ -64,13 +65,20 @@ struct smbc_internal_data {
*/
char _dirent[1024];
- /** INTERNAL: server connection list
+ /*
+ * server connection list
*/
SMBCSRV * _servers;
- /** INTERNAL: open file/dir list
+ /*
+ * open file/dir list
*/
SMBCFILE * _files;
+
+ /*
+ * Log to standard error instead of the more typical standard output
+ */
+ BOOL _debug_stderr;
};
diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c
index 8cfef769e5..6eca3946d8 100644
--- a/source3/libsmb/libsmbclient.c
+++ b/source3/libsmb/libsmbclient.c
@@ -5938,6 +5938,27 @@ smbc_free_context(SMBCCTX *context,
/*
+ * Each time the context structure is changed, we have binary backward
+ * compatibility issues. Instead of modifying the public portions of the
+ * context structure to add new options, instead, we put them in the internal
+ * portion of the context structure and provide a set function for these new
+ * options.
+ */
+void
+smbc_option_set(SMBCCTX *context,
+ char *option_name,
+ void *option_value)
+{
+ if (strcmp(option_name, "debug_stderr") == 0) {
+ /*
+ * Log to standard error instead of standard output.
+ */
+ context->internal->_debug_stderr = True;
+ }
+}
+
+
+/*
* Initialise the library etc
*
* We accept a struct containing handle information.
@@ -5982,7 +6003,12 @@ smbc_init_context(SMBCCTX *context)
DEBUGLEVEL = context->debug;
load_case_tables();
- setup_logging( "libsmbclient", True);
+
+ setup_logging("libsmbclient", True);
+ if (context->internal->_debug_stderr) {
+ dbf = x_stderr;
+ x_setbuf(x_stderr, NULL);
+ }
/* Here we would open the smb.conf file if needed ... */
@@ -6099,7 +6125,7 @@ smbc_init_context(SMBCCTX *context)
* FIXME: Should we check the function pointers here?
*/
- context->internal->_initialized = 1;
+ context->internal->_initialized = True;
return context;
}