blob: ed97813acfa367a4c499a5ebb33d49d313b01e7c [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package namespace
import (
"v.io/v23"
"v.io/v23/context"
"v.io/v23/naming"
"v.io/v23/options"
"v.io/v23/rpc"
"v.io/v23/security/access"
"v.io/x/lib/vlog"
)
// setPermsInMountTable sets the Permissions in a single server.
func setPermsInMountTable(ctx *context.T, client rpc.Client, name string, perms access.Permissions, version, id string, opts []rpc.CallOpt) (s status) {
s.id = id
ctx, _ = context.WithTimeout(ctx, callTimeout)
s.err = client.Call(ctx, name, "SetPermissions", []interface{}{perms, version}, nil, append(opts, options.NoResolve{})...)
return
}
func (ns *namespace) SetPermissions(ctx *context.T, name string, perms access.Permissions, version string, opts ...naming.NamespaceOpt) error {
defer vlog.LogCall()()
client := v23.GetClient(ctx)
// Apply to all mount tables implementing the name.
f := func(ctx *context.T, mt, id string) status {
return setPermsInMountTable(ctx, client, mt, perms, version, id, getCallOpts(opts))
}
err := ns.dispatch(ctx, name, f, opts)
vlog.VI(1).Infof("SetPermissions(%s, %v, %s) -> %v", name, perms, version, err)
return err
}
// GetPermissions gets Permissions from a mount table.
func (ns *namespace) GetPermissions(ctx *context.T, name string, opts ...naming.NamespaceOpt) (perms access.Permissions, version string, err error) {
defer vlog.LogCall()()
client := v23.GetClient(ctx)
// Resolve to all the mount tables implementing name.
me, rerr := ns.ResolveToMountTable(ctx, name, opts...)
if rerr != nil {
err = rerr
return
}
mts := me.Names()
call, serr := ns.parallelStartCall(ctx, client, mts, "GetPermissions", []interface{}{}, getCallOpts(opts))
if serr != nil {
err = serr
return
}
err = call.Finish(&perms, &version)
return
}