20
20
rename files and symlinks like they would be one unit.
25
#include "drizzled/internal/my_sys.h"
26
#include "drizzled/error.h"
27
#include "drizzled/internal/m_string.h"
34
int my_create_with_symlink(const char *linkname, const char *filename,
35
int createflags, int access_flags, myf MyFlags)
23
#include "mysys_priv.h"
24
#include "mysys_err.h"
25
#include <mystrings/m_string.h>
27
File my_create_with_symlink(const char *linkname, const char *filename,
28
int createflags, int access_flags, myf MyFlags)
39
32
/* Test if we should create a link */
41
34
char abs_linkname[FN_REFLEN];
42
char rp_buff[PATH_MAX];
44
36
if (my_disable_symlinks)
55
if (!realpath(linkname,rp_buff))
56
my_load_path(rp_buff, linkname, NULL);
57
rp_buff[FN_REFLEN-1]= '\0';
58
strcpy(abs_linkname,rp_buff);
46
my_realpath(abs_linkname, linkname, MYF(0));
60
47
create_link= (linkname && strcmp(abs_linkname,filename));
65
52
if (!access(filename,F_OK))
54
my_errno= errno= EEXIST;
68
55
my_error(EE_CANTCREATEFILE, MYF(0), filename, EEXIST);
71
58
if (create_link && !access(linkname,F_OK))
60
my_errno= errno= EEXIST;
74
61
my_error(EE_CANTCREATEFILE, MYF(0), linkname, EEXIST);
84
71
if (MyFlags & MY_DELETE_OLD)
85
72
my_delete(linkname, MYF(0));
87
if (symlink(filename,linkname))
74
if (my_symlink(filename, linkname, MyFlags))
89
76
/* Fail, remove everything we have done */
91
78
my_close(file,MYF(0));
92
79
my_delete(filename, MYF(0));
96
else if (MyFlags & MY_SYNC_DIR)
97
my_sync_dir_by_file(linkname, MyFlags);
108
93
int my_delete_with_symlink(const char *name, myf MyFlags)
110
95
char link_name[FN_REFLEN];
111
ssize_t sym_link_size= readlink(name,link_name,FN_REFLEN-1);
112
int was_symlink= (!my_disable_symlinks && sym_link_size != -1);
96
int was_symlink= (!my_disable_symlinks &&
97
!my_readlink(link_name, name, MYF(0)));
115
100
if (!(result=my_delete(name, MyFlags)))
119
link_name[sym_link_size]= '\0';
120
result= my_delete(link_name, MyFlags);
103
result=my_delete(link_name, MyFlags);
136
118
int my_rename_with_symlink(const char *from, const char *to, myf MyFlags)
120
#ifndef HAVE_READLINK
121
return my_rename(from, to, MyFlags);
138
123
char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
139
int sym_link_size= -1;
140
124
int was_symlink= (!my_disable_symlinks &&
141
(sym_link_size= static_cast<int>(readlink(from,link_name,
142
FN_REFLEN-1))) != -1);
125
!my_readlink(link_name, from, MYF(0)));
144
127
int name_is_different;
146
129
if (!was_symlink)
147
130
return(my_rename(from, to, MyFlags));
149
link_name[sym_link_size]= '\0';
151
132
/* Change filename that symlink pointed to */
152
strcpy(tmp_name, to);
133
my_stpcpy(tmp_name, to);
153
134
fn_same(tmp_name,link_name,1); /* Copy dir */
154
135
name_is_different= strcmp(link_name, tmp_name);
155
136
if (name_is_different && !access(tmp_name, F_OK))
158
139
if (MyFlags & MY_WME)
159
140
my_error(EE_CANTCREATEFILE, MYF(0), tmp_name, EEXIST);
163
144
/* Create new symlink */
164
if (symlink(tmp_name, to))
145
if (my_symlink(tmp_name, to, MyFlags))
166
else if (MyFlags & MY_SYNC_DIR)
167
my_sync_dir_by_file(to, MyFlags);
170
149
Rename symlinked file if the base name didn't change.
175
154
if (name_is_different && my_rename(link_name, tmp_name, MyFlags))
177
int save_errno=errno;
156
int save_errno=my_errno;
178
157
my_delete(to, MyFlags); /* Remove created symlink */
183
162
/* Remove original symlink */
184
163
if (my_delete(from, MyFlags))
186
int save_errno=errno;
165
int save_errno=my_errno;
187
166
/* Remove created link */
188
167
my_delete(to, MyFlags);
189
168
/* Rename file back */
190
169
if (strcmp(link_name, tmp_name))
191
170
(void) my_rename(tmp_name, link_name, MyFlags);
175
#endif /* HAVE_READLINK */
198
} /* namespace internal */
199
} /* namespace drizzled */