<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="margin:0;"><span style="font-family: Calibri, sans-serif; font-size: 14.6667px;"><b>Hello,</b></span></div><div style="margin:0;"><font face="Calibri, sans-serif"><span style="font-size: 14.6667px;"><b>when i use libguestfs to ceph rbd by golang, but there has panic:</b></span></font></div><div style="margin:0;"><font face="Calibri, sans-serif"><span style="font-size: 14.6667px;"><br></span></font></div><div style="margin:0;"><br></div><div style="margin:0;"><font face="Calibri, sans-serif"><div style="font-size: 14.6667px; margin: 0px;">panic: runtime error: cgo argument has Go pointer to Go pointer</div><div style="font-size: 14.6667px; margin: 0px;"><br></div><div style="font-size: 14.6667px; margin: 0px;">goroutine 1 [running]:</div><div style="font-size: 14.6667px; margin: 0px;">guestfs.(*Guestfs).Add_drive.func11(0xc000010028, 0xcda6a0, 0xc0000d6000, 0xc000090280)</div><div style="font-size: 14.6667px; margin: 0px;"><span style="white-space:pre"> </span>/opt/gopath/src/guestfs/guestfs.go:1440 +0xc2</div><div style="font-size: 14.6667px; margin: 0px;">guestfs.(*Guestfs).Add_drive(0xc000010028, 0x7ffd4b5d67ff, 0xd, 0xc00008d9d8, 0x0)</div><div style="font-size: 14.6667px; margin: 0px;"><span style="white-space:pre">      </span>/opt/gopath/src/guestfs/guestfs.go:1440 +0x1b2</div><div style="font-size: 14.6667px; margin: 0px;">main.OpenImage(0x7ffd4b5d67ff, 0xd, 0x0, 0x0, 0x42110b, 0x7c87e0, 0x4f41e0)</div><div style="font-size: 14.6667px; margin: 0px;"><span style="white-space:pre">    </span>/opt/gopath/src/disk/disk.go:34 +0x371</div><div style="font-size: 14.6667px; margin: 0px;">main.resizeext4(0x7ffd4b5d67ff, 0xd, 0x0, 0x0)</div><div style="font-size: 14.6667px; margin: 0px;"><span style="white-space:pre"> </span>/opt/gopath/src/disk/disk.go:677 +0x60</div><div style="font-size: 14.6667px; margin: 0px;">main.main()</div><div style="font-size: 14.6667px; margin: 0px;"><span style="white-space: pre;">  </span>/opt/gopath/src/disk/disk.go:970 +0x5e5</div><div style="font-size: 14.6667px; margin: 0px;"><br></div><div style="font-size: 14.6667px; margin: 0px;">i found struct in guestfs.h</div><div style="font-size: 14.6667px; margin: 0px;"><span style="font-size: 14.6667px;">struct guestfs_add_drive_opts_argv {</span></div><div style="font-size: 14.6667px; margin: 0px;"><span style="font-size: 14.6667px;">...</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">char *const *server; </span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">...</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><b>so i make a daemon to test. has the same error.  how could i to use libguestfs to connect ceph rbd use golang interface.</b></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><div style="margin: 0px;"><span style="font-size: 14.6667px;">package main</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">/*</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">#include <stdio.h></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">#include <string.h></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">struct t_server {</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">  const char *protocol;</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">  char *const *addr;</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">};</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">void show(struct t_server *optargs) {</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        if (optargs->protocol == NULL){</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">                printf("protocol is  null \n");</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        }</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        printf("proto is %s\n", optargs->protocol);</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        int num = strlen(*optargs->addr)-1;</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        int i = 0;</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        for(i=0;i<num;i++){</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">                printf("%s\n",optargs->addr[i]);</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        }</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">*/</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">import "C"</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">import (</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        "unsafe"</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">)</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">func main(){</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><span style="white-space:pre">             </span>c_optargs := C.struct_t_server{}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        c_optargs.protocol = C.CString("test")</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        serverlist := []string{"aaa", "bbb", "ccc"}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        var buf []*C.char</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        for i, _ := range serverlist {</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">            buf = append(buf, (*C.char)(unsafe.Pointer(C.CString(serverlist[i]))))</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        }</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        buf = append(buf, (*C.char)(unsafe.Pointer(nil)))</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        c_optargs.addr = &buf[0]</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">        C.show(&c_optargs)</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">}<span style="white-space: pre;">                </span></span></div></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div></font></div></div><br><br><span title="neteasefooter"><p> </p></span></div><br><br><span title="neteasefooter"><p> </p></span>