extern int preserve_times;
extern int relative_paths;
extern int copy_links;
+extern int copy_unsafe_links;
extern int remote_version;
extern int io_error;
+static char topsrcname[MAXPATHLEN];
+
static struct exclude_struct **local_exclude_list;
static void clean_flist(struct file_list *flist, int strip_root);
}
+int readlink_stat(const char *Path, STRUCT_STAT *Buffer, char *Linkbuf)
+{
+#if SUPPORT_LINKS
+ if (copy_links) {
+ return do_stat(Path, Buffer);
+ }
+ if (do_lstat(Path, Buffer) == -1) {
+ return -1;
+ }
+ if (S_ISLNK(Buffer->st_mode)) {
+ int l;
+ if ((l = readlink(Path,Linkbuf,MAXPATHLEN-1)) == -1) {
+ return -1;
+ }
+ Linkbuf[l] = 0;
+ if (copy_unsafe_links && (topsrcname[0] != '\0') &&
+ unsafe_symlink(Linkbuf, topsrcname)) {
+ return do_stat(Path, Buffer);
+ }
+ }
+ return 0;
+#else
+ return do_stat(Path, Buffer);
+#endif
+}
+
int link_stat(const char *Path, STRUCT_STAT *Buffer)
{
#if SUPPORT_LINKS
char sum[SUM_LENGTH];
char *p;
char cleaned_name[MAXPATHLEN];
+ char linkbuf[MAXPATHLEN];
strlcpy(cleaned_name, fname, MAXPATHLEN);
cleaned_name[MAXPATHLEN-1] = 0;
memset(sum,0,SUM_LENGTH);
- if (link_stat(fname,&st) != 0) {
+ if (readlink_stat(fname,&st,linkbuf) != 0) {
io_error = 1;
rprintf(FERROR,"%s: %s\n",
fname,strerror(errno));
#if SUPPORT_LINKS
if (S_ISLNK(st.st_mode)) {
- int l;
- char lnk[MAXPATHLEN];
- if ((l=readlink(fname,lnk,MAXPATHLEN-1)) == -1) {
- io_error=1;
- rprintf(FERROR,"readlink %s : %s\n",
- fname,strerror(errno));
- return NULL;
- }
- lnk[l] = 0;
- file->link = strdup(lnk);
+ file->link = strdup(linkbuf);
}
#endif
}
for (i=0;i<argc;i++) {
- char fname2[MAXPATHLEN];
- char *fname = fname2;
+ char *fname = topsrcname;
strlcpy(fname,argv[i],MAXPATHLEN);
for (p=fname+1; (p=strchr(p,'/')); p++) {
int copy_links_saved = copy_links;
*p = 0;
- copy_links = 0;
+ copy_links = copy_unsafe_links;
send_file_name(f, flist, fname, 0, 0);
copy_links = copy_links_saved;
*p = '/';
}
}
+ topsrcname[0] = '\0';
+
if (f != -1) {
send_file_entry(NULL,f,0);
}