mirror of https://github.com/ceph/go-ceph
78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package cephfs
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lcephfs
|
|
#cgo CPPFLAGS: -D_FILE_OFFSET_BITS=64
|
|
#include <cephfs/libcephfs.h>
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"runtime"
|
|
"unsafe"
|
|
|
|
"github.com/ceph/go-ceph/internal/log"
|
|
)
|
|
|
|
// UserPerm types may be used to get or change the credentials used by the
|
|
// connection or some operations.
|
|
type UserPerm struct {
|
|
userPerm *C.UserPerm
|
|
|
|
// cache create-time params
|
|
managed bool // if set, the userPerm was created by go-ceph
|
|
uid C.uid_t
|
|
gid C.gid_t
|
|
gidList []C.gid_t
|
|
}
|
|
|
|
// NewUserPerm creates a UserPerm pointer and the underlying ceph resources.
|
|
//
|
|
// Implements:
|
|
// UserPerm *ceph_userperm_new(uid_t uid, gid_t gid, int ngids, gid_t *gidlist);
|
|
func NewUserPerm(uid, gid int, gidlist []int) *UserPerm {
|
|
// the C code does not copy the content of the gid list so we keep the
|
|
// inputs stashed in the go type. For completeness we stash everything.
|
|
p := &UserPerm{
|
|
managed: true,
|
|
uid: C.uid_t(uid),
|
|
gid: C.gid_t(gid),
|
|
gidList: make([]C.gid_t, len(gidlist)),
|
|
}
|
|
var cgids *C.gid_t
|
|
if len(p.gidList) > 0 {
|
|
for i, gid := range gidlist {
|
|
p.gidList[i] = C.gid_t(gid)
|
|
}
|
|
cgids = (*C.gid_t)(unsafe.Pointer(&p.gidList[0]))
|
|
}
|
|
p.userPerm = C.ceph_userperm_new(
|
|
p.uid, p.gid, C.int(len(p.gidList)), cgids)
|
|
// if the go object is unreachable, we would like to free the c-memory
|
|
// since this has no other resources than memory associated with it.
|
|
// This is only valid for UserPerm objects created by new, and thus have
|
|
// the managed var set.
|
|
runtime.SetFinalizer(p, destroyUserPerm)
|
|
return p
|
|
}
|
|
|
|
// Destroy will explicitly free ceph resources associated with the UserPerm.
|
|
//
|
|
// Implements:
|
|
// void ceph_userperm_destroy(UserPerm *perm);
|
|
func (p *UserPerm) Destroy() {
|
|
if p.userPerm == nil || !p.managed {
|
|
return
|
|
}
|
|
C.ceph_userperm_destroy(p.userPerm)
|
|
p.userPerm = nil
|
|
p.gidList = nil
|
|
}
|
|
|
|
func destroyUserPerm(p *UserPerm) {
|
|
if p.userPerm != nil && p.managed {
|
|
log.Warnf("unreachable UserPerm object has not been destroyed. Cleaning up.")
|
|
}
|
|
p.Destroy()
|
|
}
|