Add option to use root as owner of files/dirs

This commit is contained in:
Alexander Neumann
2015-07-26 20:41:29 +02:00
parent bdcb2175c5
commit dde0fd8421
6 changed files with 59 additions and 36 deletions

View File

@@ -16,13 +16,14 @@ var _ = fs.HandleReadDirAller(&dir{})
var _ = fs.NodeStringLookuper(&dir{})
type dir struct {
repo *repository.Repository
items map[string]*restic.Node
inode uint64
node *restic.Node
repo *repository.Repository
items map[string]*restic.Node
inode uint64
node *restic.Node
ownerIsRoot bool
}
func newDir(repo *repository.Repository, node *restic.Node) (*dir, error) {
func newDir(repo *repository.Repository, node *restic.Node, ownerIsRoot bool) (*dir, error) {
tree, err := restic.LoadTree(repo, *node.Subtree)
if err != nil {
return nil, err
@@ -33,14 +34,15 @@ func newDir(repo *repository.Repository, node *restic.Node) (*dir, error) {
}
return &dir{
repo: repo,
node: node,
items: items,
inode: node.Inode,
repo: repo,
node: node,
items: items,
inode: node.Inode,
ownerIsRoot: ownerIsRoot,
}, nil
}
func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId) (*dir, error) {
func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId, ownerIsRoot bool) (*dir, error) {
tree, err := restic.LoadTree(repo, *snapshot.Tree)
if err != nil {
return nil, err
@@ -60,8 +62,9 @@ func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId) (*
ChangeTime: snapshot.Time,
Mode: os.ModeDir | 0555,
},
items: items,
inode: inodeFromBackendId(snapshot.ID),
items: items,
inode: inodeFromBackendId(snapshot.ID),
ownerIsRoot: ownerIsRoot,
}, nil
}
@@ -69,8 +72,10 @@ func (d *dir) Attr(ctx context.Context, a *fuse.Attr) error {
a.Inode = d.inode
a.Mode = os.ModeDir | d.node.Mode
a.Uid = d.node.UID
a.Gid = d.node.GID
if !d.ownerIsRoot {
a.Uid = d.node.UID
a.Gid = d.node.GID
}
a.Atime = d.node.AccessTime
a.Ctime = d.node.ChangeTime
a.Mtime = d.node.ModTime
@@ -108,11 +113,11 @@ func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
}
switch node.Type {
case "dir":
return newDir(d.repo, node)
return newDir(d.repo, node, d.ownerIsRoot)
case "file":
return newFile(d.repo, node)
return newFile(d.repo, node, d.ownerIsRoot)
case "symlink":
return newLink(d.repo, node)
return newLink(d.repo, node, d.ownerIsRoot)
default:
return nil, fuse.ENOENT
}