1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-25 00:23:52 +03:00

r16550: Fix bug 3866. Thanks for the report!

Although I've never met a computer or compiler that produced pointers to
functions which are a different size than pointers to data, I suppose they
probably exist.  Assigning a pointer to a function is technically illegal in C
anyway.

Change casts of the option_value based on the option_name to use of variable
argument lists.

For binary compatibility, I've maintained but deprecated the old behavior of
debug_stderr (which expected to be passed a NULL or non-NULL pointer) and
added a new option debug_to_stderr which properly expects a boolean (int)
parameter.

Derrell
This commit is contained in:
Derrell Lipman
2006-06-27 02:30:58 +00:00
committed by Gerald (Jerry) Carter
parent 2b8d72f09c
commit c1b4c51053
3 changed files with 44 additions and 9 deletions

View File

@@ -236,7 +236,7 @@ smbc_urlencode(char * dest, char * src, int max_dest_len)
*
*
* We accept:
* smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]][?options]
* smb://[[[domain;]user[:password]@]server[/share[/path[/file]]]][?options]
*
* Meaning of URLs:
*
@@ -6003,27 +6003,62 @@ smbc_free_context(SMBCCTX *context,
void
smbc_option_set(SMBCCTX *context,
char *option_name,
void *option_value)
... /* option_value */)
{
if (strcmp(option_name, "debug_stderr") == 0) {
va_list ap;
union {
BOOL b;
smbc_get_auth_data_with_context_fn auth_fn;
void *v;
} option_value;
va_start(ap, option_name);
if (strcmp(option_name, "debug_to_stderr") == 0) {
/*
* Log to standard error instead of standard output.
*/
option_value.b = (BOOL) va_arg(ap, int);
context->internal->_debug_stderr = option_value.b;
} else if (strcmp(option_name, "debug_to_stderr") == 0) {
/*
* Log to standard error instead of standard output.
*
* This function used to take a third parameter,
* void *option_value. Since it was a void* and we needed to
* pass a boolean, a boolean value was cast to void* to be
* passed in. Now that we're using a va_list to retrieve the
* parameters, the casting kludge is unnecessary.
*
* WARNING: DO NOT USE THIS OPTION.
* This option is retained for backward compatibility. New
* applications should use "debug_to_stderr" and properly pass
* in a boolean (int) value.
*/
option_value.v = va_arg(ap, void *);
context->internal->_debug_stderr =
(option_value == NULL ? False : True);
(option_value.v == NULL ? False : True);
} else if (strcmp(option_name, "auth_function") == 0) {
/*
* Use the new-style authentication function which includes
* the context.
*/
context->internal->_auth_fn_with_context = option_value;
option_value.auth_fn =
va_arg(ap, smbc_get_auth_data_with_context_fn);
context->internal->_auth_fn_with_context =
option_value.auth_fn;
} else if (strcmp(option_name, "user_data") == 0) {
/*
* Save a user data handle which may be retrieved by the user
* with smbc_option_get()
*/
context->internal->_user_data = option_value;
option_value.v = va_arg(ap, void *);
context->internal->_user_data = option_value.v;
}
va_end(ap);
}