FUSE を Go でラッピングして遊んでいます。しかし、私は対処方法に行き詰まっていますstruct fuse_operations
。type Operations C.struct_fuse_operations
メンバーが小文字であるため、宣言することによって操作構造体を公開することはできないようです。私の純粋な Go ソースは、とにかくメンバーを設定するために C-hackery を使用する必要があります。この場合の最初のエラーは、デフォルトのコピー コンストラクターに相当するように見える "getattr を設定できません" です。私の次の試みは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]: func リテラル (型 func(*_Ctype_char, *_Ctype_struct_stat) int) を代入で型 *[0]uint8 として使用できません
のこれらのメンバーに何を渡せばよいかわかりませんC.struct_fuse_operations
。いくつかの場所で、C から Go コードに戻すことはできないという言及を見てきました。
可能であれば、どうすればよいですか?C.struct_fuse_operations
対応するメンバーが NULL に設定されているかのように機能するインターフェイス関数の "既定" 値を指定するにはどうすればよいですか?