extern int preserve_gid;
extern int preserve_times;
extern int relative_paths;
+extern int copy_links;
static char **local_exclude_list = NULL;
static void clean_fname(char *name);
+int link_stat(const char *Path, struct stat *Buffer)
+{
+#if SUPPORT_LINKS
+ if (copy_links) {
+ return stat(Path, Buffer);
+ } else {
+ return lstat(Path, Buffer);
+ }
+#else
+ return stat(Path, Buffer);
+#endif
+}
+
/*
This function is used to check if a file should be included/excluded
from the list of files based on its name and type etc
static void set_filesystem(char *fname)
{
struct stat st;
- if (lstat(fname,&st) != 0) return;
+ if (link_stat(fname,&st) != 0) return;
filesystem_dev = st.st_dev;
}
if (preserve_devices && IS_DEVICE(file->mode))
file->rdev = (flags & SAME_RDEV) ? last_rdev : (dev_t)read_int(f);
-#if SUPPORT_LINKS
if (preserve_links && S_ISLNK(file->mode)) {
int l = read_int(f);
file->link = (char *)malloc(l+1);
read_buf(f,file->link,l);
file->link[l] = 0;
}
-#endif
#if SUPPORT_HARD_LINKS
if (preserve_hard_links && S_ISREG(file->mode)) {
bzero(sum,SUM_LENGTH);
- if (lstat(fname,&st) != 0) {
+ if (link_stat(fname,&st) != 0) {
fprintf(FERROR,"%s: %s\n",
fname,strerror(errno));
return NULL;
strcat(fname,".");
}
- if (lstat(fname,&st) != 0) {
+ if (link_stat(fname,&st) != 0) {
fprintf(FERROR,"%s : %s\n",fname,strerror(errno));
continue;
}