Commit 6016af "[media] v4l2: use __u32 rather than enums in ioctl() structs" breaks C++ users of V4L2
I ran into problems compiling the program ZoneMinder on Fedora rawhide (currently using something around 3.5rc6) which do not appear with 3.4 kernels. With help this was traced to commit 6016af82eafcb6e086a8f2a2197b46029a843d68, "[media] v4l2: use __u32 rather than enums in ioctl() structs" which changed videodev2.h in a way which appears to be incompatible with C++.
This results in code such as the following:
enum v4l2_buf_type type = v4l2_data.fmt.type;
failing to compile with:
zm_local_camera.cpp:1523:49: error: invalid conversion from '__u32 {aka unsigned int}' to 'v4l2_buf_type' [-fpermissive]
but only when compiled with the headers from a 3.5 kernel.
I'm very far from a C++ expert. I talked with some people who do grok it and the issue comes down to restrictions on assignments of ints to enums and additionally that enums in C++ don't have defined size.
- J<
Le lundi 16 juillet 2012 23:40:01 Jason L Tibbitts III, vous avez écrit :
Quoted 9 lines
I ran into problems compiling the program ZoneMinder on Fedora rawhide (currently using something around 3.5rc6) which do not appear with 3.4 kernels. With help this was traced to commit
6016af82eafcb6e086a8f2a2197b46029a843d68, "[media] v4l2: use__u32rather than enums inioctl()structs" which changedvideodev2.hin a way which appears to be incompatible with C++.This results in code such as the following:
enum v4l2_buf_type type = v4l2_data.fmt.type;
That code is dangerous, probably even more so in C++. If the running kernel version is more recent than the kernel header version that userland was compiled with, the field value could be outside the range of the enumeration.
Quoted 11 lines
failing to compile with:
zm_local_camera.cpp:1523:49: error: invalid conversion from '__u32{aka unsigned int}' to 'v4l2_buf_type' [-fpermissive]
but only when compiled with the headers from a 3.5 kernel.I'm very far from a C++ expert. I talked with some people who do grok it and the issue comes down to restrictions on assignments of ints to enums
and additionally that enums in C++ don't have defined size.
That cannot be true. Your C++ compiler must agree with the kernel's C compiler on the size of enum. If they did not, V4L2 would not have ever worked from C++ code in previous kernel versions.
Signature · 3 lines
Rémi Denis-Courmont http://www.remlab.net/ http://fi.linkedin.com/in/remidenis