Я играю с упаковкой FUSE с Go.Однако я застрял с тем, как бороться с struct fuse_operations
.Похоже, я не могу раскрыть структуру операций, объявив type Operations C.struct_fuse_operations
, так как члены являются строчными, и мои источники с чистым Go должны были бы в любом случае использовать C-hackery для установки элементов.Моя первая ошибка в этом случае - «не могу установить getattr» в том, что похоже на Go, эквивалентный конструктору копирования по умолчанию.Моя следующая попытка - открыть интерфейс, который ожидает GetAttr
, ReadLink
и т. Д., А затем сгенерировать C.struct_fuse_operations
и привязать указатели функций к замыканиям, которые вызывают данный интерфейс.
получил (объяснение продолжается после кода):
package fuse
// #include <fuse.h>
// #include <stdlib.h>
import "C"
import (
//"fmt"
"os"
"unsafe"
)
type Operations interface {
GetAttr(string, *os.FileInfo) int
}
func Main(args []string, ops Operations) int {
argv := make([]*C.char, len(args) + 1)
for i, s := range args {
p := C.CString(s)
defer C.free(unsafe.Pointer(p))
argv[i] = p
}
cop := new(C.struct_fuse_operations)
cop.getattr = func(*C.char, *C.struct_stat) int {}
argc := C.int(len(args))
return int(C.fuse_main_real(argc, &argv[0], cop, C.size_t(unsafe.Sizeof(cop)), nil))
}
package main
import (
"fmt"
"fuse"
"os"
)
type CpfsOps struct {
a int
}
func (me *CpfsOps) GetAttr(string, *os.FileInfo) int {
return -1;
}
func main() {
fmt.Println(os.Args)
ops := &CpfsOps{}
fmt.Println("fuse main returned", fuse.Main(os.Args, ops))
}
Это дает следующую ошибку:
fuse.go:21[fuse.cgo1.go:23]: cannot use func literal (type func(*_Ctype_char, *_Ctype_struct_stat) int) as type *[0]uint8 in assignment
Я не уверен, что передать этим членам C.struct_fuse_operations
, и яЯ видел упоминание в нескольких местах, что невозможно перезвонить из Си в код Go.
Если это возможно, что мне делать?Как я могу предоставить значения по умолчанию для интерфейсных функций, которые действуют так, как если бы соответствующий элемент C.struct_fuse_operations
был установлен в NULL?