You can use
go tool cgo -godefs *file*.go
to generate the Go structs from C structs and either use them as-is or get 
an idea how you should pad your hand-written Go structs.
file.go will have to do an import of the right .h file(s), something like:
/*
#include "file.h"
*/
import "C"
...


On Tuesday, December 6, 2016 at 4:47:39 PM UTC-8, Steven Logan wrote:
>
> I am trying to interact with devices using the V4L2 API.  The API defines 
> the following struct 
>
> typedef __u64 v4l2_std_id
>
> struct v4l2_input {
>   __u32      index;  
>   __u8       name[32];  
>   __u32      type;    
>   __u32      audioset;  
>   __u32        tuner;            
>   v4l2_std_id  std;
>   __u32      status;
>   __u32      capabilities;
>   __u32      reserved[3];
> };
>
> In Go I have replicated this struct with the following
>
> type StandardId uint64
>
> type Input struct {
> Index        uint32
> Name         [32]uint8
> Type         uint32
> Audioset     uint32
> Tuner        uint32
> Standard     StandardId
> Status       uint32
> Capabilities uint32
> reserved     [3]uint32
> }
>
> When I attempt to use the Go struct in an Ioctl call I get the following 
> error
>
> EnumerateVideoInput:   inappropriate ioctl for device
>>
>
> I have managed to track this down to what appears to be a slight 
> difference in the size of the structs.
> The Go struct has sizeof 76 bytes and the C struct has sizeof 80 bytes. 
>  This means the creation of my ioctl request value is incorrect as I 
> generate a value of 3,226,228,250 and the actual C #define from 
> linux/videodev2.h has value 3,226,490,394.
>
> Up to this point I have not had a problem replicating the C structs in Go 
> and using them to call Ioctl, with calls succeeding and all fields being 
> populated with the expected values so far.  It seems that the system calls 
> in Go do not come with much documentation and I have seen a similar method 
> to this used elsewhere online hence my adoption of this approach.
> My main goal was to avoid having to use CGO as this obviously comes with 
> overhead on compilation time, etc.
>
> Assuming I haven't missed something glaringly obvious, is it possible to 
> replicate the C structs in Go and use them in this way?
> What would be the recommended approach for using Ioctl? 
> Does anyone know of some good resources for using the /x/sys/unix package 
> (specifically Syscall related)?
>
> Thanks
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to