Basically, I'm trying to replace pread in a C program with a Go function. I've got most of the structure working, but I can't figure out how to populate the buffer argument (buf unsafe.Pointer) with the desired bytes.
Part of daemon.c:
static int preadShim(int fd, void *buf, size_t count, off_t offset) {
//return pread(fd, buf, count, offset);
return ReadOver(fd, buf, count, offset);
}
In a Golang file:
package main
import "C"
import "fmt"
import "unsafe"
//export ReadOver
func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int{
fmt.Println("ReadOver got called")
newBuf := []byte("injected bytes")
//TODO: copy newBuf over buf
return count
}
Another Golang file:
package main
// #include "daemon.c"
import "C"
import "fmt"
func main() {
//Start C program
C.start()
}
Any suggestions? I've tried nothing and I'm all out of ideas.
You just have to create your own slice from it, for example:
func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int {
fmt.Println("ReadOver got called")
newBuf := []byte("injected bytes")
slice := &reflect.SliceHeader{Data: uintptr(buf), Len: int(count), Cap: int(count)}
rbuf := *(*[]byte)(unsafe.Pointer(slice))
return C.int(copy(rbuf, newBuf))
}