/*The following definitions come from mangle.c */
int str_checksum(char *s);
-BOOL is_8_3(char *fname);
+BOOL is_8_3(char *fname, BOOL check_case);
void create_mangled_stack(int size);
BOOL check_mangled_stack(char *s);
BOOL is_mangled(char *s);
/****************************************************************************
return True if a name is in 8.3 dos format
****************************************************************************/
-BOOL is_8_3(char *fname)
+BOOL is_8_3(char *fname, BOOL check_case)
{
int len;
char *dot_pos;
DEBUG(5,("checking %s for 8.3\n",fname));
- if (case_mangle)
-#ifndef YOSTW
+ if (check_case && case_mangle)
switch (case_default)
{
case CASE_LOWER:
if (strhaslower(fname)) return(False);
break;
}
-#endif
-#ifdef YOSTW
- if (strhasupper(fname) && strhaslower(fname)) return(False);
-#endif
/* can't be longer than 12 chars */
if (len == 0 || len > 12)
}
/* check if it's already in 8.3 format */
- if (need83 && !is_8_3(OutName)) {
+ if (need83 && !is_8_3(OutName, True)) {
if (!lp_manglednames(snum)) return(False);
/* mangle it into 8.3 */
extern files_struct Files[];
extern BOOL case_sensitive;
extern BOOL case_preserve;
+extern BOOL short_case_preserve;
extern pstring sesssetup_user;
extern int Client;
char *p = strrchr(fname,'/');
uint16 flg2 = SVAL(outbuf,smb_flg2);
if (!p) p = fname;
- if (!is_8_3(fname))
+ if (!is_8_3(fname, True))
SSVAL(outbuf,smb_flg2,flg2 | 0x40); /* IS_LONG_NAME */
}
* the rename (user is trying to change the case of the
* filename).
*/
- if((case_sensitive == False) && (case_preserve == True) &&
+ if((case_sensitive == False) && ((case_preserve == True) ||
+ ((short_case_preserve == True) && is_8_3(name, True))) &&
strcsequal(name, newname)) {
pstring newname_modified_last_component;
{
pstring tmpname;
- if (is_8_3(name2))
+ if (is_8_3(name2, True))
return(False);
strcpy(tmpname,name2);
unix_format(name);
unix_clean_name(name);
- if (!case_sensitive &&
- (!case_preserve || (is_8_3(name) && !short_case_preserve)))
- strnorm(name);
-
/* names must be relative to the root of the service - trim any leading /.
also trim trailing /'s */
trim_string(name,"/","/");
+ /*
+ * Ensure saved_last_component is valid even if file exists.
+ */
+ if(saved_last_component) {
+ end = strrchr(name, '/');
+ if(end)
+ strcpy(saved_last_component, end + 1);
+ else
+ strcpy(saved_last_component, name);
+ }
+
+ if (!case_sensitive &&
+ (!case_preserve || (is_8_3(name, False) && !short_case_preserve)))
+ strnorm(name);
+
/* check if it's a printer file */
if (Connections[cnum].printer)
{
- if ((! *name) || strchr(name,'/') || !is_8_3(name))
+ if ((! *name) || strchr(name,'/') || !is_8_3(name, True))
{
char *s;
fstring name2;
return(True);
}
- /*
- * Ensure saved_last_component is valid even if file exists.
- */
- if(saved_last_component) {
- end = strrchr(name, '/');
- if(end)
- strcpy(saved_last_component, end + 1);
- else
- strcpy(saved_last_component, name);
- }
-
/* stat the name - if it exists then we are all done! */
if (sys_stat(name,&st) == 0)
return(True);
break;
case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
- was_8_3 = is_8_3(fname);
+ was_8_3 = is_8_3(fname, True);
len = 94+strlen(fname);
len = (len + 3) & ~3;
SIVAL(p,0,len); p += 4;