Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liblongpath-rsync
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liblongpath
liblongpath-rsync
Commits
e9489cd6
Commit
e9489cd6
authored
May 17, 2008
by
Wayne Davison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed several issues with preserving xattrs when using --backup.
parent
f1ca7c44
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
71 additions
and
2 deletions
+71
-2
backup.c
backup.c
+3
-0
generator.c
generator.c
+7
-0
rsync.c
rsync.c
+5
-2
t_stub.c
t_stub.c
+6
-0
util.c
util.c
+8
-0
xattrs.c
xattrs.c
+42
-0
No files found.
backup.c
View file @
e9489cd6
...
...
@@ -204,6 +204,7 @@ static int keep_backup(const char *fname)
stat_x
sx
;
struct
file_struct
*
file
;
char
*
buf
;
int
save_preserve_xattrs
=
preserve_xattrs
;
int
kept
=
0
;
int
ret_code
;
...
...
@@ -338,7 +339,9 @@ static int keep_backup(const char *fname)
robust_unlink
(
fname
);
/* Just in case... */
}
}
preserve_xattrs
=
0
;
set_file_attrs
(
buf
,
file
,
NULL
,
fname
,
0
);
preserve_xattrs
=
save_preserve_xattrs
;
unmake_file
(
file
);
if
(
verbose
>
1
)
{
...
...
generator.c
View file @
e9489cd6
...
...
@@ -1944,9 +1944,16 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
cleanup:
if
(
back_file
)
{
int
save_preserve_xattrs
=
preserve_xattrs
;
if
(
f_copy
>=
0
)
close
(
f_copy
);
#ifdef SUPPORT_XATTRS
if
(
preserve_xattrs
)
copy_xattrs
(
fname
,
backupptr
);
#endif
preserve_xattrs
=
0
;
set_file_attrs
(
backupptr
,
back_file
,
NULL
,
NULL
,
0
);
preserve_xattrs
=
save_preserve_xattrs
;
if
(
verbose
>
1
)
{
rprintf
(
FINFO
,
"backed up %s to %s
\n
"
,
fname
,
backupptr
);
...
...
rsync.c
View file @
e9489cd6
...
...
@@ -561,8 +561,11 @@ int finish_transfer(const char *fname, const char *fnametmp,
goto
do_set_file_attrs
;
}
if
(
make_backups
>
0
&&
overwriting_basis
&&
!
make_backup
(
fname
))
if
(
make_backups
>
0
&&
overwriting_basis
)
{
if
(
!
make_backup
(
fname
))
return
1
;
fnamecmp
=
get_backup_name
(
fname
);
}
/* Change permissions before putting the file into place. */
set_file_attrs
(
fnametmp
,
file
,
NULL
,
fnamecmp
,
...
...
t_stub.c
View file @
e9489cd6
...
...
@@ -26,6 +26,7 @@ int module_id = -1;
int
relative_paths
=
0
;
int
human_readable
=
0
;
int
module_dirlen
=
0
;
int
preserve_xattrs
=
0
;
mode_t
orig_umask
=
002
;
char
*
partial_dir
;
char
*
module_dir
;
...
...
@@ -69,6 +70,11 @@ struct filter_list_struct daemon_filter_list;
return
-
1
;
}
int
copy_xattrs
(
UNUSED
(
const
char
*
source
),
UNUSED
(
const
char
*
dest
))
{
return
-
1
;
}
char
*
lp_name
(
UNUSED
(
int
mod
))
{
return
NULL
;
...
...
util.c
View file @
e9489cd6
...
...
@@ -29,6 +29,7 @@ extern int module_id;
extern
int
modify_window
;
extern
int
relative_paths
;
extern
int
human_readable
;
extern
int
preserve_xattrs
;
extern
char
*
module_dir
;
extern
unsigned
int
module_dirlen
;
extern
mode_t
orig_umask
;
...
...
@@ -264,6 +265,8 @@ static int safe_read(int desc, char *ptr, size_t len)
/* Copy a file. If ofd < 0, copy_file unlinks and opens the "dest" file.
* Otherwise, it just writes to and closes the provided file descriptor.
* In either case, if --xattrs are being preserved, the dest file will
* have its xattrs set from the source file.
*
* This is used in conjunction with the --temp-dir, --backup, and
* --copy-dest options. */
...
...
@@ -339,6 +342,11 @@ int copy_file(const char *source, const char *dest, int ofd,
return
-
1
;
}
#ifdef SUPPORT_XATTRS
if
(
preserve_xattrs
)
copy_xattrs
(
source
,
dest
);
#endif
return
0
;
}
...
...
xattrs.c
View file @
e9489cd6
...
...
@@ -288,6 +288,48 @@ int get_xattr(const char *fname, stat_x *sxp)
return
0
;
}
int
copy_xattrs
(
const
char
*
source
,
const
char
*
dest
)
{
ssize_t
list_len
,
name_len
;
size_t
datum_len
;
char
*
name
,
*
ptr
;
#ifdef HAVE_LINUX_XATTRS
int
user_only
=
am_sender
?
0
:
!
am_root
;
#endif
/* This puts the name list into the "namebuf" buffer. */
if
((
list_len
=
get_xattr_names
(
source
))
<
0
)
return
-
1
;
for
(
name
=
namebuf
;
list_len
>
0
;
name
+=
name_len
)
{
name_len
=
strlen
(
name
)
+
1
;
list_len
-=
name_len
;
#ifdef HAVE_LINUX_XATTRS
/* We always ignore the system namespace, and non-root
* ignores everything but the user namespace. */
if
(
user_only
?
!
HAS_PREFIX
(
name
,
USER_PREFIX
)
:
HAS_PREFIX
(
name
,
SYSTEM_PREFIX
))
continue
;
#endif
datum_len
=
0
;
if
(
!
(
ptr
=
get_xattr_data
(
source
,
name
,
&
datum_len
,
0
)))
return
-
1
;
if
(
sys_lsetxattr
(
dest
,
name
,
ptr
,
datum_len
)
<
0
)
{
int
save_errno
=
errno
?
errno
:
EINVAL
;
rsyserr
(
FERROR_XFER
,
errno
,
"rsync_xal_set: lsetxattr(
\"
%s
\"
,
\"
%s
\"
) failed"
,
dest
,
name
);
errno
=
save_errno
;
return
-
1
;
}
free
(
ptr
);
}
return
0
;
}
static
int
find_matching_xattr
(
item_list
*
xalp
)
{
size_t
i
,
j
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment