func()

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
}