summaryrefslogtreecommitdiff
path: root/source3/libsmb/libsmb_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/libsmb/libsmb_server.c')
-rw-r--r--source3/libsmb/libsmb_server.c71
1 files changed, 63 insertions, 8 deletions
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,