aboutsummaryrefslogtreecommitdiff
path: root/librsync/librsync_callback.go
diff options
context:
space:
mode:
Diffstat (limited to 'librsync/librsync_callback.go')
-rw-r--r--librsync/librsync_callback.go18
1 files changed, 12 insertions, 6 deletions
diff --git a/librsync/librsync_callback.go b/librsync/librsync_callback.go
index ace9779..66b16c7 100644
--- a/librsync/librsync_callback.go
+++ b/librsync/librsync_callback.go
@@ -3,6 +3,7 @@ package librsync
/*
#include <stdio.h>
#include <librsync.h>
+#include <stdlib.h>
*/
import "C"
@@ -12,20 +13,25 @@ import (
)
//export patchCallbackGo
-func patchCallbackGo(_patcher uintptr, pos C.rs_long_t, len *C.size_t, _buf *unsafe.Pointer) C.rs_result {
+func patchCallbackGo(_patcher uintptr, pos C.rs_long_t, buflen *C.size_t, buf *unsafe.Pointer) C.rs_result {
patcher := getPatcher(_patcher)
- patcher.buf = make([]byte, int(*len))
- n, err := patcher.basis.ReadAt(patcher.buf, int64(pos))
- if n < int(*len) {
+ if patcher.buf != nil {
+ C.free(patcher.buf)
+ }
+ patcher.buf = C.malloc(*buflen)
+ // https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
+ s := (*[1 << 30]byte)(patcher.buf)[:*buflen:*buflen]
+ n, err := patcher.basis.ReadAt(s, int64(pos))
+ if n < int(*buflen) {
if err != io.EOF {
panic(jobInternalPanic{err})
} else {
return C.RS_INPUT_ENDED
}
}
- *len = C.size_t(n)
- *_buf = unsafe.Pointer(&(patcher.buf[0]))
+ *buflen = C.size_t(n)
+ *buf = patcher.buf
return C.RS_DONE
}