2010-11-29 8 views
5

FUSEをGoでラップして遊んでいます。しかし、私はstruct fuse_operationsに対処する方法に立ち往生してきました。 type Operations C.struct_fuse_operationsをメンバーが小文字であると宣言してオペレーション構造体を公開しているようには見えないし、純粋なGoのソースはC-hackeryを使用してメンバーを設定する必要があります。この場合の私の最初のエラーは、デフォルトのコピーコンストラクタのGoに相当するものの中で、 "getattrを設定できません"です。私の次の試みは、GetAttrReadLinkなどを想定したインタフェースを公開してから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に設定されているかのように機能するインターフェイス関数の "デフォルト"の値を提供するにはどうすればよいですか?

+0

私はFUSEに限らず、私のインターフェース上の問題に対処する賞金を授与したいと思います。 –

答えて

関連する問題