2016-09-18 15:10:33 +00:00
|
|
|
// +build !windows
|
|
|
|
|
|
|
|
package fs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"syscall"
|
|
|
|
|
2017-07-23 12:21:03 +00:00
|
|
|
"github.com/restic/restic/internal/errors"
|
2016-09-18 15:10:33 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// DeviceID extracts the device ID from an os.FileInfo object by casting it
|
|
|
|
// to syscall.Stat_t
|
|
|
|
func DeviceID(fi os.FileInfo) (deviceID uint64, err error) {
|
2016-11-05 10:52:53 +00:00
|
|
|
if fi == nil {
|
|
|
|
return 0, errors.New("unable to determine device: fi is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if fi.Sys() == nil {
|
|
|
|
return 0, errors.New("unable to determine device: fi.Sys() is nil")
|
|
|
|
}
|
|
|
|
|
2016-09-18 15:10:33 +00:00
|
|
|
if st, ok := fi.Sys().(*syscall.Stat_t); ok {
|
|
|
|
// st.Dev is uint32 on Darwin and uint64 on Linux. Just cast
|
|
|
|
// everything to uint64.
|
|
|
|
return uint64(st.Dev), nil
|
|
|
|
}
|
2016-11-05 10:52:53 +00:00
|
|
|
|
2016-09-18 15:10:33 +00:00
|
|
|
return 0, errors.New("Could not cast to syscall.Stat_t")
|
|
|
|
}
|