From ab8e6a82aba9eef49599fe99fe00abfceb86055d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 6 Mar 2023 15:37:15 +0100 Subject: [PATCH] lib/api: Expose `blocksHash` in file info (#8810) This adds the BlocksHash field from the FileInfo to our API output. It can be useful for debugging, or for external tools. I'm intentionally leaving it as an opaque base64 string because no meaning should be derived from it: it's just a string. --- lib/api/api.go | 1 + lib/db/structs.go | 4 ++++ lib/protocol/bep_extensions.go | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/lib/api/api.go b/lib/api/api.go index 456123fdc..6f9451dcc 100644 --- a/lib/api/api.go +++ b/lib/api/api.go @@ -1828,6 +1828,7 @@ func fileIntfJSONMap(f protocol.FileIntf) map[string]interface{} { "localFlags": f.FileLocalFlags(), "platform": f.PlatformData(), "inodeChange": f.InodeChangeTime(), + "blocksHash": f.FileBlocksHash(), } if f.HasPermissionBits() { out["permissions"] = fmt.Sprintf("%#o", f.FilePermissions()) diff --git a/lib/db/structs.go b/lib/db/structs.go index daa514fab..8c3c1f39a 100644 --- a/lib/db/structs.go +++ b/lib/db/structs.go @@ -133,6 +133,10 @@ func (f FileInfoTruncated) InodeChangeTime() time.Time { return time.Unix(0, f.InodeChangeNs) } +func (f FileInfoTruncated) FileBlocksHash() []byte { + return f.BlocksHash +} + func (f FileInfoTruncated) ConvertToIgnoredFileInfo() protocol.FileInfo { file := f.copyToFileInfo() file.SetIgnored() diff --git a/lib/protocol/bep_extensions.go b/lib/protocol/bep_extensions.go index 2290f2cce..4ee23adc5 100644 --- a/lib/protocol/bep_extensions.go +++ b/lib/protocol/bep_extensions.go @@ -46,6 +46,7 @@ type FileIntf interface { ModTime() time.Time PlatformData() PlatformData InodeChangeTime() time.Time + FileBlocksHash() []byte } func (Hello) Magic() uint32 { @@ -170,6 +171,10 @@ func (f FileInfo) InodeChangeTime() time.Time { return time.Unix(0, f.InodeChangeNs) } +func (f FileInfo) FileBlocksHash() []byte { + return f.BlocksHash +} + // WinsConflict returns true if "f" is the one to choose when it is in // conflict with "other". func WinsConflict(f, other FileIntf) bool {