mirror of
https://github.com/ceph/go-ceph
synced 2024-12-27 00:32:08 +00:00
e2a78eec02
The *_command functions in librados and libcephfs document the use of specific free functions for data allocated. These functions are currently just wrappers around C's free() function. However, to be more strictly compliant this change adds a free-function callback to the CommandOutput type and the specific free functions are now used outside the unit tests. Signed-off-by: John Mulligan <jmulligan@redhat.com>
130 lines
4.0 KiB
Go
130 lines
4.0 KiB
Go
package rados
|
|
|
|
// #cgo LDFLAGS: -lrados
|
|
// #include <stdlib.h>
|
|
// #include <rados/librados.h>
|
|
import "C"
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"github.com/ceph/go-ceph/internal/cutil"
|
|
)
|
|
|
|
func radosBufferFree(p unsafe.Pointer) {
|
|
C.rados_buffer_free((*C.char)(p))
|
|
}
|
|
|
|
// MonCommand sends a command to one of the monitors
|
|
func (c *Conn) MonCommand(args []byte) ([]byte, string, error) {
|
|
return c.monCommand(args, nil)
|
|
}
|
|
|
|
// MonCommandWithInputBuffer sends a command to one of the monitors, with an input buffer
|
|
func (c *Conn) MonCommandWithInputBuffer(args, inputBuffer []byte) ([]byte, string, error) {
|
|
return c.monCommand(args, inputBuffer)
|
|
}
|
|
|
|
func (c *Conn) monCommand(args, inputBuffer []byte) ([]byte, string, error) {
|
|
ci := cutil.NewCommandInput([][]byte{args}, inputBuffer)
|
|
defer ci.Free()
|
|
co := cutil.NewCommandOutput().SetFreeFunc(radosBufferFree)
|
|
defer co.Free()
|
|
|
|
ret := C.rados_mon_command(
|
|
c.cluster,
|
|
(**C.char)(ci.Cmd()),
|
|
C.size_t(ci.CmdLen()),
|
|
(*C.char)(ci.InBuf()),
|
|
C.size_t(ci.InBufLen()),
|
|
(**C.char)(co.OutBuf()),
|
|
(*C.size_t)(co.OutBufLen()),
|
|
(**C.char)(co.Outs()),
|
|
(*C.size_t)(co.OutsLen()))
|
|
buf, status := co.GoValues()
|
|
return buf, status, getError(ret)
|
|
}
|
|
|
|
// PGCommand sends a command to one of the PGs
|
|
//
|
|
// Implements:
|
|
// int rados_pg_command(rados_t cluster, const char *pgstr,
|
|
// const char **cmd, size_t cmdlen,
|
|
// const char *inbuf, size_t inbuflen,
|
|
// char **outbuf, size_t *outbuflen,
|
|
// char **outs, size_t *outslen);
|
|
func (c *Conn) PGCommand(pgid []byte, args [][]byte) ([]byte, string, error) {
|
|
return c.pgCommand(pgid, args, nil)
|
|
}
|
|
|
|
// PGCommandWithInputBuffer sends a command to one of the PGs, with an input buffer
|
|
//
|
|
// Implements:
|
|
// int rados_pg_command(rados_t cluster, const char *pgstr,
|
|
// const char **cmd, size_t cmdlen,
|
|
// const char *inbuf, size_t inbuflen,
|
|
// char **outbuf, size_t *outbuflen,
|
|
// char **outs, size_t *outslen);
|
|
func (c *Conn) PGCommandWithInputBuffer(pgid []byte, args [][]byte, inputBuffer []byte) ([]byte, string, error) {
|
|
return c.pgCommand(pgid, args, inputBuffer)
|
|
}
|
|
|
|
func (c *Conn) pgCommand(pgid []byte, args [][]byte, inputBuffer []byte) ([]byte, string, error) {
|
|
name := C.CString(string(pgid))
|
|
defer C.free(unsafe.Pointer(name))
|
|
ci := cutil.NewCommandInput(args, inputBuffer)
|
|
defer ci.Free()
|
|
co := cutil.NewCommandOutput().SetFreeFunc(radosBufferFree)
|
|
defer co.Free()
|
|
|
|
ret := C.rados_pg_command(
|
|
c.cluster,
|
|
name,
|
|
(**C.char)(ci.Cmd()),
|
|
C.size_t(ci.CmdLen()),
|
|
(*C.char)(ci.InBuf()),
|
|
C.size_t(ci.InBufLen()),
|
|
(**C.char)(co.OutBuf()),
|
|
(*C.size_t)(co.OutBufLen()),
|
|
(**C.char)(co.Outs()),
|
|
(*C.size_t)(co.OutsLen()))
|
|
buf, status := co.GoValues()
|
|
return buf, status, getError(ret)
|
|
}
|
|
|
|
// MgrCommand sends a command to a ceph-mgr.
|
|
func (c *Conn) MgrCommand(args [][]byte) ([]byte, string, error) {
|
|
return c.mgrCommand(args, nil)
|
|
}
|
|
|
|
// MgrCommandWithInputBuffer sends a command, with an input buffer, to a ceph-mgr.
|
|
func (c *Conn) MgrCommandWithInputBuffer(args [][]byte, inputBuffer []byte) ([]byte, string, error) {
|
|
return c.mgrCommand(args, inputBuffer)
|
|
}
|
|
|
|
// Implements:
|
|
// int rados_mgr_command(rados_t cluster, const char **cmd,
|
|
// size_t cmdlen, const char *inbuf,
|
|
// size_t inbuflen, char **outbuf,
|
|
// size_t *outbuflen, char **outs,
|
|
// size_t *outslen);
|
|
func (c *Conn) mgrCommand(args [][]byte, inputBuffer []byte) ([]byte, string, error) {
|
|
ci := cutil.NewCommandInput(args, inputBuffer)
|
|
defer ci.Free()
|
|
co := cutil.NewCommandOutput().SetFreeFunc(radosBufferFree)
|
|
defer co.Free()
|
|
|
|
ret := C.rados_mgr_command(
|
|
c.cluster,
|
|
(**C.char)(ci.Cmd()),
|
|
C.size_t(ci.CmdLen()),
|
|
(*C.char)(ci.InBuf()),
|
|
C.size_t(ci.InBufLen()),
|
|
(**C.char)(co.OutBuf()),
|
|
(*C.size_t)(co.OutBufLen()),
|
|
(**C.char)(co.Outs()),
|
|
(*C.size_t)(co.OutsLen()))
|
|
buf, status := co.GoValues()
|
|
return buf, status, getError(ret)
|
|
}
|