From 315f4162111d210d0f65123c8c7fe7084a12121c Mon Sep 17 00:00:00 2001 From: Derrell Lipman Date: Sun, 3 Sep 2006 02:10:24 +0000 Subject: r18013: Fix for "bug" (enhancement) 3684. Provide a new option to specify the share mode to be used when opening a file. (This used to be commit 9b6fee5f6f60638ed80fdedcce4b3d29b091f7aa) --- source3/include/libsmb_internal.h | 6 ++++++ source3/include/libsmbclient.h | 14 ++++++++++++++ source3/libsmb/libsmbclient.c | 15 ++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h index ce7a90747f..41f72d5fb3 100644 --- a/source3/include/libsmb_internal.h +++ b/source3/include/libsmb_internal.h @@ -89,6 +89,12 @@ struct smbc_internal_data { */ BOOL _full_time_names; + /* + * The share mode of a file being opened. To match POSIX semantics + * (and maintain backward compatibility), DENY_NONE is the default. + */ + smbc_share_mode _share_mode; + /* * Authentication function which includes the context. This will be * used if set; otherwise context->callbacks.auth_fn() will be used. diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h index 66a567a0d5..45f2a41b08 100644 --- a/source3/include/libsmbclient.h +++ b/source3/include/libsmbclient.h @@ -141,6 +141,20 @@ struct smbc_dirent #define SMBC_DOS_MODE_DIRECTORY 0x10 #define SMBC_DOS_MODE_ARCHIVE 0x20 +/* + * Valid values for the option "open_share_mode", when calling + * smbc_option_set() + */ +typedef enum smbc_share_mode +{ + SMBC_SHAREMODE_DENY_DOS = 0, + SMBC_SHAREMODE_DENY_ALL = 1, + SMBC_SHAREMODE_DENY_WRITE = 2, + SMBC_SHAREMODE_DENY_READ = 3, + SMBC_SHAREMODE_DENY_NONE = 4, + SMBC_SHAREMODE_DENY_FCB = 7 +} smbc_share_mode; + #ifndef ENOATTR # define ENOATTR ENOENT /* No such attribute */ diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c index 95a9da8487..f89c03274a 100644 --- a/source3/libsmb/libsmbclient.c +++ b/source3/libsmb/libsmbclient.c @@ -1120,7 +1120,8 @@ smbc_open_ctx(SMBCCTX *context, cli_dfs_make_full_path( targetpath, targetcli->desthost, targetcli->share, temppath); } - if ((fd = cli_open(targetcli, targetpath, flags, DENY_NONE)) < 0) { + if ((fd = cli_open(targetcli, targetpath, flags, + context->internal->_share_mode)) < 0) { /* Handle the error ... */ @@ -6166,6 +6167,8 @@ smbc_new_context(void) context->options.browse_max_lmb_count = 3; /* # LMBs to query */ context->options.urlencode_readdir_entries = False;/* backward compat */ context->options.one_share_per_server = False;/* backward compat */ + context->internal->_share_mode = SMBC_SHAREMODE_DENY_NONE; + /* backward compat */ context->open = smbc_open_ctx; context->creat = smbc_creat_ctx; @@ -6301,6 +6304,7 @@ smbc_option_set(SMBCCTX *context, { va_list ap; union { + int i; BOOL b; smbc_get_auth_data_with_context_fn auth_fn; void *v; @@ -6327,6 +6331,15 @@ smbc_option_set(SMBCCTX *context, option_value.b = (BOOL) va_arg(ap, int); context->internal->_full_time_names = option_value.b; + } else if (strcmp(option_name, "open_share_mode") == 0) { + /* + * The share mode to use for files opened with + * smbc_open_ctx(). The default is SMBC_SHAREMODE_DENY_NONE. + */ + option_value.i = va_arg(ap, int); + context->internal->_share_mode = + (smbc_share_mode) option_value.i; + } else if (strcmp(option_name, "auth_function") == 0) { /* * Use the new-style authentication function which includes -- cgit