go-ceph/cephfs/cephfs.go
John Mulligan ce5d3ef04d cephfs: remove use of logging in package
After discussion we decided to entirely drop logging from the library.
Future users should rely instead of the error types and values the
function calls return.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
2019-12-13 15:17:27 +01:00

159 lines
3.4 KiB
Go

package cephfs
/*
#cgo LDFLAGS: -lcephfs
#cgo CPPFLAGS: -D_FILE_OFFSET_BITS=64
#include <stdlib.h>
#include <cephfs/libcephfs.h>
*/
import "C"
import (
"fmt"
"math"
"syscall"
"unsafe"
)
type cephError int
func (e cephError) Error() string {
if e == 0 {
return fmt.Sprintf("cephfs: no error given")
}
err := syscall.Errno(uint(math.Abs(float64(e))))
return fmt.Sprintf("cephfs: ret=(%d) %v", e, err)
}
// MountInfo exports ceph's ceph_mount_info from libcephfs.cc
type MountInfo struct {
mount *C.struct_ceph_mount_info
}
// CreateMount creates a mount handle for interacting with Ceph.
func CreateMount() (*MountInfo, error) {
mount := &MountInfo{}
ret := C.ceph_create(&mount.mount, nil)
if ret != 0 {
return nil, cephError(ret)
}
return mount, nil
}
// ReadDefaultConfigFile loads the ceph configuration from the specified config file.
func (mount *MountInfo) ReadDefaultConfigFile() error {
ret := C.ceph_conf_read_file(mount.mount, nil)
if ret != 0 {
return cephError(ret)
}
return nil
}
// Mount mounts the mount handle.
func (mount *MountInfo) Mount() error {
ret := C.ceph_mount(mount.mount, nil)
if ret != 0 {
return cephError(ret)
}
return nil
}
// Unmount unmounts the mount handle.
func (mount *MountInfo) Unmount() error {
ret := C.ceph_unmount(mount.mount)
if ret != 0 {
return cephError(ret)
}
return nil
}
// Release destroys the mount handle.
func (mount *MountInfo) Release() error {
ret := C.ceph_release(mount.mount)
if ret != 0 {
return cephError(ret)
}
return nil
}
// SyncFs synchronizes all filesystem data to persistent media.
func (mount *MountInfo) SyncFs() error {
ret := C.ceph_sync_fs(mount.mount)
if ret != 0 {
return cephError(ret)
}
return nil
}
// CurrentDir gets the current working directory.
func (mount *MountInfo) CurrentDir() string {
cDir := C.ceph_getcwd(mount.mount)
return C.GoString(cDir)
}
// ChangeDir changes the current working directory.
func (mount *MountInfo) ChangeDir(path string) error {
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
ret := C.ceph_chdir(mount.mount, cPath)
if ret != 0 {
return cephError(ret)
}
return nil
}
// MakeDir creates a directory.
func (mount *MountInfo) MakeDir(path string, mode uint32) error {
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
ret := C.ceph_mkdir(mount.mount, cPath, C.mode_t(mode))
if ret != 0 {
return cephError(ret)
}
return nil
}
// RemoveDir removes a directory.
func (mount *MountInfo) RemoveDir(path string) error {
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
ret := C.ceph_rmdir(mount.mount, cPath)
if ret != 0 {
return cephError(ret)
}
return nil
}
// Chmod changes the mode bits (permissions) of a file/directory.
func (mount *MountInfo) Chmod(path string, mode uint32) error {
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
ret := C.ceph_chmod(mount.mount, cPath, C.mode_t(mode))
if ret != 0 {
return cephError(ret)
}
return nil
}
// Chown changes the ownership of a file/directory.
func (mount *MountInfo) Chown(path string, user uint32, group uint32) error {
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
ret := C.ceph_chown(mount.mount, cPath, C.int(user), C.int(group))
if ret != 0 {
return cephError(ret)
}
return nil
}
// IsMounted checks mount status.
func (mount *MountInfo) IsMounted() bool {
ret := C.ceph_is_mounted(mount.mount)
return ret == 1
}