2010-11-29 16 views
5

Estoy jugando con el ajuste de FUSE con Go. Sin embargo, me he quedado con la forma de lidiar con struct fuse_operations. Parece que no puedo exponer la estructura de operaciones al declarar type Operations C.struct_fuse_operations ya que los miembros están en minúsculas, y mis fuentes de pure-Go tendrían que usar C-hackery para establecer los miembros de todos modos. Mi primer error en este caso es "no se puede establecer getattr" en lo que parece ser el equivalente de Go de un constructor de copia predeterminado. Mi próximo intento es exponer una interfaz que espera GetAttr, ReadLink, etc., y luego generar C.struct_fuse_operations y enlazar los punteros a los cierres que llaman a la interfaz dada.Envolviendo FUSE desde Go

Esto es lo que tengo (explicación continúa después de código):

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)) 
} 

Esto da el siguiente error:

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

No estoy seguro de lo que pasar a estos miembros de C.struct_fuse_operations, y he visto mencionar en algunos lugares que no es posible volver a llamar desde C al código Go.

Si es posible, ¿qué debo hacer? ¿Cómo puedo proporcionar los valores "predeterminados" para las funciones de interfaz que actúan como si el miembro correspondiente C.struct_fuse_operations se establece en NULL?

+0

Me gustaría otorgar la recompensa a una respuesta que aborde mis inquietudes de interfaz, no específicamente a FUSE. –

Respuesta