2014-09-10 3 views
1

В принципе, я пытаюсь заменить pread в программе на C функцией Go. У меня большая часть структуры работает, но я не могу понять, как заполнить аргумент буфера (buf unsafe.Pointer) с нужными байтами.Изменение байтового массива C void * из кода Go

Часть 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); 
} 

В файле Golang:

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 
} 

Другой Golang файл:

package main 

// #include "daemon.c" 
import "C" 
import "fmt" 

func main() { 
    //Start C program 
    C.start() 
} 

Любые предложения? Я ничего не пробовал, и у меня все идеи.

ответ

2

Вы просто должны создать свой собственный кусочек от него, например:

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)) 
} 
+2

Woot! Оно работает! Благодаря тонну! – Moolignant

+0

Я пробовал маршрут C.GoBytes, но на самом деле он не меняет буфер на стороне C. – Moolignant

+0

@ Moolingant Я просто впился в него, и вы правы, он делает копию, я исправлю ответ. – OneOfOne