13
13
along with this program; if not, write to the Free Software
14
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#include "drizzled/internal/mysys_priv.h"
20
#ifdef HAVE_SYS_STAT_H
21
# include <sys/stat.h>
26
#include "drizzled/internal/m_string.h"
16
#include "mysys_priv.h"
17
#include <mystrings/m_string.h>
31
20
Formats a filename with possible replace of directory of extension
37
26
char * fn_format(char * to, const char *name, const char *dir,
38
const char *extension, uint32_t flag)
27
const char *extension, uint flag)
40
char dev[FN_REFLEN], buff[FN_REFLEN], *pos;
41
const char *startpos = name;
29
char dev[FN_REFLEN], buff[FN_REFLEN], *pos, *startpos;
43
31
register size_t length;
46
34
/* Copy and skip directory */
47
name+=(length=dirname_part(dev, startpos, &dev_length));
35
name+=(length=dirname_part(dev, (startpos=(char *) name), &dev_length));
48
36
if (length == 0 || (flag & MY_REPLACE_DIR))
50
38
/* Use given directory */
51
convert_dirname(dev,dir,NULL); /* Fix to this OS */
39
convert_dirname(dev,dir,NullS); /* Fix to this OS */
53
41
else if ((flag & MY_RELATIVE_PATH) && !test_if_hard_path(dev))
55
43
/* Put 'dir' before the given path */
56
strncpy(buff,dev,sizeof(buff)-1);
57
pos=convert_dirname(dev,dir,NULL);
58
strncpy(pos,buff,sizeof(buff)-1- (int) (pos-dev));
44
strmake(buff,dev,sizeof(buff)-1);
45
pos=convert_dirname(dev,dir,NullS);
46
strmake(pos,buff,sizeof(buff)-1- (int) (pos-dev));
49
if (flag & MY_PACK_FILENAME)
50
pack_dirname(dev,dev); /* Put in ./.. and ~/.. */
61
51
if (flag & MY_UNPACK_FILENAME)
62
52
(void) unpack_dirname(dev,dev); /* Replace ~/.. with dir */
64
54
if (!(flag & MY_APPEND_EXT) &&
65
(pos= (char*) strchr(name,FN_EXTCHAR)) != NULL)
55
(pos= (char*) strchr(name,FN_EXTCHAR)) != NullS)
67
57
if ((flag & MY_REPLACE_EXT) == 0) /* If we should keep old ext */
86
76
/* To long path, return original or NULL */
88
78
if (flag & MY_SAFE_PATH)
90
tmp_length= min(strlength(startpos), (size_t)(FN_REFLEN-1));
91
strncpy(to,startpos,tmp_length);
80
tmp_length= strlength(startpos);
81
(void) strmake(to,startpos,min(tmp_length,FN_REFLEN-1));
96
85
if (to == startpos)
98
memmove(buff, name, length); /* Save name for last copy */
87
memcpy(buff, (uchar*) name, length); /* Save name for last copy */
101
char *tmp= strcpy(to, dev) + strlen(dev);
102
pos= strncpy(tmp,name,length) + length;
103
(void) strcpy(pos,ext); /* Don't convert extension */
90
pos=strmake(strmov(to,dev),name,length);
91
(void) strmov(pos,ext); /* Don't convert extension */
106
94
If MY_RETURN_REAL_PATH and MY_RESOLVE_SYMLINK is given, only do
107
95
realpath if the file is a symbolic link
109
97
if (flag & MY_RETURN_REAL_PATH)
111
struct stat stat_buff;
112
char rp_buff[PATH_MAX];
113
if ((!flag & MY_RESOLVE_SYMLINKS) ||
114
(!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
116
if (!realpath(to,rp_buff))
117
my_load_path(rp_buff, to, NULL);
118
rp_buff[FN_REFLEN-1]= '\0';
98
(void) my_realpath(to, to, MYF(flag & MY_RESOLVE_SYMLINKS ?
122
100
else if (flag & MY_RESOLVE_SYMLINKS)
125
ssize_t sym_link_size= readlink(buff,to,FN_REFLEN-1);
126
if (sym_link_size >= 0)
127
to[sym_link_size]= '\0';
103
(void) my_readlink(to, buff, MYF(0));
130
106
} /* fn_format */