FUSEをGoでラップして遊んでいます。しかし、私はstruct fuse_operations
に対処する方法に立ち往生してきました。 type Operations C.struct_fuse_operations
をメンバーが小文字であると宣言してオペレーション構造体を公開しているようには見えないし、純粋なGoのソースはC-hackeryを使用してメンバーを設定する必要があります。この場合の私の最初のエラーは、デフォルトのコピーコンストラクタのGoに相当するものの中で、 "getattrを設定できません"です。私の次の試みは、GetAttr
、ReadLink
などを想定したインタフェースを公開してからC.struct_fuse_operations
を生成し、与えられたインタフェースを呼び出すクロージャに関数ポインタをバインドします。FUSEをGoから折り返す
これは(説明はコードの後に続けて)私が持っているものである:これは、次のエラー与え
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
、そして私はいくつかの場所で言及したが、CからGoコードに戻ることはできません。
可能であれば、どうすればよいですか?あたかも対応するC.struct_fuse_operations
メンバがNULLに設定されているかのように機能するインターフェイス関数の "デフォルト"の値を提供するにはどうすればよいですか?
私はFUSEに限らず、私のインターフェース上の問題に対処する賞金を授与したいと思います。 –