mirror of
https://github.com/ceph/go-ceph
synced 2024-12-24 23:22:33 +00:00
e40744fdf6
Now we have sufficient boilerplate in our code for interacting with various types and ceph calls with similar needs we establish a new internal package, "cutil" (C utilities). Note that many of the return types are wrapped. This is due to the limits placed on us by cgo. Despite the irritating limitations Go places on "exporting" C types it still ought to help in the long run for patterns that are very common or patterns that are subtle and we want to write specific tests for. Signed-off-by: John Mulligan <jmulligan@redhat.com>
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package cutil
|
|
|
|
/*
|
|
#include <stdlib.h>
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
// CommandInput can be used to manage the input to ceph's *_command functions.
|
|
type CommandInput struct {
|
|
cmd []*C.char
|
|
inbuf []byte
|
|
}
|
|
|
|
// NewCommandInput creates C-level pointers from go byte buffers suitable
|
|
// for passing off to ceph's *_command functions.
|
|
func NewCommandInput(cmd [][]byte, inputBuffer []byte) *CommandInput {
|
|
ci := &CommandInput{
|
|
cmd: make([]*C.char, len(cmd)),
|
|
inbuf: inputBuffer,
|
|
}
|
|
for i := range cmd {
|
|
ci.cmd[i] = C.CString(string(cmd[i]))
|
|
}
|
|
return ci
|
|
}
|
|
|
|
// Free any C memory managed by this CommandInput.
|
|
func (ci *CommandInput) Free() {
|
|
for i := range ci.cmd {
|
|
C.free(unsafe.Pointer(ci.cmd[i]))
|
|
}
|
|
ci.cmd = nil
|
|
}
|
|
|
|
// Cmd returns an unsafe wrapper around an array of C-strings.
|
|
func (ci *CommandInput) Cmd() CharPtrPtr {
|
|
ptr := &ci.cmd[0]
|
|
return CharPtrPtr(ptr)
|
|
}
|
|
|
|
// CmdLen returns the length of the array of C-strings returned by
|
|
// Cmd.
|
|
func (ci *CommandInput) CmdLen() SizeT {
|
|
return SizeT(len(ci.cmd))
|
|
}
|
|
|
|
// InBuf returns an unsafe wrapper to a C char*.
|
|
func (ci *CommandInput) InBuf() CharPtr {
|
|
if len(ci.inbuf) == 0 {
|
|
return nil
|
|
}
|
|
return CharPtr(&ci.inbuf[0])
|
|
}
|
|
|
|
// InBufLen returns the length of the buffer returned by InBuf.
|
|
func (ci *CommandInput) InBufLen() SizeT {
|
|
return SizeT(len(ci.inbuf))
|
|
}
|