Je suis en train de jouer avec l'emballage FUSE avec Go. Cependant, je suis coincé avec la façon de traiter struct fuse_operations
. Je ne peux pas sembler exposer la structure des opérations en déclarant type Operations C.struct_fuse_operations
car les membres sont minuscules, et mes sources pur-Go devraient utiliser C-hackery pour définir les membres de toute façon. Ma première erreur dans ce cas est "can not set getattr" dans ce qui semble être l'équivalent Go d'un constructeur de copie par défaut. Ma prochaine tentative est d'exposer une interface qui attend GetAttr
, ReadLink
etc, puis générer C.struct_fuse_operations
et lier les pointeurs de fonction aux fermetures qui appellent l'interface donnée.Emballage FUSE de Go
C'est ce que j'ai (explication continue après le code):
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))
}
Cela donne l'erreur suivante:
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
Je ne sais pas quoi passer à ces membres C.struct_fuse_operations
, et j'ai vu la mention dans quelques endroits, il n'est pas possible d'appeler à partir de C en code Go.
Si c'est possible, que dois-je faire? Comment puis-je fournir les valeurs "par défaut" pour les fonctions d'interface qui se comportent comme si le membre C.struct_fuse_operations
correspondant était défini sur NULL?
Je voudrais attribuer la prime à une réponse qui répond aux préoccupations de mon interface, pas spécifiquement à FUSE. –