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;
37 char rp_buff[PATH_MAX];
39 if (my_disable_symlinks)
47 if (!realpath(linkname,rp_buff))
48 my_load_path(rp_buff, linkname, NULL);
49 rp_buff[FN_REFLEN-1]=
'\0';
50 char abs_linkname[FN_REFLEN];
51 strcpy(abs_linkname, rp_buff);
52 create_link= strcmp(abs_linkname, filename);
55 if (!(MyFlags & MY_DELETE_OLD))
57 if (!access(filename,F_OK))
60 my_error(EE_CANTCREATEFILE, MYF(0), filename, EEXIST);
63 if (create_link && !access(linkname,F_OK))
66 my_error(EE_CANTCREATEFILE, MYF(0), linkname, EEXIST);
71 int file= my_create(filename, createflags, access_flags, MyFlags);
72 if (file >= 0 && create_link)
75 if (MyFlags & MY_DELETE_OLD)
76 my_delete(linkname, MYF(0));
78 if (symlink(filename,linkname))
82 my_close(file, MYF(0));
83 my_delete(filename, MYF(0));
87 else if (MyFlags & MY_SYNC_DIR)
88 my_sync_dir_by_file(linkname, MyFlags);
98 int my_delete_with_symlink(
const char *name, myf MyFlags)
100 char link_name[FN_REFLEN];
101 ssize_t sym_link_size= readlink(name,link_name,FN_REFLEN-1);
102 int was_symlink= (!my_disable_symlinks && sym_link_size != -1);
105 if (!(result=my_delete(name, MyFlags)))
109 link_name[sym_link_size]=
'\0';
110 result= my_delete(link_name, MyFlags);
126 int my_rename_with_symlink(
const char *from,
const char *to, myf MyFlags)
128 char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
129 int sym_link_size= -1;
130 int was_symlink= (!my_disable_symlinks &&
131 (sym_link_size=
static_cast<int>(readlink(from,link_name,
132 FN_REFLEN-1))) != -1);
134 int name_is_different;
137 return(my_rename(from, to, MyFlags));
139 link_name[sym_link_size]=
'\0';
142 strcpy(tmp_name, to);
143 fn_same(tmp_name,link_name,1);
144 name_is_different= strcmp(link_name, tmp_name);
145 if (name_is_different && !access(tmp_name, F_OK))
148 if (MyFlags & MY_WME)
149 my_error(EE_CANTCREATEFILE, MYF(0), tmp_name, EEXIST);
154 if (symlink(tmp_name, to))
156 else if (MyFlags & MY_SYNC_DIR)
157 my_sync_dir_by_file(to, MyFlags);
165 if (name_is_different && my_rename(link_name, tmp_name, MyFlags))
167 int save_errno=errno;
168 my_delete(to, MyFlags);
174 if (my_delete(from, MyFlags))
176 int save_errno=errno;
178 my_delete(to, MyFlags);
180 if (strcmp(link_name, tmp_name))
181 (void) my_rename(tmp_name, link_name, MyFlags);