Commit 26ddcbcc authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] Use a named union in struct v4l2_ioctl_info

Hi Mauro,

struct v4l2_ioctl_info uses an anonymous union, which is initialized
in the v4l2_ioctls table.

Unfortunately gcc < 4.6 uses a non-standard syntax for that, so trying to
compile v4l2-ioctl.c with an older gcc will fail.

It is possible to work around this by testing the gcc version, but in this
case it is easier to make the union named since it is used in only a few
places.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Reported-by: default avatarRandy Dunlap <rdunlap@xenotime.net>
Acked-by: default avatarRandy Dunlap <rdunlap@xenotime.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent a4de5f05
...@@ -1891,7 +1891,7 @@ struct v4l2_ioctl_info { ...@@ -1891,7 +1891,7 @@ struct v4l2_ioctl_info {
u32 offset; u32 offset;
int (*func)(const struct v4l2_ioctl_ops *ops, int (*func)(const struct v4l2_ioctl_ops *ops,
struct file *file, void *fh, void *p); struct file *file, void *fh, void *p);
}; } u;
void (*debug)(const void *arg, bool write_only); void (*debug)(const void *arg, bool write_only);
}; };
...@@ -1916,7 +1916,7 @@ struct v4l2_ioctl_info { ...@@ -1916,7 +1916,7 @@ struct v4l2_ioctl_info {
.ioctl = _ioctl, \ .ioctl = _ioctl, \
.flags = _flags | INFO_FL_STD, \ .flags = _flags | INFO_FL_STD, \
.name = #_ioctl, \ .name = #_ioctl, \
.offset = offsetof(struct v4l2_ioctl_ops, _vidioc), \ .u.offset = offsetof(struct v4l2_ioctl_ops, _vidioc), \
.debug = _debug, \ .debug = _debug, \
} }
...@@ -1925,7 +1925,7 @@ struct v4l2_ioctl_info { ...@@ -1925,7 +1925,7 @@ struct v4l2_ioctl_info {
.ioctl = _ioctl, \ .ioctl = _ioctl, \
.flags = _flags | INFO_FL_FUNC, \ .flags = _flags | INFO_FL_FUNC, \
.name = #_ioctl, \ .name = #_ioctl, \
.func = _func, \ .u.func = _func, \
.debug = _debug, \ .debug = _debug, \
} }
...@@ -2124,11 +2124,11 @@ static long __video_do_ioctl(struct file *file, ...@@ -2124,11 +2124,11 @@ static long __video_do_ioctl(struct file *file,
if (info->flags & INFO_FL_STD) { if (info->flags & INFO_FL_STD) {
typedef int (*vidioc_op)(struct file *file, void *fh, void *p); typedef int (*vidioc_op)(struct file *file, void *fh, void *p);
const void *p = vfd->ioctl_ops; const void *p = vfd->ioctl_ops;
const vidioc_op *vidioc = p + info->offset; const vidioc_op *vidioc = p + info->u.offset;
ret = (*vidioc)(file, fh, arg); ret = (*vidioc)(file, fh, arg);
} else if (info->flags & INFO_FL_FUNC) { } else if (info->flags & INFO_FL_FUNC) {
ret = info->func(ops, file, fh, arg); ret = info->u.func(ops, file, fh, arg);
} else if (!ops->vidioc_default) { } else if (!ops->vidioc_default) {
ret = -ENOTTY; ret = -ENOTTY;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment