From dc74089a97453ccb1a1a74078170bd50258a04b1 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 16 Apr 2016 15:24:14 +0200 Subject: Fix CGo callback See: https://github.com/kch42/golibrsync/issues/1 It is not allowed to let C directly call Go functions, wrapper functions must be made. For some reason, it appears to have worked before but it doesn't work now. --- librsync/librsync_callback.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 librsync/librsync_callback.go (limited to 'librsync/librsync_callback.go') diff --git a/librsync/librsync_callback.go b/librsync/librsync_callback.go new file mode 100644 index 0000000..c8b9e4f --- /dev/null +++ b/librsync/librsync_callback.go @@ -0,0 +1,31 @@ +package librsync + +/* +#include +#include +*/ +import "C" + +import ( + "io" + "unsafe" +) + +//export patchCallbackGo +func patchCallbackGo(_patcher unsafe.Pointer, pos C.rs_long_t, len *C.size_t, _buf *unsafe.Pointer) C.rs_result { + patcher := (*Patcher)(_patcher) + + patcher.buf = make([]byte, int(*len)) + n, err := patcher.basis.ReadAt(patcher.buf, int64(pos)) + if n < int(*len) { + if err != io.EOF { + panic(jobInternalPanic{err}) + } else { + return C.RS_INPUT_ENDED + } + } + *len = C.size_t(n) + *_buf = unsafe.Pointer(&(patcher.buf[0])) + + return C.RS_DONE +} -- cgit v1.2.3-54-g00ecf