mirror of
https://github.com/borgbackup/borg.git
synced 2025-01-01 04:37:34 +00:00
bsdflags support: do not open BLK/CHR/LNK files, fixes #3130
opening a device file for a non-existing device can be very slow.
symlinks will make the open() call fail as it is using O_NOFOLLOW.
also: lstat -> stat(..., follow_symlinks=False) like everywhere else.
(cherry picked from commit a6ee4e9aed
)
This commit is contained in:
parent
58c53e25ea
commit
e1723ec1d9
1 changed files with 9 additions and 2 deletions
|
@ -72,8 +72,11 @@ BSD_TO_LINUX_FLAGS = {
|
|||
|
||||
|
||||
def set_flags(path, bsd_flags, fd=None):
|
||||
if fd is None and stat.S_ISLNK(os.lstat(path).st_mode):
|
||||
return
|
||||
if fd is None:
|
||||
st = os.stat(path, follow_symlinks=False)
|
||||
if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
|
||||
# see comment in get_flags()
|
||||
return
|
||||
cdef int flags = 0
|
||||
for bsd_flag, linux_flag in BSD_TO_LINUX_FLAGS.items():
|
||||
if bsd_flags & bsd_flag:
|
||||
|
@ -92,6 +95,10 @@ def set_flags(path, bsd_flags, fd=None):
|
|||
|
||||
|
||||
def get_flags(path, st):
|
||||
if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
|
||||
# avoid opening devices files - trying to open non-present devices can be rather slow.
|
||||
# avoid opening symlinks, O_NOFOLLOW would make the open() fail anyway.
|
||||
return 0
|
||||
cdef int linux_flags
|
||||
try:
|
||||
fd = os.open(path, os.O_RDONLY|os.O_NONBLOCK|os.O_NOFOLLOW)
|
||||
|
|
Loading…
Reference in a new issue