On Tue, Nov 26, 2019 at 4:10 PM Hans Verkuil hverkuil@xs4all.nl wrote:
On 11/26/19 3:43 PM, Arnd Bergmann wrote:
On Mon, Nov 25, 2019 at 3:40 PM Hans Verkuil hverkuil@xs4all.nl wrote:
On 11/11/19 9:38 PM, Arnd Bergmann wrote:
struct v4l2_event *ev = parg; struct v4l2_event_time32 ev32 = { .type = ev->type, .pending = ev->pending, .sequence = ev->sequence, .timestamp.tv_sec = ev->timestamp.tv_sec, .timestamp.tv_nsec = ev->timestamp.tv_nsec, .id = ev->id, }; memcpy(ev32.u, ev->u, sizeof(ev->u)); memcpy(ev32.reserved, ev->reserved, sizeof(ev->reserved)); if (copy_to_user(arg, &ev32, sizeof(ev32))) return -EFAULT;
Unfortunately this is a little uglier because it still requires the two memcpy() for the arrays, but I think it's good enough.
I agree.
Hmm, can't you do .u = ev->u ? Or is that not allowed by this syntax?
No, that doesn't work here since the two unions are considered different types despite being defined identically. It would work by giving the union a name, but that name would also become visible to user space without adding more hacks.
Arnd