Обертывание FUSE от Go - PullRequest
       9

Обертывание FUSE от Go

5 голосов
/ 29 ноября 2010

Я играю с упаковкой FUSE с Go.Однако я застрял с тем, как бороться с struct fuse_operations.Похоже, я не могу раскрыть структуру операций, объявив type Operations C.struct_fuse_operations, так как члены являются строчными, и мои источники с чистым Go должны были бы в любом случае использовать C-hackery для установки элементов.Моя первая ошибка в этом случае - «не могу установить getattr» в том, что похоже на Go, эквивалентный конструктору копирования по умолчанию.Моя следующая попытка - открыть интерфейс, который ожидает GetAttr, ReadLink и т. Д., А затем сгенерировать C.struct_fuse_operations и привязать указатели функций к замыканиям, которые вызывают данный интерфейс.

получил (объяснение продолжается после кода):

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, и яЯ видел упоминание в нескольких местах, что невозможно перезвонить из Си в код Go.

Если это возможно, что мне делать?Как я могу предоставить значения по умолчанию для интерфейсных функций, которые действуют так, как если бы соответствующий элемент C.struct_fuse_operations был установлен в NULL?

1 Ответ

1 голос
/ 07 декабря 2010

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.

...