mirror of
https://github.com/jkl1337/duplicacy.git
synced 2026-01-02 03:34:39 -06:00
Support backup of sockets
This only works on Linux. Darwin does not allow mknod of a socket. Have not tested BSD.
This commit is contained in:
@@ -516,7 +516,7 @@ func (entry *Entry) IsLink() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (entry *Entry) IsSpecial() bool {
|
func (entry *Entry) IsSpecial() bool {
|
||||||
return entry.Mode&uint32(os.ModeNamedPipe|os.ModeDevice|os.ModeCharDevice) != 0
|
return entry.Mode&uint32(os.ModeNamedPipe|os.ModeDevice|os.ModeCharDevice|os.ModeSocket) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (entry *Entry) IsFileOrSpecial() bool {
|
func (entry *Entry) IsFileOrSpecial() bool {
|
||||||
@@ -807,9 +807,6 @@ func ListEntries(top string, path string, patterns []string, nobackupFile string
|
|||||||
if f.Name() == DUPLICACY_DIRECTORY {
|
if f.Name() == DUPLICACY_DIRECTORY {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if f.Mode()&os.ModeSocket != 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
entry := CreateEntryFromFileInfo(f, normalizedPath)
|
entry := CreateEntryFromFileInfo(f, normalizedPath)
|
||||||
if len(patterns) > 0 && !MatchPath(entry.Path, patterns) {
|
if len(patterns) > 0 && !MatchPath(entry.Path, patterns) {
|
||||||
|
|||||||
@@ -92,3 +92,18 @@ func (entry *Entry) RestoreEarlyDirFlags(path string) error {
|
|||||||
func (entry *Entry) RestoreEarlyFileFlags(f *os.File) error {
|
func (entry *Entry) RestoreEarlyFileFlags(f *os.File) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (entry *Entry) RestoreSpecial(fullPath string) error {
|
||||||
|
mode := entry.Mode & uint32(fileModeMask)
|
||||||
|
|
||||||
|
if entry.Mode&uint32(os.ModeNamedPipe) != 0 {
|
||||||
|
mode |= syscall.S_IFIFO
|
||||||
|
} else if entry.Mode&uint32(os.ModeCharDevice) != 0 {
|
||||||
|
mode |= syscall.S_IFCHR
|
||||||
|
} else if entry.Mode&uint32(os.ModeDevice) != 0 {
|
||||||
|
mode |= syscall.S_IFBLK
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return syscall.Mknod(fullPath, mode, int(entry.GetRdev()))
|
||||||
|
}
|
||||||
|
|||||||
@@ -219,6 +219,23 @@ func (entry *Entry) restoreLateFileFlags(f *os.File) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (entry *Entry) RestoreSpecial(fullPath string) error {
|
||||||
|
mode := entry.Mode & uint32(fileModeMask)
|
||||||
|
|
||||||
|
if entry.Mode&uint32(os.ModeNamedPipe) != 0 {
|
||||||
|
mode |= syscall.S_IFIFO
|
||||||
|
} else if entry.Mode&uint32(os.ModeCharDevice) != 0 {
|
||||||
|
mode |= syscall.S_IFCHR
|
||||||
|
} else if entry.Mode&uint32(os.ModeDevice) != 0 {
|
||||||
|
mode |= syscall.S_IFBLK
|
||||||
|
} else if entry.Mode&uint32(os.ModeSocket) != 0 {
|
||||||
|
mode |= syscall.S_IFSOCK
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return syscall.Mknod(fullPath, mode, int(entry.GetRdev()))
|
||||||
|
}
|
||||||
|
|
||||||
func excludedByAttribute(attributes map[string][]byte) bool {
|
func excludedByAttribute(attributes map[string][]byte) bool {
|
||||||
_, ok := attributes["user.duplicacy_exclude"]
|
_, ok := attributes["user.duplicacy_exclude"]
|
||||||
return ok
|
return ok
|
||||||
|
|||||||
@@ -65,21 +65,6 @@ func (entry *Entry) GetRdev() uint64 {
|
|||||||
return uint64(entry.StartChunk) | uint64(entry.StartOffset)<<32
|
return uint64(entry.StartChunk) | uint64(entry.StartOffset)<<32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (entry *Entry) RestoreSpecial(fullPath string) error {
|
|
||||||
mode := entry.Mode & uint32(fileModeMask)
|
|
||||||
|
|
||||||
if entry.Mode&uint32(os.ModeNamedPipe) != 0 {
|
|
||||||
mode |= syscall.S_IFIFO
|
|
||||||
} else if entry.Mode&uint32(os.ModeCharDevice) != 0 {
|
|
||||||
mode |= syscall.S_IFCHR
|
|
||||||
} else if entry.Mode&uint32(os.ModeDevice) != 0 {
|
|
||||||
mode |= syscall.S_IFBLK
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return syscall.Mknod(fullPath, mode, int(entry.GetRdev()))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) IsSameSpecial(fileInfo os.FileInfo) bool {
|
func (entry *Entry) IsSameSpecial(fileInfo os.FileInfo) bool {
|
||||||
stat := fileInfo.Sys().(*syscall.Stat_t)
|
stat := fileInfo.Sys().(*syscall.Stat_t)
|
||||||
if stat == nil {
|
if stat == nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user