18 #include <drizzled/internal/my_sys.h>
22 #ifdef HAVE_SYS_STAT_H
23 # include <sys/stat.h>
28 #include <drizzled/internal/m_string.h>
37 static size_t strlength(
const char *str);
46 char * fn_format(
char * to,
const char *name,
const char *dir,
47 const char *extension, uint32_t flag)
49 char dev[FN_REFLEN], buff[FN_REFLEN], *pos;
50 const char *startpos = name;
56 name+=(length=dirname_part(dev, startpos, &dev_length));
57 if (length == 0 || (flag & MY_REPLACE_DIR))
60 convert_dirname(dev,dir,NULL);
62 else if ((flag & MY_RELATIVE_PATH) && !test_if_hard_path(dev))
65 strncpy(buff,dev,
sizeof(buff)-1);
66 pos=convert_dirname(dev,dir,NULL);
67 strncpy(pos,buff,
sizeof(buff)-1- (
int) (pos-dev));
70 if (flag & MY_UNPACK_FILENAME)
71 (void) unpack_dirname(dev,dev);
73 if (!(flag & MY_APPEND_EXT) &&
74 (pos= (
char*) strchr(name,FN_EXTCHAR)) != NULL)
76 if ((flag & MY_REPLACE_EXT) == 0)
78 length=strlength(name);
83 length= (size_t) (pos-(
char*) name);
89 length=strlength(name);
93 if (strlen(dev)+length+strlen(ext) >= FN_REFLEN || length >= FN_LEN )
97 if (flag & MY_SAFE_PATH)
99 tmp_length= min(strlength(startpos), (
size_t)(FN_REFLEN-1));
100 strncpy(to,startpos,tmp_length);
101 to[tmp_length]=
'\0';
107 memmove(buff, name, length);
110 char *tmp= strcpy(to, dev) + strlen(dev);
111 pos= strncpy(tmp,name,length) + length;
112 (void) strcpy(pos,ext);
118 if (flag & MY_RETURN_REAL_PATH)
120 struct stat stat_buff;
122 char rp_buff[PATH_MAX];
124 char *rp_buff = NULL;
126 if ((!flag & MY_RESOLVE_SYMLINKS) ||
127 (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
130 if (!realpath(to,rp_buff))
131 my_load_path(rp_buff, to, NULL);
132 rp_buff[FN_REFLEN-1]=
'\0';
136 rp_buff = realpath(to,NULL);
138 char buffer[FN_REFLEN];
139 my_load_path(buffer, to, NULL);
140 buffer[FN_REFLEN-1]=
'\0';
143 if (strlen(rp_buff) >= FN_REFLEN) {
144 rp_buff[FN_REFLEN-1]=
'\0';
152 else if (flag & MY_RESOLVE_SYMLINKS)
155 ssize_t sym_link_size= readlink(buff,to,FN_REFLEN-1);
156 if (sym_link_size >= 0)
157 to[sym_link_size]=
'\0';
168 static size_t strlength(
const char *str)
170 const char* found= str;
171 const char* pos= str;
177 while (*++pos && *pos !=
' ') {};
185 while (*++pos ==
' ') {};
187 return((
size_t) (found - str));
TODO: Rename this file - func.h is stupid.