44 lines
876 B
Go
44 lines
876 B
Go
|
package nametransform
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
// A simple one-entry DirIV cache
|
||
|
type dirIVCache struct {
|
||
|
// Invalidated?
|
||
|
cleared bool
|
||
|
// The DirIV
|
||
|
iv []byte
|
||
|
// Directory the DirIV belongs to
|
||
|
dir string
|
||
|
// Ecrypted version of "dir"
|
||
|
translatedDir string
|
||
|
// Synchronisation
|
||
|
lock sync.RWMutex
|
||
|
}
|
||
|
|
||
|
// lookup - fetch entry for "dir" from the cache
|
||
|
func (c *dirIVCache) lookup(dir string) (bool, []byte, string) {
|
||
|
c.lock.RLock()
|
||
|
defer c.lock.RUnlock()
|
||
|
if !c.cleared && c.dir == dir {
|
||
|
return true, c.iv, c.translatedDir
|
||
|
}
|
||
|
return false, nil, ""
|
||
|
}
|
||
|
|
||
|
// store - write entry for "dir" into the caches
|
||
|
func (c *dirIVCache) store(dir string, iv []byte, translatedDir string) {
|
||
|
c.lock.Lock()
|
||
|
defer c.lock.Unlock()
|
||
|
c.cleared = false
|
||
|
c.iv = iv
|
||
|
c.dir = dir
|
||
|
c.translatedDir = translatedDir
|
||
|
}
|
||
|
|
||
|
func (c *dirIVCache) Clear() {
|
||
|
c.lock.Lock()
|
||
|
defer c.lock.Unlock()
|
||
|
c.cleared = true
|
||
|
}
|