in component/libfuse/libfuse2_handler.go [119:187]
func (lf *Libfuse) initFuse() error {
log.Trace("Libfuse::initFuse : Initializing FUSE")
operations := C.fuse_operations_t{}
if lf.extensionPath != "" {
log.Trace("Libfuse::InitFuse : Going for extension mouting [%s]", lf.extensionPath)
// User has given an extension so we need to register it to fuse
// and then register ourself to it
extensionPath := C.CString(lf.extensionPath)
defer C.free(unsafe.Pointer(extensionPath))
// Load the library
errc := C.load_library(extensionPath)
if errc != 0 {
log.Err("Libfuse::InitFuse : Failed to load extension err code %d", errc)
return errors.New("failed to load extension")
}
log.Trace("Libfuse::InitFuse : Extension loaded")
// Get extension callback table
errc = C.get_extension_callbacks(&operations)
if errc != 0 {
C.unload_library()
log.Err("Libfuse::InitFuse : Failed to get callback table from extension. error code %d", errc)
return errors.New("failed to get callback table from extension")
}
log.Trace("Libfuse::InitFuse : Extension callback retrieved")
// Get our callback table
my_operations := C.fuse_operations_t{}
C.populate_callbacks(&my_operations)
// Send our callback table to the extension
errc = C.register_callback_to_extension(&my_operations)
if errc != 0 {
C.unload_library()
log.Err("Libfuse::InitFuse : Failed to register callback table to extension. error code %d", errc)
return errors.New("failed to register callback table to extension")
}
log.Trace("Libfuse::InitFuse : Callbacks registered to extension")
} else {
// Populate our methods to be registered to libfuse
log.Trace("Libfuse::initFuse : Registering fuse callbacks")
C.populate_callbacks(&operations)
}
log.Trace("Libfuse::initFuse : Populating fuse arguments")
fuse_opts := lf.convertConfig()
var args C.fuse_args_t
fuse_opts, ret := populateFuseArgs(fuse_opts, &args)
if ret != 0 {
log.Err("Libfuse::initFuse : Failed to parse fuse arguments")
return errors.New("failed to parse fuse arguments")
}
// Note: C strings are allocated in the heap using malloc. Calling C.free to release the mount path since it is no longer needed.
C.free(unsafe.Pointer(fuse_opts.mount_path))
log.Info("Libfuse::initFuse : Mounting with fuse2 library")
ret = C.start_fuse(&args, &operations)
if ret != 0 {
log.Err("Libfuse::initFuse : failed to mount fuse")
return errors.New("failed to mount fuse")
}
return nil
}