[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-3371-gded8642

Derrell Lipman derrell at samba.org
Sat Jan 17 18:35:47 GMT 2009


The branch, v3-2-test has been updated
       via  ded86426c222b11b9c2e8d8e4cae5ed0eff19edd (commit)
      from  91d30b8a3406d01b5fca97a96ad5964703813f0e (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit ded86426c222b11b9c2e8d8e4cae5ed0eff19edd
Author: Derrell Lipman <derrell.lipman at unwireduniverse.com>
Date:   Sat Jan 17 13:35:12 2009 -0500

    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

-----------------------------------------------------------------------

Summary of changes:
 source/include/libsmbclient.h  |   16 ++++++++-
 source/libsmb/libsmb_context.c |    2 +-
 source/libsmb/libsmb_server.c  |   71 +++++++++++++++++++++++++++++++++++----
 source/libsmb/libsmb_setget.c  |   16 ++++++++-
 4 files changed, 92 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/libsmbclient.h b/source/include/libsmbclient.h
index da2e03c..70f63de 100644
--- a/source/include/libsmbclient.h
+++ b/source/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/source/libsmb/libsmb_context.c b/source/libsmb/libsmb_context.c
index ec42b34..0193e90 100644
--- a/source/libsmb/libsmb_context.c
+++ b/source/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/source/libsmb/libsmb_server.c b/source/libsmb/libsmb_server.c
index d374ac1..91a77fe 100644
--- a/source/libsmb/libsmb_server.c
+++ b/source/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 {
@@ -481,6 +508,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/source/libsmb/libsmb_setget.c b/source/libsmb/libsmb_setget.c
index bca2a80..9de49a5 100644
--- a/source/libsmb/libsmb_setget.c
+++ b/source/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)
 {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list