Merge fix for bug#38180 from mysql-5.0.66a-release
This commit is contained in:
commit
5861c5ecf8
@ -682,6 +682,7 @@ extern my_string fn_format(my_string to,const char *name,const char *dir,
|
|||||||
const char *form, uint flag);
|
const char *form, uint flag);
|
||||||
extern size_s strlength(const char *str);
|
extern size_s strlength(const char *str);
|
||||||
extern void pack_dirname(my_string to,const char *from);
|
extern void pack_dirname(my_string to,const char *from);
|
||||||
|
extern uint normalize_dirname(char * to, const char *from);
|
||||||
extern uint unpack_dirname(my_string to,const char *from);
|
extern uint unpack_dirname(my_string to,const char *from);
|
||||||
extern uint cleanup_dirname(my_string to,const char *from);
|
extern uint cleanup_dirname(my_string to,const char *from);
|
||||||
extern uint system_filename(my_string to,const char *from);
|
extern uint system_filename(my_string to,const char *from);
|
||||||
|
@ -965,8 +965,7 @@ static int add_directory(MEM_ROOT *alloc, const char *dir, const char **dirs)
|
|||||||
char *p;
|
char *p;
|
||||||
my_bool err __attribute__((unused));
|
my_bool err __attribute__((unused));
|
||||||
|
|
||||||
/* Normalize directory name */
|
len= normalize_dirname(buf, dir);
|
||||||
len= unpack_dirname(buf, dir);
|
|
||||||
if (!(p= strmake_root(alloc, buf, len)))
|
if (!(p= strmake_root(alloc, buf, len)))
|
||||||
return 1; /* Failure */
|
return 1; /* Failure */
|
||||||
/* Should never fail if DEFAULT_DIRS_SIZE is correct size */
|
/* Should never fail if DEFAULT_DIRS_SIZE is correct size */
|
||||||
|
@ -266,22 +266,64 @@ void symdirget(char *dir)
|
|||||||
#endif /* USE_SYMDIR */
|
#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
|
@param to result buffer, FN_REFLEN chars in length; may be == from
|
||||||
unpack_dirname()
|
@param from 'packed' directory name, in whatever format
|
||||||
to result-buffer, FN_REFLEN characters. may be == from
|
@returns size of the normalized name
|
||||||
from 'Packed' directory name (may contain ~)
|
|
||||||
|
|
||||||
IMPLEMENTATION
|
@details
|
||||||
Make that last char of to is '/' if from not empty and
|
- Ensures that last char is FN_LIBCHAR, unless it is FN_DEVCHAR
|
||||||
from doesn't end in FN_DEVCHAR
|
- Uses cleanup_dirname
|
||||||
Uses cleanup_dirname and changes ~/.. to home_dir/..
|
|
||||||
|
|
||||||
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)
|
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;
|
char buff[FN_REFLEN+1+4],*suffix,*tilde_expansion;
|
||||||
DBUG_ENTER("unpack_dirname");
|
DBUG_ENTER("unpack_dirname");
|
||||||
|
|
||||||
(void) intern_filename(buff,from); /* Change to intern name */
|
length= normalize_dirname(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(buff,buff);
|
|
||||||
if (buff[0] == FN_HOMELIB)
|
if (buff[0] == FN_HOMELIB)
|
||||||
{
|
{
|
||||||
suffix=buff+1; tilde_expansion=expand_tilde(&suffix);
|
suffix=buff+1; tilde_expansion=expand_tilde(&suffix);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user