|
|
|
@ -266,22 +266,64 @@ void symdirget(char *dir) |
|
|
|
#endif /* USE_SYMDIR */ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
Fixes a directroy name so that can be used by open() |
|
|
|
/** |
|
|
|
Convert a directory name to a format which can be compared as strings |
|
|
|
|
|
|
|
SYNOPSIS |
|
|
|
unpack_dirname() |
|
|
|
to result-buffer, FN_REFLEN characters. may be == from |
|
|
|
from 'Packed' directory name (may contain ~) |
|
|
|
@param to result buffer, FN_REFLEN chars in length; may be == from |
|
|
|
@param from 'packed' directory name, in whatever format |
|
|
|
@returns size of the normalized name |
|
|
|
|
|
|
|
IMPLEMENTATION |
|
|
|
Make that last char of to is '/' if from not empty and |
|
|
|
from doesn't end in FN_DEVCHAR |
|
|
|
Uses cleanup_dirname and changes ~/.. to home_dir/.. |
|
|
|
@details |
|
|
|
- Ensures that last char is FN_LIBCHAR, unless it is FN_DEVCHAR |
|
|
|
- Uses cleanup_dirname |
|
|
|
|
|
|
|
Changes a UNIX filename to system filename (replaces / with \ on windows) |
|
|
|
It does *not* expand ~/ (although, see cleanup_dirname). Nor does it do |
|
|
|
any case folding. All case-insensitive normalization should be done by |
|
|
|
the caller. |
|
|
|
*/ |
|
|
|
|
|
|
|
RETURN |
|
|
|
uint normalize_dirname(char *to, const char *from) |
|
|
|
{ |
|
|
|
uint length; |
|
|
|
char buff[FN_REFLEN]; |
|
|
|
DBUG_ENTER("normalize_dirname"); |
|
|
|
|
|
|
|
/* |
|
|
|
Despite the name, this actually converts the name to the system's |
|
|
|
format (TODO: rip out the non-working VMS stuff and name this |
|
|
|
properly). |
|
|
|
*/ |
|
|
|
(void) intern_filename(buff, from); |
|
|
|
length= (uint) strlen(buff); /* Fix that '/' is last */ |
|
|
|
if (length && |
|
|
|
#ifdef FN_DEVCHAR |
|
|
|
buff[length - 1] != FN_DEVCHAR && |
|
|
|
#endif |
|
|
|
buff[length - 1] != FN_LIBCHAR && buff[length - 1] != '/') |
|
|
|
{ |
|
|
|
buff[length]= FN_LIBCHAR; |
|
|
|
buff[length + 1]= '\0'; |
|
|
|
} |
|
|
|
|
|
|
|
length=cleanup_dirname(to, buff); |
|
|
|
|
|
|
|
DBUG_RETURN(length); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
Fixes a directory name so that can be used by open() |
|
|
|
|
|
|
|
@param to Result buffer, FN_REFLEN characters. May be == from |
|
|
|
@param from 'Packed' directory name (may contain ~) |
|
|
|
|
|
|
|
@details |
|
|
|
- Uses normalize_dirname() |
|
|
|
- Expands ~/... to home_dir/... |
|
|
|
- Resolves MySQL's fake "foo.sym" symbolic directory names (if USE_SYMDIR) |
|
|
|
- Changes a UNIX filename to system filename (replaces / with \ on windows) |
|
|
|
|
|
|
|
@returns |
|
|
|
Length of new directory name (= length of to) |
|
|
|
*/ |
|
|
|
|
|
|
|
@ -291,19 +333,8 @@ uint unpack_dirname(my_string to, const char *from) |
|
|
|
char buff[FN_REFLEN+1+4],*suffix,*tilde_expansion; |
|
|
|
DBUG_ENTER("unpack_dirname"); |
|
|
|
|
|
|
|
(void) intern_filename(buff,from); /* Change to intern name */ |
|
|
|
length= (uint) strlen(buff); /* Fix that '/' is last */ |
|
|
|
if (length && |
|
|
|
#ifdef FN_DEVCHAR |
|
|
|
buff[length-1] != FN_DEVCHAR && |
|
|
|
#endif |
|
|
|
buff[length-1] != FN_LIBCHAR && buff[length-1] != '/') |
|
|
|
{ |
|
|
|
buff[length]=FN_LIBCHAR; |
|
|
|
buff[length+1]= '\0'; |
|
|
|
} |
|
|
|
length= normalize_dirname(buff, from); |
|
|
|
|
|
|
|
length=cleanup_dirname(buff,buff); |
|
|
|
if (buff[0] == FN_HOMELIB) |
|
|
|
{ |
|
|
|
suffix=buff+1; tilde_expansion=expand_tilde(&suffix); |
|
|
|
|