Treat file names in POSIX-like case-sensitive fashion by default
authorDerrell Lipman <derrell.lipman@unwireduniverse.com>
Fri, 16 Jan 2009 20:55:08 +0000 (15:55 -0500)
committerDerrell Lipman <derrell.lipman@unwireduniverse.com>
Fri, 16 Jan 2009 21:42:48 +0000 (16:42 -0500)
*** THIS COMMIT CAUSES A CHANGE OF DEFAULT BEHAVIOR IN libsmbclient!!! ***

- libsmbclient now calls cli_set_case_sensitive() for a new CLI. By default,
  it requests case-sensitive, but the old behavior of case-insensitive can be
  requested with smbc_setOptionCaseSensitive(context, False);

  The change of behavior is considered a bug fix, as it was previously
  possible to accidentally overwrite a file that had the same case-insensitive
  name but a different case-sensitive name as a previously-existing file,
  while creating a new file.

Derrell

source/include/libsmb_internal.h
source/include/libsmbclient.h
source/libsmb/libsmb_context.c
source/libsmb/libsmb_server.c
source/libsmb/libsmb_setget.c

index b4881169396fa7e8aed3558ba834e073eab5ab96..8b410b4f7f94589b9dfa249f4fd087ad94ed0c7a 100644 (file)
@@ -176,6 +176,11 @@ struct SMBC_internal_data {
          */
         smbc_smb_encrypt_level                  smb_encryption_level;
 
+        /*
+         * Should we request case sensitivity of file names?
+         */
+        bool                                    case_sensitive;
+
         struct smbc_server_cache * server_cache;
 
         /* POSIX emulation functions */
index a8b27b709e4fb4ceec89c04f4331a3166bc874d9..4a8accbf4e54977d26860f3fa709a150b91cb3e6 100644 (file)
@@ -550,6 +550,15 @@ smbc_getOptionSmbEncryptionLevel(SMBCCTX *c);
 void
 smbc_setOptionSmbEncryptionLevel(SMBCCTX *c, smbc_smb_encrypt_level level);
 
+/** Get whether to treat file names as case-sensitive. */
+smbc_bool
+smbc_getOptionCaseSensitive(SMBCCTX *c);
+
+/** Set whether to treat file names as case-sensitive. */
+void
+smbc_setOptionCaseSensitive(SMBCCTX *c, smbc_bool b);
+
+
 /**
  * Get from how many local master browsers should the list of workgroups be
  * retrieved.  It can take up to 12 minutes or longer after a server becomes a
index 19843383de2bc864a130e57d1384b7e3e41c5117..0efb5fc0601fe63e0df56fc784db1f85259864b6 100644 (file)
@@ -69,6 +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_setOptionBrowseMaxLmbCount(context, 3);    /* # LMBs to query */
         smbc_setOptionUrlEncodeReaddirEntries(context, False);
         smbc_setOptionOneSharePerServer(context, False);
index 9b4d3f61e4120fab876cf7575c6858953cf10092..91c04cedbfef9fd849c572930e29468342ac32b2 100644 (file)
@@ -355,7 +355,14 @@ again:
                errno = ENOMEM;
                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;
        }
index d0823bd77ec4125b19e6f7a8d6d6851bda4ff01a..bca2a80d14bfe0ecbf25f8f15b48591d542db284 100644 (file)
@@ -193,6 +193,20 @@ smbc_setOptionSmbEncryptionLevel(SMBCCTX *c, smbc_smb_encrypt_level level)
         c->internal->smb_encryption_level = level;
 }
 
+/** Get whether to treat file names as case-sensitive. */
+smbc_bool
+smbc_getOptionCaseSensitive(SMBCCTX *c)
+{
+        return c->internal->case_sensitive;
+}
+
+/** Set whether to treat file names as case-sensitive. */
+void
+smbc_setOptionCaseSensitive(SMBCCTX *c, smbc_bool b)
+{
+        c->internal->case_sensitive = b;
+}
+
 /**
  * Get from how many local master browsers should the list of workgroups be
  * retrieved.  It can take up to 12 minutes or longer after a server becomes a