2020-04-13 15:17:54 +00:00
|
|
|
package cutil
|
|
|
|
|
|
|
|
/*
|
|
|
|
#include <stdlib.h>
|
|
|
|
*/
|
|
|
|
import "C"
|
|
|
|
|
|
|
|
import (
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CommandOutput can be used to manage the outputs of ceph's *_command
|
|
|
|
// functions.
|
|
|
|
type CommandOutput struct {
|
2020-04-23 15:10:15 +00:00
|
|
|
free FreeFunc
|
2020-04-13 15:17:54 +00:00
|
|
|
outBuf *C.char
|
|
|
|
outBufLen C.size_t
|
|
|
|
outs *C.char
|
|
|
|
outsLen C.size_t
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewCommandOutput returns an empty CommandOutput. The pointers that
|
|
|
|
// a CommandOutput provides can be used to get the results of ceph's
|
|
|
|
// *_command functions.
|
|
|
|
func NewCommandOutput() *CommandOutput {
|
2020-04-23 15:10:15 +00:00
|
|
|
return &CommandOutput{
|
|
|
|
free: free,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetFreeFunc sets the function used to free memory held by CommandOutput.
|
|
|
|
// Not all uses of CommandOutput expect to use the basic C.free function
|
|
|
|
// and either require or prefer the use of a custom deallocation function.
|
|
|
|
// Use SetFreeFunc to change the free function and return the modified
|
|
|
|
// CommandOutput object.
|
|
|
|
func (co *CommandOutput) SetFreeFunc(f FreeFunc) *CommandOutput {
|
|
|
|
co.free = f
|
|
|
|
return co
|
2020-04-13 15:17:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Free any C memory tracked by this object.
|
|
|
|
func (co *CommandOutput) Free() {
|
|
|
|
if co.outBuf != nil {
|
2020-04-23 15:10:15 +00:00
|
|
|
co.free(unsafe.Pointer(co.outBuf))
|
2020-04-13 15:17:54 +00:00
|
|
|
}
|
|
|
|
if co.outs != nil {
|
2020-04-23 15:10:15 +00:00
|
|
|
co.free(unsafe.Pointer(co.outs))
|
2020-04-13 15:17:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutBuf returns an unsafe wrapper around a pointer to a `char*`.
|
|
|
|
func (co *CommandOutput) OutBuf() CharPtrPtr {
|
|
|
|
return CharPtrPtr(&co.outBuf)
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutBufLen returns an unsafe wrapper around a pointer to a size_t.
|
|
|
|
func (co *CommandOutput) OutBufLen() SizeTPtr {
|
|
|
|
return SizeTPtr(&co.outBufLen)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Outs returns an unsafe wrapper around a pointer to a `char*`.
|
|
|
|
func (co *CommandOutput) Outs() CharPtrPtr {
|
|
|
|
return CharPtrPtr(&co.outs)
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutsLen returns an unsafe wrapper around a pointer to a size_t.
|
|
|
|
func (co *CommandOutput) OutsLen() SizeTPtr {
|
|
|
|
return SizeTPtr(&co.outsLen)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GoValues returns native go values converted from the internal C-language
|
|
|
|
// values tracked by this object.
|
|
|
|
func (co *CommandOutput) GoValues() (buf []byte, status string) {
|
|
|
|
if co.outBufLen > 0 {
|
|
|
|
buf = C.GoBytes(unsafe.Pointer(co.outBuf), C.int(co.outBufLen))
|
|
|
|
}
|
|
|
|
if co.outsLen > 0 {
|
|
|
|
status = C.GoStringN(co.outs, C.int(co.outsLen))
|
|
|
|
}
|
|
|
|
return buf, status
|
|
|
|
}
|
|
|
|
|
|
|
|
// testSetString is only used by the unit tests for this file.
|
|
|
|
// It is located here due to the restriction on having import "C" in
|
|
|
|
// go test files. :-(
|
|
|
|
// It mimics a C function that takes a pointer to a
|
|
|
|
// string and length and allocates memory and sets the pointers
|
|
|
|
// to the new string and its length.
|
|
|
|
func testSetString(strp CharPtrPtr, lenp SizeTPtr, s string) {
|
|
|
|
sp := (**C.char)(strp)
|
|
|
|
lp := (*C.size_t)(lenp)
|
|
|
|
*sp = C.CString(s)
|
|
|
|
*lp = C.size_t(len(s))
|
|
|
|
}
|
2020-04-23 15:10:15 +00:00
|
|
|
|
|
|
|
// free wraps C.free.
|
|
|
|
// Required for unit tests that may not use cgo directly.
|
|
|
|
func free(p unsafe.Pointer) {
|
|
|
|
C.free(p)
|
|
|
|
}
|