Author: derrell Date: 2006-06-27 02:30:58 +0000 (Tue, 27 Jun 2006) New Revision: 16550
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16550 Log: 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 Modified: branches/SAMBA_3_0/examples/libsmbclient/testbrowse.c branches/SAMBA_3_0/source/include/libsmbclient.h branches/SAMBA_3_0/source/libsmb/libsmbclient.c Changeset: Modified: branches/SAMBA_3_0/examples/libsmbclient/testbrowse.c =================================================================== --- branches/SAMBA_3_0/examples/libsmbclient/testbrowse.c 2006-06-27 01:04:05 UTC (rev 16549) +++ branches/SAMBA_3_0/examples/libsmbclient/testbrowse.c 2006-06-27 02:30:58 UTC (rev 16550) @@ -120,10 +120,10 @@ (no_auth ? no_auth_data_fn : get_auth_data_fn); } - /* If we've been asked to log to stderr instead of stdout... */ + /* 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", (void *) 1); + smbc_option_set(context, "debug_to_stderr", 1); } /* Initialize the context using the previously specified options */ Modified: branches/SAMBA_3_0/source/include/libsmbclient.h =================================================================== --- branches/SAMBA_3_0/source/include/libsmbclient.h 2006-06-27 01:04:05 UTC (rev 16549) +++ branches/SAMBA_3_0/source/include/libsmbclient.h 2006-06-27 02:30:58 UTC (rev 16550) @@ -635,7 +635,7 @@ void smbc_option_set(SMBCCTX *context, char *option_name, - void *option_value); + ... /* option_value */); /* * Retrieve the current value of an option * Modified: branches/SAMBA_3_0/source/libsmb/libsmbclient.c =================================================================== --- branches/SAMBA_3_0/source/libsmb/libsmbclient.c 2006-06-27 01:04:05 UTC (rev 16549) +++ branches/SAMBA_3_0/source/libsmb/libsmbclient.c 2006-06-27 02:30:58 UTC (rev 16550) @@ -236,7 +236,7 @@ * * * We accept: - * smb://[[[domain;]user[:[EMAIL PROTECTED]/share[/path[/file]]]][?options] + * smb://[[[domain;]user[:[EMAIL PROTECTED]/share[/path[/file]]]][?options] * * Meaning of URLs: * @@ -6003,27 +6003,62 @@ 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); }