2010-11-29 3 views
5

Я играю с обертыванием FUSE с Go. Однако я столкнулся с тем, как бороться с struct fuse_operations. Я не могу показать структуру операций, объявив type Operations C.struct_fuse_operations, поскольку члены имеют строчный регистр, а мои источники с чистым-Go должны будут использовать C-hackery для установки членов в любом случае. Моя первая ошибка в этом случае - «не может установить getattr» в том, что выглядит эквивалентом Go, эквивалентным конструктору копии по умолчанию. Моя следующая попытка состоит в том, чтобы открыть интерфейс, который ожидает 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?

+0

Я бы хотел наградить награду за ответ, который касается моего интерфейса, а не специально для FUSE. – 2010-12-05 09:12:23

ответ

1

http://cheesesun.blogspot.com/2010/04/callbacks-in-cgo.html описывает общую - если несколько запутанную - технику. http://groups.google.com/group/golang-nuts/browse_thread/thread/abd0e30dafdbf297?tvc=2&pli=1 описывает проблему.

Я подозреваю, что если вы хотите обработать указатели на функции, отличные от uintptrs, вам придется взломать cgo.