summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrell Lipman <derrell.lipman@unwireduniverse.com>2009-01-17 13:33:25 -0500
committerDerrell Lipman <derrell.lipman@unwireduniverse.com>2009-01-17 13:33:39 -0500
commit6d300399b52e0921ce205ef2f053b722b21edeeb (patch)
treec37c1ff554ddabf931af2e3ff702890e12283e39
parent9b3c38f4afe2b15159c8659b5916740493f7b60c (diff)
downloadsamba-6d300399b52e0921ce205ef2f053b722b21edeeb.tar.gz
samba-6d300399b52e0921ce205ef2f053b722b21edeeb.tar.bz2
samba-6d300399b52e0921ce205ef2f053b722b21edeeb.zip
Determine case sensitivity based on file system attributes.
- Most of the time, we can determine from the file system we're connecting to whether it supports case sensitivity. In those cases, we now set the internal case sensitivity flag automatically. For those cases where the request to retrieve file system attributes fails, we'll use the user-specified option value. Derrell
-rw-r--r--source3/include/libsmbclient.h16
-rw-r--r--source3/libsmb/libsmb_context.c2
-rw-r--r--source3/libsmb/libsmb_server.c71
-rw-r--r--source3/libsmb/libsmb_setget.c16
4 files changed, 92 insertions, 13 deletions
diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h
index 4a8accbf4e..b2d9483a0b 100644
--- a/source3/include/libsmbclient.h
+++ b/source3/include/libsmbclient.h
@@ -550,11 +550,23 @@ smbc_getOptionSmbEncryptionLevel(SMBCCTX *c);
void
smbc_setOptionSmbEncryptionLevel(SMBCCTX *c, smbc_smb_encrypt_level level);
-/** Get whether to treat file names as case-sensitive. */
+/**
+ * Get whether to treat file names as case-sensitive if we can't determine
+ * when connecting to the remote share whether the file system is case
+ * sensitive. This defaults to FALSE since it's most likely that if we can't
+ * retrieve the file system attributes, it's a very old file system that does
+ * not support case sensitivity.
+ */
smbc_bool
smbc_getOptionCaseSensitive(SMBCCTX *c);
-/** Set whether to treat file names as case-sensitive. */
+/**
+ * Set whether to treat file names as case-sensitive if we can't determine
+ * when connecting to the remote share whether the file system is case
+ * sensitive. This defaults to FALSE since it's most likely that if we can't
+ * retrieve the file system attributes, it's a very old file system that does
+ * not support case sensitivity.
+ */
void
smbc_setOptionCaseSensitive(SMBCCTX *c, smbc_bool b);
diff --git a/source3/libsmb/libsmb_context.c b/source3/libsmb/libsmb_context.c
index ca8ceedbc2..c2c33e5302 100644
--- a/source3/libsmb/libsmb_context.c
+++ b/source3/libsmb/libsmb_context.c
@@ -69,7 +69,7 @@ smbc_new_context(void)
smbc_setOptionFullTimeNames(context, False);
smbc_setOptionOpenShareMode(context, SMBC_SHAREMODE_DENY_NONE);
smbc_setOptionSmbEncryptionLevel(context, SMBC_ENCRYPTLEVEL_NONE);
- smbc_setOptionCaseSensitive(context, True);
+ smbc_setOptionCaseSensitive(context, False);
smbc_setOptionBrowseMaxLmbCount(context, 3); /* # LMBs to query */
smbc_setOptionUrlEncodeReaddirEntries(context, False);
smbc_setOptionOneSharePerServer(context, False);
diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c
index e2cc07118b..0ece5bb649 100644
--- a/source3/libsmb/libsmb_server.c
+++ b/source3/libsmb/libsmb_server.c
@@ -245,6 +245,8 @@ SMBC_server(TALLOC_CTX *ctx,
int tried_reverse = 0;
int port_try_first;
int port_try_next;
+ int is_ipc = (share != NULL && strcmp(share, "IPC$") == 0);
+ uint32 fs_attrs = 0;
const char *username_used;
NTSTATUS status;
@@ -310,6 +312,38 @@ SMBC_server(TALLOC_CTX *ctx,
srv = NULL;
}
+ /* Determine if this share supports case sensitivity */
+ if (is_ipc) {
+ DEBUG(4,
+ ("IPC$ so ignore case sensitivity\n"));
+ } else if (!cli_get_fs_attr_info(c, &fs_attrs)) {
+ DEBUG(4, ("Could not retrieve "
+ "case sensitivity flag: %s.\n",
+ cli_errstr(c)));
+
+ /*
+ * We can't determine the case sensitivity of
+ * the share. We have no choice but to use the
+ * user-specified case sensitivity setting.
+ */
+ if (smbc_getOptionCaseSensitive(context)) {
+ cli_set_case_sensitive(c, True);
+ } else {
+ cli_set_case_sensitive(c, False);
+ }
+ } else {
+ DEBUG(4,
+ ("Case sensitive: %s\n",
+ (fs_attrs & FILE_CASE_SENSITIVE_SEARCH
+ ? "True"
+ : "False")));
+ cli_set_case_sensitive(
+ c,
+ (fs_attrs & FILE_CASE_SENSITIVE_SEARCH
+ ? True
+ : False));
+ }
+
/*
* Regenerate the dev value since it's based on both
* server and share
@@ -356,13 +390,6 @@ again:
return NULL;
}
- /* POSIX-like - always request case-sensitivity by default. */
- if (smbc_getOptionCaseSensitive(context)) {
- cli_set_case_sensitive(c, True);
- } else {
- cli_set_case_sensitive(c, False);
- }
-
if (smbc_getOptionUseKerberos(context)) {
c->use_kerberos = True;
}
@@ -377,7 +404,7 @@ again:
* Force use of port 139 for first try if share is $IPC, empty, or
* null, so browse lists can work
*/
- if (share == NULL || *share == '\0' || strcmp(share, "IPC$") == 0) {
+ if (share == NULL || *share == '\0' || is_ipc) {
port_try_first = 139;
port_try_next = 445;
} else {
@@ -483,6 +510,34 @@ again:
DEBUG(4,(" tconx ok\n"));
+ /* Determine if this share supports case sensitivity */
+ if (is_ipc) {
+ DEBUG(4, ("IPC$ so ignore case sensitivity\n"));
+ } else if (!cli_get_fs_attr_info(c, &fs_attrs)) {
+ DEBUG(4, ("Could not retrieve case sensitivity flag: %s.\n",
+ cli_errstr(c)));
+
+ /*
+ * We can't determine the case sensitivity of the share. We
+ * have no choice but to use the user-specified case
+ * sensitivity setting.
+ */
+ if (smbc_getOptionCaseSensitive(context)) {
+ cli_set_case_sensitive(c, True);
+ } else {
+ cli_set_case_sensitive(c, False);
+ }
+ } else {
+ DEBUG(4, ("Case sensitive: %s\n",
+ (fs_attrs & FILE_CASE_SENSITIVE_SEARCH
+ ? "True"
+ : "False")));
+ cli_set_case_sensitive(c,
+ (fs_attrs & FILE_CASE_SENSITIVE_SEARCH
+ ? True
+ : False));
+ }
+
if (context->internal->smb_encryption_level) {
/* Attempt UNIX smb encryption. */
if (!NT_STATUS_IS_OK(cli_force_encryption(c,
diff --git a/source3/libsmb/libsmb_setget.c b/source3/libsmb/libsmb_setget.c
index bca2a80d14..9de49a5b3f 100644
--- a/source3/libsmb/libsmb_setget.c
+++ b/source3/libsmb/libsmb_setget.c
@@ -193,14 +193,26 @@ smbc_setOptionSmbEncryptionLevel(SMBCCTX *c, smbc_smb_encrypt_level level)
c->internal->smb_encryption_level = level;
}
-/** Get whether to treat file names as case-sensitive. */
+/**
+ * Get whether to treat file names as case-sensitive if we can't determine
+ * when connecting to the remote share whether the file system is case
+ * sensitive. This defaults to FALSE since it's most likely that if we can't
+ * retrieve the file system attributes, it's a very old file system that does
+ * not support case sensitivity.
+ */
smbc_bool
smbc_getOptionCaseSensitive(SMBCCTX *c)
{
return c->internal->case_sensitive;
}
-/** Set whether to treat file names as case-sensitive. */
+/**
+ * Set whether to treat file names as case-sensitive if we can't determine
+ * when connecting to the remote share whether the file system is case
+ * sensitive. This defaults to FALSE since it's most likely that if we can't
+ * retrieve the file system attributes, it's a very old file system that does
+ * not support case sensitivity.
+ */
void
smbc_setOptionCaseSensitive(SMBCCTX *c, smbc_bool b)
{