25 #include <drizzled/internal/my_sys.h>
26 #include <drizzled/error.h>
27 #include <drizzled/internal/m_string.h>
32 int my_create_with_symlink(
const char *linkname,
const char *filename,
33 int createflags,
int access_flags, myf MyFlags)
36 bool create_link=
false;
38 char rp_buff[PATH_MAX];
42 if (my_disable_symlinks)
50 char abs_linkname[FN_REFLEN];
52 if (!realpath(linkname,rp_buff))
53 my_load_path(rp_buff, linkname, NULL);
54 rp_buff[FN_REFLEN-1]=
'\0';
55 strcpy(abs_linkname, rp_buff);
58 rp_buff = realpath(linkname,NULL);
60 char buffer[FN_REFLEN];
61 my_load_path(buffer, linkname, NULL);
62 buffer[FN_REFLEN-1]=
'\0';
63 strcpy(abs_linkname,buffer);
65 if (strlen(rp_buff) >= FN_REFLEN) {
66 rp_buff[FN_REFLEN-1]=
'\0';
68 strcpy(abs_linkname,rp_buff);
72 create_link= strcmp(abs_linkname, filename);
75 if (!(MyFlags & MY_DELETE_OLD))
77 if (!access(filename,F_OK))
80 my_error(EE_CANTCREATEFILE, MYF(0), filename, EEXIST);
83 if (create_link && !access(linkname,F_OK))
86 my_error(EE_CANTCREATEFILE, MYF(0), linkname, EEXIST);
91 int file= my_create(filename, createflags, access_flags, MyFlags);
92 if (file >= 0 && create_link)
95 if (MyFlags & MY_DELETE_OLD)
96 my_delete(linkname, MYF(0));
98 if (symlink(filename,linkname))
101 int tmp_errno= errno;
102 my_close(file, MYF(0));
103 my_delete(filename, MYF(0));
107 else if (MyFlags & MY_SYNC_DIR)
108 my_sync_dir_by_file(linkname, MyFlags);
118 int my_delete_with_symlink(
const char *name, myf MyFlags)
120 char link_name[FN_REFLEN];
121 ssize_t sym_link_size= readlink(name,link_name,FN_REFLEN-1);
122 int was_symlink= (!my_disable_symlinks && sym_link_size != -1);
125 if (!(result=my_delete(name, MyFlags)))
129 link_name[sym_link_size]=
'\0';
130 result= my_delete(link_name, MyFlags);
146 int my_rename_with_symlink(
const char *from,
const char *to, myf MyFlags)
148 char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
149 int sym_link_size= -1;
150 int was_symlink= (!my_disable_symlinks &&
151 (sym_link_size=
static_cast<int>(readlink(from,link_name,
152 FN_REFLEN-1))) != -1);
154 int name_is_different;
157 return(my_rename(from, to, MyFlags));
159 link_name[sym_link_size]=
'\0';
162 strcpy(tmp_name, to);
163 fn_same(tmp_name,link_name,1);
164 name_is_different= strcmp(link_name, tmp_name);
165 if (name_is_different && !access(tmp_name, F_OK))
168 if (MyFlags & MY_WME)
169 my_error(EE_CANTCREATEFILE, MYF(0), tmp_name, EEXIST);
174 if (symlink(tmp_name, to))
176 else if (MyFlags & MY_SYNC_DIR)
177 my_sync_dir_by_file(to, MyFlags);
185 if (name_is_different && my_rename(link_name, tmp_name, MyFlags))
187 int save_errno=errno;
188 my_delete(to, MyFlags);
194 if (my_delete(from, MyFlags))
196 int save_errno=errno;
198 my_delete(to, MyFlags);
200 if (strcmp(link_name, tmp_name))
201 (void) my_rename(tmp_name, link_name, MyFlags);