diff mbox series

[4/4] v4l-utils: fix formats under ppc/mips64

Message ID 20240630224440.5912-4-rosenp@gmail.com (mailing list archive)
State New
Headers show
Series [1/4] v4l-utils: fix potential crashing with 32-bit musl | expand

Commit Message

Rosen Penev June 30, 2024, 10:44 p.m. UTC
Unlike libc, kernel headers use long long for 64-bit types. The
exception is ppc64 and mips64, unless __SANE_USERSPACE_TYPES__ is
defined.

Define in compiler.h and include before kernel headers are included so
that wrong __u64 and __s64 definitions to not get used.

Fixes -Wformat warnings about llu being used instead of lu.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 contrib/xc3028-firmware/firmware-tool.c | 2 ++
 include/linux/compiler.h                | 1 +
 utils/cec-compliance/cec-compliance.h   | 2 ++
 utils/cec-ctl/cec-ctl.cpp               | 2 ++
 utils/cec-ctl/cec-ctl.h                 | 2 ++
 utils/cec-ctl/cec-pin.cpp               | 2 ++
 utils/cec-follower/cec-processing.cpp   | 2 ++
 utils/common/v4l2-info.h                | 2 ++
 utils/cx18-ctl/cx18-ctl.c               | 2 ++
 utils/ivtv-ctl/ivtv-ctl.c               | 2 ++
 utils/keytable/keytable.c               | 2 ++
 utils/media-ctl/media-ctl.c             | 2 ++
 utils/v4l2-compliance/v4l2-compliance.h | 2 ++
 utils/v4l2-ctl/v4l2-ctl-common.cpp      | 2 ++
 utils/v4l2-ctl/v4l2-ctl-streaming.cpp   | 2 ++
 utils/v4l2-ctl/v4l2-ctl.cpp             | 2 ++
 utils/v4l2-ctl/v4l2-ctl.h               | 2 ++
 utils/v4l2-dbg/v4l2-dbg.cpp             | 2 ++
 18 files changed, 35 insertions(+)

Comments

Hans Verkuil July 1, 2024, 9:49 a.m. UTC | #1
On 01/07/2024 00:44, Rosen Penev wrote:
> Unlike libc, kernel headers use long long for 64-bit types. The
> exception is ppc64 and mips64, unless __SANE_USERSPACE_TYPES__ is
> defined.
> 
> Define in compiler.h and include before kernel headers are included so
> that wrong __u64 and __s64 definitions to not get used.
> 
> Fixes -Wformat warnings about llu being used instead of lu.
> 
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  contrib/xc3028-firmware/firmware-tool.c | 2 ++
>  include/linux/compiler.h                | 1 +
>  utils/cec-compliance/cec-compliance.h   | 2 ++
>  utils/cec-ctl/cec-ctl.cpp               | 2 ++
>  utils/cec-ctl/cec-ctl.h                 | 2 ++
>  utils/cec-ctl/cec-pin.cpp               | 2 ++
>  utils/cec-follower/cec-processing.cpp   | 2 ++
>  utils/common/v4l2-info.h                | 2 ++
>  utils/cx18-ctl/cx18-ctl.c               | 2 ++
>  utils/ivtv-ctl/ivtv-ctl.c               | 2 ++
>  utils/keytable/keytable.c               | 2 ++
>  utils/media-ctl/media-ctl.c             | 2 ++
>  utils/v4l2-compliance/v4l2-compliance.h | 2 ++
>  utils/v4l2-ctl/v4l2-ctl-common.cpp      | 2 ++
>  utils/v4l2-ctl/v4l2-ctl-streaming.cpp   | 2 ++
>  utils/v4l2-ctl/v4l2-ctl.cpp             | 2 ++
>  utils/v4l2-ctl/v4l2-ctl.h               | 2 ++
>  utils/v4l2-dbg/v4l2-dbg.cpp             | 2 ++
>  18 files changed, 35 insertions(+)
> 
> diff --git a/contrib/xc3028-firmware/firmware-tool.c b/contrib/xc3028-firmware/firmware-tool.c
> index 5dd205e0..6bcb3237 100644
> --- a/contrib/xc3028-firmware/firmware-tool.c
> +++ b/contrib/xc3028-firmware/firmware-tool.c
> @@ -29,6 +29,8 @@
>  #include <string.h>
>  #include <unistd.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <asm/byteorder.h>
>  #include <asm/types.h>
>  
> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> index 379629be..5a6326f8 100644
> --- a/include/linux/compiler.h
> +++ b/include/linux/compiler.h
> @@ -1,6 +1,7 @@
>  #ifndef __linux_compiler_h
>  #define __linux_compiler_h
>  
> +#define __SANE_USERSPACE_TYPES__

Please add a comment before this define, explaining why it is needed.

Basically the same as what you wrote in the commit log.

But this is in the wrong header: it should go into include/compiler.h.
The linux/compiler.h header was used in just a single test application,
and in fact it is no longer needed and has been effectively obsolete for
quite a long time. I just removed it from v4l-utils.

Regards,

	Hans

>  #define __user
>  
>  #endif
> diff --git a/utils/cec-compliance/cec-compliance.h b/utils/cec-compliance/cec-compliance.h
> index aae72842..d5bd1d0a 100644
> --- a/utils/cec-compliance/cec-compliance.h
> +++ b/utils/cec-compliance/cec-compliance.h
> @@ -8,6 +8,8 @@
>  #ifndef _CEC_COMPLIANCE_H_
>  #define _CEC_COMPLIANCE_H_
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/cec-funcs.h>
>  #include "cec-htng-funcs.h"
>  
> diff --git a/utils/cec-ctl/cec-ctl.cpp b/utils/cec-ctl/cec-ctl.cpp
> index fb38320d..a2ffcb2b 100644
> --- a/utils/cec-ctl/cec-ctl.cpp
> +++ b/utils/cec-ctl/cec-ctl.cpp
> @@ -21,6 +21,8 @@
>  #include <sys/time.h>
>  #include <unistd.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/cec-funcs.h>
>  #include "cec-htng-funcs.h"
>  #include "cec-log.h"
> diff --git a/utils/cec-ctl/cec-ctl.h b/utils/cec-ctl/cec-ctl.h
> index 2c82bedc..e0692c31 100644
> --- a/utils/cec-ctl/cec-ctl.h
> +++ b/utils/cec-ctl/cec-ctl.h
> @@ -6,6 +6,8 @@
>  #ifndef _CEC_CTL_H_
>  #define _CEC_CTL_H_
>  
> +#include "linux/compiler.h"
> +
>  #include <cec-info.h>
>  
>  // cec-ctl.cpp
> diff --git a/utils/cec-ctl/cec-pin.cpp b/utils/cec-ctl/cec-pin.cpp
> index f3500555..0cdc19f7 100644
> --- a/utils/cec-ctl/cec-pin.cpp
> +++ b/utils/cec-ctl/cec-pin.cpp
> @@ -3,6 +3,8 @@
>   * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
>   */
>  
> +#include "linux/compiler.h"
> +
>  #include <string>
>  
>  #include <linux/cec.h>
> diff --git a/utils/cec-follower/cec-processing.cpp b/utils/cec-follower/cec-processing.cpp
> index 20c6165c..cc38f143 100644
> --- a/utils/cec-follower/cec-processing.cpp
> +++ b/utils/cec-follower/cec-processing.cpp
> @@ -3,6 +3,8 @@
>   * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
>   */
>  
> +#include "linux/compiler.h"
> +
>  #include <cerrno>
>  #include <cinttypes>
>  #include <ctime>
> diff --git a/utils/common/v4l2-info.h b/utils/common/v4l2-info.h
> index ac227971..eeb7bc6b 100644
> --- a/utils/common/v4l2-info.h
> +++ b/utils/common/v4l2-info.h
> @@ -8,6 +8,8 @@
>  
>  #include <string>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/videodev2.h>
>  #include <linux/v4l2-subdev.h>
>  
> diff --git a/utils/cx18-ctl/cx18-ctl.c b/utils/cx18-ctl/cx18-ctl.c
> index 8586f72d..7c13b1a3 100644
> --- a/utils/cx18-ctl/cx18-ctl.c
> +++ b/utils/cx18-ctl/cx18-ctl.c
> @@ -34,6 +34,8 @@
>  #include <sys/time.h>
>  #include <math.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/videodev2.h>
>  #include <v4l-getsubopt.h>
>  
> diff --git a/utils/ivtv-ctl/ivtv-ctl.c b/utils/ivtv-ctl/ivtv-ctl.c
> index b42b3489..bf36f40b 100644
> --- a/utils/ivtv-ctl/ivtv-ctl.c
> +++ b/utils/ivtv-ctl/ivtv-ctl.c
> @@ -34,6 +34,8 @@
>  #include <sys/time.h>
>  #include <math.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/videodev2.h>
>  #include <v4l-getsubopt.h>
>  
> diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
> index 538f4ef3..ba7c7c4d 100644
> --- a/utils/keytable/keytable.c
> +++ b/utils/keytable/keytable.c
> @@ -12,6 +12,8 @@
>     GNU General Public License for more details.
>   */
>  
> +#include "linux/compiler.h"
> +
>  #include <ctype.h>
>  #include <errno.h>
>  #include <fcntl.h>
> diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c
> index 33df0880..f91c1cfa 100644
> --- a/utils/media-ctl/media-ctl.c
> +++ b/utils/media-ctl/media-ctl.c
> @@ -34,6 +34,8 @@
>  #include <string.h>
>  #include <unistd.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/media.h>
>  #include <linux/types.h>
>  #include <linux/v4l2-mediabus.h>
> diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h
> index 3517bd07..2c2b2158 100644
> --- a/utils/v4l2-compliance/v4l2-compliance.h
> +++ b/utils/v4l2-compliance/v4l2-compliance.h
> @@ -26,6 +26,8 @@
>  #include <string>
>  #include <cstdint>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/videodev2.h>
>  #include <linux/v4l2-subdev.h>
>  #include <linux/media.h>
> diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp
> index 1f9cd0fb..ea120eb8 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
> @@ -9,6 +9,8 @@
>  #include <sys/stat.h>
>  #include <sys/sysmacros.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/media.h>
>  
>  #include "v4l2-ctl.h"
> diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> index 13bc057d..7af62ec8 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> @@ -3,6 +3,8 @@
>  #include <netdb.h>
>  #include <sys/types.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/media.h>
>  
>  #include "compiler.h"
> diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
> index a64fa514..d8a6c617 100644
> --- a/utils/v4l2-ctl/v4l2-ctl.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl.cpp
> @@ -27,6 +27,8 @@
>  #include <getopt.h>
>  #include <sys/epoll.h>
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/media.h>
>  
>  #include "v4l2-ctl.h"
> diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
> index a1911e80..fd1bd24a 100644
> --- a/utils/v4l2-ctl/v4l2-ctl.h
> +++ b/utils/v4l2-ctl/v4l2-ctl.h
> @@ -1,6 +1,8 @@
>  #ifndef _V4L2_CTL_H
>  #define _V4L2_CTL_H
>  
> +#include "linux/compiler.h"
> +
>  #include <cstdint>
>  #include <linux/videodev2.h>
>  #include <linux/v4l2-subdev.h>
> diff --git a/utils/v4l2-dbg/v4l2-dbg.cpp b/utils/v4l2-dbg/v4l2-dbg.cpp
> index bd08b4cf..1b0d278a 100644
> --- a/utils/v4l2-dbg/v4l2-dbg.cpp
> +++ b/utils/v4l2-dbg/v4l2-dbg.cpp
> @@ -31,6 +31,8 @@
>  #include <sys/klog.h>
>  #endif
>  
> +#include "linux/compiler.h"
> +
>  #include <linux/videodev2.h>
>  #include <v4l-getsubopt.h>
>
Rosen Penev July 1, 2024, 9:46 p.m. UTC | #2
On Mon, Jul 1, 2024 at 2:49 AM Hans Verkuil <hverkuil@xs4all.nl> wrote:
>
> On 01/07/2024 00:44, Rosen Penev wrote:
> > Unlike libc, kernel headers use long long for 64-bit types. The
> > exception is ppc64 and mips64, unless __SANE_USERSPACE_TYPES__ is
> > defined.
> >
> > Define in compiler.h and include before kernel headers are included so
> > that wrong __u64 and __s64 definitions to not get used.
> >
> > Fixes -Wformat warnings about llu being used instead of lu.
> >
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > ---
> >  contrib/xc3028-firmware/firmware-tool.c | 2 ++
> >  include/linux/compiler.h                | 1 +
> >  utils/cec-compliance/cec-compliance.h   | 2 ++
> >  utils/cec-ctl/cec-ctl.cpp               | 2 ++
> >  utils/cec-ctl/cec-ctl.h                 | 2 ++
> >  utils/cec-ctl/cec-pin.cpp               | 2 ++
> >  utils/cec-follower/cec-processing.cpp   | 2 ++
> >  utils/common/v4l2-info.h                | 2 ++
> >  utils/cx18-ctl/cx18-ctl.c               | 2 ++
> >  utils/ivtv-ctl/ivtv-ctl.c               | 2 ++
> >  utils/keytable/keytable.c               | 2 ++
> >  utils/media-ctl/media-ctl.c             | 2 ++
> >  utils/v4l2-compliance/v4l2-compliance.h | 2 ++
> >  utils/v4l2-ctl/v4l2-ctl-common.cpp      | 2 ++
> >  utils/v4l2-ctl/v4l2-ctl-streaming.cpp   | 2 ++
> >  utils/v4l2-ctl/v4l2-ctl.cpp             | 2 ++
> >  utils/v4l2-ctl/v4l2-ctl.h               | 2 ++
> >  utils/v4l2-dbg/v4l2-dbg.cpp             | 2 ++
> >  18 files changed, 35 insertions(+)
> >
> > diff --git a/contrib/xc3028-firmware/firmware-tool.c b/contrib/xc3028-firmware/firmware-tool.c
> > index 5dd205e0..6bcb3237 100644
> > --- a/contrib/xc3028-firmware/firmware-tool.c
> > +++ b/contrib/xc3028-firmware/firmware-tool.c
> > @@ -29,6 +29,8 @@
> >  #include <string.h>
> >  #include <unistd.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <asm/byteorder.h>
> >  #include <asm/types.h>
> >
> > diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> > index 379629be..5a6326f8 100644
> > --- a/include/linux/compiler.h
> > +++ b/include/linux/compiler.h
> > @@ -1,6 +1,7 @@
> >  #ifndef __linux_compiler_h
> >  #define __linux_compiler_h
> >
> > +#define __SANE_USERSPACE_TYPES__
>
> Please add a comment before this define, explaining why it is needed.
>
> Basically the same as what you wrote in the commit log.
>
> But this is in the wrong header: it should go into include/compiler.h.
> The linux/compiler.h header was used in just a single test application,
> and in fact it is no longer needed and has been effectively obsolete for
> quite a long time. I just removed it from v4l-utils.
I actually wonder if it would be better to add as a compile flag in meson.
>
> Regards,
>
>         Hans
>
> >  #define __user
> >
> >  #endif
> > diff --git a/utils/cec-compliance/cec-compliance.h b/utils/cec-compliance/cec-compliance.h
> > index aae72842..d5bd1d0a 100644
> > --- a/utils/cec-compliance/cec-compliance.h
> > +++ b/utils/cec-compliance/cec-compliance.h
> > @@ -8,6 +8,8 @@
> >  #ifndef _CEC_COMPLIANCE_H_
> >  #define _CEC_COMPLIANCE_H_
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/cec-funcs.h>
> >  #include "cec-htng-funcs.h"
> >
> > diff --git a/utils/cec-ctl/cec-ctl.cpp b/utils/cec-ctl/cec-ctl.cpp
> > index fb38320d..a2ffcb2b 100644
> > --- a/utils/cec-ctl/cec-ctl.cpp
> > +++ b/utils/cec-ctl/cec-ctl.cpp
> > @@ -21,6 +21,8 @@
> >  #include <sys/time.h>
> >  #include <unistd.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/cec-funcs.h>
> >  #include "cec-htng-funcs.h"
> >  #include "cec-log.h"
> > diff --git a/utils/cec-ctl/cec-ctl.h b/utils/cec-ctl/cec-ctl.h
> > index 2c82bedc..e0692c31 100644
> > --- a/utils/cec-ctl/cec-ctl.h
> > +++ b/utils/cec-ctl/cec-ctl.h
> > @@ -6,6 +6,8 @@
> >  #ifndef _CEC_CTL_H_
> >  #define _CEC_CTL_H_
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <cec-info.h>
> >
> >  // cec-ctl.cpp
> > diff --git a/utils/cec-ctl/cec-pin.cpp b/utils/cec-ctl/cec-pin.cpp
> > index f3500555..0cdc19f7 100644
> > --- a/utils/cec-ctl/cec-pin.cpp
> > +++ b/utils/cec-ctl/cec-pin.cpp
> > @@ -3,6 +3,8 @@
> >   * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
> >   */
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <string>
> >
> >  #include <linux/cec.h>
> > diff --git a/utils/cec-follower/cec-processing.cpp b/utils/cec-follower/cec-processing.cpp
> > index 20c6165c..cc38f143 100644
> > --- a/utils/cec-follower/cec-processing.cpp
> > +++ b/utils/cec-follower/cec-processing.cpp
> > @@ -3,6 +3,8 @@
> >   * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
> >   */
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <cerrno>
> >  #include <cinttypes>
> >  #include <ctime>
> > diff --git a/utils/common/v4l2-info.h b/utils/common/v4l2-info.h
> > index ac227971..eeb7bc6b 100644
> > --- a/utils/common/v4l2-info.h
> > +++ b/utils/common/v4l2-info.h
> > @@ -8,6 +8,8 @@
> >
> >  #include <string>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/videodev2.h>
> >  #include <linux/v4l2-subdev.h>
> >
> > diff --git a/utils/cx18-ctl/cx18-ctl.c b/utils/cx18-ctl/cx18-ctl.c
> > index 8586f72d..7c13b1a3 100644
> > --- a/utils/cx18-ctl/cx18-ctl.c
> > +++ b/utils/cx18-ctl/cx18-ctl.c
> > @@ -34,6 +34,8 @@
> >  #include <sys/time.h>
> >  #include <math.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/videodev2.h>
> >  #include <v4l-getsubopt.h>
> >
> > diff --git a/utils/ivtv-ctl/ivtv-ctl.c b/utils/ivtv-ctl/ivtv-ctl.c
> > index b42b3489..bf36f40b 100644
> > --- a/utils/ivtv-ctl/ivtv-ctl.c
> > +++ b/utils/ivtv-ctl/ivtv-ctl.c
> > @@ -34,6 +34,8 @@
> >  #include <sys/time.h>
> >  #include <math.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/videodev2.h>
> >  #include <v4l-getsubopt.h>
> >
> > diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
> > index 538f4ef3..ba7c7c4d 100644
> > --- a/utils/keytable/keytable.c
> > +++ b/utils/keytable/keytable.c
> > @@ -12,6 +12,8 @@
> >     GNU General Public License for more details.
> >   */
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <ctype.h>
> >  #include <errno.h>
> >  #include <fcntl.h>
> > diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c
> > index 33df0880..f91c1cfa 100644
> > --- a/utils/media-ctl/media-ctl.c
> > +++ b/utils/media-ctl/media-ctl.c
> > @@ -34,6 +34,8 @@
> >  #include <string.h>
> >  #include <unistd.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/media.h>
> >  #include <linux/types.h>
> >  #include <linux/v4l2-mediabus.h>
> > diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h
> > index 3517bd07..2c2b2158 100644
> > --- a/utils/v4l2-compliance/v4l2-compliance.h
> > +++ b/utils/v4l2-compliance/v4l2-compliance.h
> > @@ -26,6 +26,8 @@
> >  #include <string>
> >  #include <cstdint>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/videodev2.h>
> >  #include <linux/v4l2-subdev.h>
> >  #include <linux/media.h>
> > diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp
> > index 1f9cd0fb..ea120eb8 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
> > +++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
> > @@ -9,6 +9,8 @@
> >  #include <sys/stat.h>
> >  #include <sys/sysmacros.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/media.h>
> >
> >  #include "v4l2-ctl.h"
> > diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> > index 13bc057d..7af62ec8 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> > +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> > @@ -3,6 +3,8 @@
> >  #include <netdb.h>
> >  #include <sys/types.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/media.h>
> >
> >  #include "compiler.h"
> > diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
> > index a64fa514..d8a6c617 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl.cpp
> > +++ b/utils/v4l2-ctl/v4l2-ctl.cpp
> > @@ -27,6 +27,8 @@
> >  #include <getopt.h>
> >  #include <sys/epoll.h>
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/media.h>
> >
> >  #include "v4l2-ctl.h"
> > diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
> > index a1911e80..fd1bd24a 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl.h
> > +++ b/utils/v4l2-ctl/v4l2-ctl.h
> > @@ -1,6 +1,8 @@
> >  #ifndef _V4L2_CTL_H
> >  #define _V4L2_CTL_H
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <cstdint>
> >  #include <linux/videodev2.h>
> >  #include <linux/v4l2-subdev.h>
> > diff --git a/utils/v4l2-dbg/v4l2-dbg.cpp b/utils/v4l2-dbg/v4l2-dbg.cpp
> > index bd08b4cf..1b0d278a 100644
> > --- a/utils/v4l2-dbg/v4l2-dbg.cpp
> > +++ b/utils/v4l2-dbg/v4l2-dbg.cpp
> > @@ -31,6 +31,8 @@
> >  #include <sys/klog.h>
> >  #endif
> >
> > +#include "linux/compiler.h"
> > +
> >  #include <linux/videodev2.h>
> >  #include <v4l-getsubopt.h>
> >
>
Hans Verkuil July 2, 2024, 6:26 a.m. UTC | #3
On 01/07/2024 23:46, Rosen Penev wrote:
> On Mon, Jul 1, 2024 at 2:49 AM Hans Verkuil <hverkuil@xs4all.nl> wrote:
>>
>> On 01/07/2024 00:44, Rosen Penev wrote:
>>> Unlike libc, kernel headers use long long for 64-bit types. The
>>> exception is ppc64 and mips64, unless __SANE_USERSPACE_TYPES__ is
>>> defined.
>>>
>>> Define in compiler.h and include before kernel headers are included so
>>> that wrong __u64 and __s64 definitions to not get used.
>>>
>>> Fixes -Wformat warnings about llu being used instead of lu.
>>>
>>> Signed-off-by: Rosen Penev <rosenp@gmail.com>
>>> ---
>>>  contrib/xc3028-firmware/firmware-tool.c | 2 ++
>>>  include/linux/compiler.h                | 1 +
>>>  utils/cec-compliance/cec-compliance.h   | 2 ++
>>>  utils/cec-ctl/cec-ctl.cpp               | 2 ++
>>>  utils/cec-ctl/cec-ctl.h                 | 2 ++
>>>  utils/cec-ctl/cec-pin.cpp               | 2 ++
>>>  utils/cec-follower/cec-processing.cpp   | 2 ++
>>>  utils/common/v4l2-info.h                | 2 ++
>>>  utils/cx18-ctl/cx18-ctl.c               | 2 ++
>>>  utils/ivtv-ctl/ivtv-ctl.c               | 2 ++
>>>  utils/keytable/keytable.c               | 2 ++
>>>  utils/media-ctl/media-ctl.c             | 2 ++
>>>  utils/v4l2-compliance/v4l2-compliance.h | 2 ++
>>>  utils/v4l2-ctl/v4l2-ctl-common.cpp      | 2 ++
>>>  utils/v4l2-ctl/v4l2-ctl-streaming.cpp   | 2 ++
>>>  utils/v4l2-ctl/v4l2-ctl.cpp             | 2 ++
>>>  utils/v4l2-ctl/v4l2-ctl.h               | 2 ++
>>>  utils/v4l2-dbg/v4l2-dbg.cpp             | 2 ++
>>>  18 files changed, 35 insertions(+)
>>>
>>> diff --git a/contrib/xc3028-firmware/firmware-tool.c b/contrib/xc3028-firmware/firmware-tool.c
>>> index 5dd205e0..6bcb3237 100644
>>> --- a/contrib/xc3028-firmware/firmware-tool.c
>>> +++ b/contrib/xc3028-firmware/firmware-tool.c
>>> @@ -29,6 +29,8 @@
>>>  #include <string.h>
>>>  #include <unistd.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <asm/byteorder.h>
>>>  #include <asm/types.h>
>>>
>>> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
>>> index 379629be..5a6326f8 100644
>>> --- a/include/linux/compiler.h
>>> +++ b/include/linux/compiler.h
>>> @@ -1,6 +1,7 @@
>>>  #ifndef __linux_compiler_h
>>>  #define __linux_compiler_h
>>>
>>> +#define __SANE_USERSPACE_TYPES__
>>
>> Please add a comment before this define, explaining why it is needed.
>>
>> Basically the same as what you wrote in the commit log.
>>
>> But this is in the wrong header: it should go into include/compiler.h.
>> The linux/compiler.h header was used in just a single test application,
>> and in fact it is no longer needed and has been effectively obsolete for
>> quite a long time. I just removed it from v4l-utils.
> I actually wonder if it would be better to add as a compile flag in meson.

I agree with that. I think I saw other projects do it like that, e.g.:

https://patchwork.yoctoproject.org/project/oe-core/patch/20220313195204.3828846-1-raj.khem@gmail.com/

Regards,

	Hans

>>
>> Regards,
>>
>>         Hans
>>
>>>  #define __user
>>>
>>>  #endif
>>> diff --git a/utils/cec-compliance/cec-compliance.h b/utils/cec-compliance/cec-compliance.h
>>> index aae72842..d5bd1d0a 100644
>>> --- a/utils/cec-compliance/cec-compliance.h
>>> +++ b/utils/cec-compliance/cec-compliance.h
>>> @@ -8,6 +8,8 @@
>>>  #ifndef _CEC_COMPLIANCE_H_
>>>  #define _CEC_COMPLIANCE_H_
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/cec-funcs.h>
>>>  #include "cec-htng-funcs.h"
>>>
>>> diff --git a/utils/cec-ctl/cec-ctl.cpp b/utils/cec-ctl/cec-ctl.cpp
>>> index fb38320d..a2ffcb2b 100644
>>> --- a/utils/cec-ctl/cec-ctl.cpp
>>> +++ b/utils/cec-ctl/cec-ctl.cpp
>>> @@ -21,6 +21,8 @@
>>>  #include <sys/time.h>
>>>  #include <unistd.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/cec-funcs.h>
>>>  #include "cec-htng-funcs.h"
>>>  #include "cec-log.h"
>>> diff --git a/utils/cec-ctl/cec-ctl.h b/utils/cec-ctl/cec-ctl.h
>>> index 2c82bedc..e0692c31 100644
>>> --- a/utils/cec-ctl/cec-ctl.h
>>> +++ b/utils/cec-ctl/cec-ctl.h
>>> @@ -6,6 +6,8 @@
>>>  #ifndef _CEC_CTL_H_
>>>  #define _CEC_CTL_H_
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <cec-info.h>
>>>
>>>  // cec-ctl.cpp
>>> diff --git a/utils/cec-ctl/cec-pin.cpp b/utils/cec-ctl/cec-pin.cpp
>>> index f3500555..0cdc19f7 100644
>>> --- a/utils/cec-ctl/cec-pin.cpp
>>> +++ b/utils/cec-ctl/cec-pin.cpp
>>> @@ -3,6 +3,8 @@
>>>   * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
>>>   */
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <string>
>>>
>>>  #include <linux/cec.h>
>>> diff --git a/utils/cec-follower/cec-processing.cpp b/utils/cec-follower/cec-processing.cpp
>>> index 20c6165c..cc38f143 100644
>>> --- a/utils/cec-follower/cec-processing.cpp
>>> +++ b/utils/cec-follower/cec-processing.cpp
>>> @@ -3,6 +3,8 @@
>>>   * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
>>>   */
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <cerrno>
>>>  #include <cinttypes>
>>>  #include <ctime>
>>> diff --git a/utils/common/v4l2-info.h b/utils/common/v4l2-info.h
>>> index ac227971..eeb7bc6b 100644
>>> --- a/utils/common/v4l2-info.h
>>> +++ b/utils/common/v4l2-info.h
>>> @@ -8,6 +8,8 @@
>>>
>>>  #include <string>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/videodev2.h>
>>>  #include <linux/v4l2-subdev.h>
>>>
>>> diff --git a/utils/cx18-ctl/cx18-ctl.c b/utils/cx18-ctl/cx18-ctl.c
>>> index 8586f72d..7c13b1a3 100644
>>> --- a/utils/cx18-ctl/cx18-ctl.c
>>> +++ b/utils/cx18-ctl/cx18-ctl.c
>>> @@ -34,6 +34,8 @@
>>>  #include <sys/time.h>
>>>  #include <math.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/videodev2.h>
>>>  #include <v4l-getsubopt.h>
>>>
>>> diff --git a/utils/ivtv-ctl/ivtv-ctl.c b/utils/ivtv-ctl/ivtv-ctl.c
>>> index b42b3489..bf36f40b 100644
>>> --- a/utils/ivtv-ctl/ivtv-ctl.c
>>> +++ b/utils/ivtv-ctl/ivtv-ctl.c
>>> @@ -34,6 +34,8 @@
>>>  #include <sys/time.h>
>>>  #include <math.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/videodev2.h>
>>>  #include <v4l-getsubopt.h>
>>>
>>> diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
>>> index 538f4ef3..ba7c7c4d 100644
>>> --- a/utils/keytable/keytable.c
>>> +++ b/utils/keytable/keytable.c
>>> @@ -12,6 +12,8 @@
>>>     GNU General Public License for more details.
>>>   */
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <ctype.h>
>>>  #include <errno.h>
>>>  #include <fcntl.h>
>>> diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c
>>> index 33df0880..f91c1cfa 100644
>>> --- a/utils/media-ctl/media-ctl.c
>>> +++ b/utils/media-ctl/media-ctl.c
>>> @@ -34,6 +34,8 @@
>>>  #include <string.h>
>>>  #include <unistd.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/media.h>
>>>  #include <linux/types.h>
>>>  #include <linux/v4l2-mediabus.h>
>>> diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h
>>> index 3517bd07..2c2b2158 100644
>>> --- a/utils/v4l2-compliance/v4l2-compliance.h
>>> +++ b/utils/v4l2-compliance/v4l2-compliance.h
>>> @@ -26,6 +26,8 @@
>>>  #include <string>
>>>  #include <cstdint>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/videodev2.h>
>>>  #include <linux/v4l2-subdev.h>
>>>  #include <linux/media.h>
>>> diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp
>>> index 1f9cd0fb..ea120eb8 100644
>>> --- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
>>> +++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
>>> @@ -9,6 +9,8 @@
>>>  #include <sys/stat.h>
>>>  #include <sys/sysmacros.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/media.h>
>>>
>>>  #include "v4l2-ctl.h"
>>> diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
>>> index 13bc057d..7af62ec8 100644
>>> --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
>>> +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
>>> @@ -3,6 +3,8 @@
>>>  #include <netdb.h>
>>>  #include <sys/types.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/media.h>
>>>
>>>  #include "compiler.h"
>>> diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
>>> index a64fa514..d8a6c617 100644
>>> --- a/utils/v4l2-ctl/v4l2-ctl.cpp
>>> +++ b/utils/v4l2-ctl/v4l2-ctl.cpp
>>> @@ -27,6 +27,8 @@
>>>  #include <getopt.h>
>>>  #include <sys/epoll.h>
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/media.h>
>>>
>>>  #include "v4l2-ctl.h"
>>> diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
>>> index a1911e80..fd1bd24a 100644
>>> --- a/utils/v4l2-ctl/v4l2-ctl.h
>>> +++ b/utils/v4l2-ctl/v4l2-ctl.h
>>> @@ -1,6 +1,8 @@
>>>  #ifndef _V4L2_CTL_H
>>>  #define _V4L2_CTL_H
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <cstdint>
>>>  #include <linux/videodev2.h>
>>>  #include <linux/v4l2-subdev.h>
>>> diff --git a/utils/v4l2-dbg/v4l2-dbg.cpp b/utils/v4l2-dbg/v4l2-dbg.cpp
>>> index bd08b4cf..1b0d278a 100644
>>> --- a/utils/v4l2-dbg/v4l2-dbg.cpp
>>> +++ b/utils/v4l2-dbg/v4l2-dbg.cpp
>>> @@ -31,6 +31,8 @@
>>>  #include <sys/klog.h>
>>>  #endif
>>>
>>> +#include "linux/compiler.h"
>>> +
>>>  #include <linux/videodev2.h>
>>>  #include <v4l-getsubopt.h>
>>>
>>
diff mbox series

Patch

diff --git a/contrib/xc3028-firmware/firmware-tool.c b/contrib/xc3028-firmware/firmware-tool.c
index 5dd205e0..6bcb3237 100644
--- a/contrib/xc3028-firmware/firmware-tool.c
+++ b/contrib/xc3028-firmware/firmware-tool.c
@@ -29,6 +29,8 @@ 
 #include <string.h>
 #include <unistd.h>
 
+#include "linux/compiler.h"
+
 #include <asm/byteorder.h>
 #include <asm/types.h>
 
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 379629be..5a6326f8 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -1,6 +1,7 @@ 
 #ifndef __linux_compiler_h
 #define __linux_compiler_h
 
+#define __SANE_USERSPACE_TYPES__
 #define __user
 
 #endif
diff --git a/utils/cec-compliance/cec-compliance.h b/utils/cec-compliance/cec-compliance.h
index aae72842..d5bd1d0a 100644
--- a/utils/cec-compliance/cec-compliance.h
+++ b/utils/cec-compliance/cec-compliance.h
@@ -8,6 +8,8 @@ 
 #ifndef _CEC_COMPLIANCE_H_
 #define _CEC_COMPLIANCE_H_
 
+#include "linux/compiler.h"
+
 #include <linux/cec-funcs.h>
 #include "cec-htng-funcs.h"
 
diff --git a/utils/cec-ctl/cec-ctl.cpp b/utils/cec-ctl/cec-ctl.cpp
index fb38320d..a2ffcb2b 100644
--- a/utils/cec-ctl/cec-ctl.cpp
+++ b/utils/cec-ctl/cec-ctl.cpp
@@ -21,6 +21,8 @@ 
 #include <sys/time.h>
 #include <unistd.h>
 
+#include "linux/compiler.h"
+
 #include <linux/cec-funcs.h>
 #include "cec-htng-funcs.h"
 #include "cec-log.h"
diff --git a/utils/cec-ctl/cec-ctl.h b/utils/cec-ctl/cec-ctl.h
index 2c82bedc..e0692c31 100644
--- a/utils/cec-ctl/cec-ctl.h
+++ b/utils/cec-ctl/cec-ctl.h
@@ -6,6 +6,8 @@ 
 #ifndef _CEC_CTL_H_
 #define _CEC_CTL_H_
 
+#include "linux/compiler.h"
+
 #include <cec-info.h>
 
 // cec-ctl.cpp
diff --git a/utils/cec-ctl/cec-pin.cpp b/utils/cec-ctl/cec-pin.cpp
index f3500555..0cdc19f7 100644
--- a/utils/cec-ctl/cec-pin.cpp
+++ b/utils/cec-ctl/cec-pin.cpp
@@ -3,6 +3,8 @@ 
  * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  */
 
+#include "linux/compiler.h"
+
 #include <string>
 
 #include <linux/cec.h>
diff --git a/utils/cec-follower/cec-processing.cpp b/utils/cec-follower/cec-processing.cpp
index 20c6165c..cc38f143 100644
--- a/utils/cec-follower/cec-processing.cpp
+++ b/utils/cec-follower/cec-processing.cpp
@@ -3,6 +3,8 @@ 
  * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  */
 
+#include "linux/compiler.h"
+
 #include <cerrno>
 #include <cinttypes>
 #include <ctime>
diff --git a/utils/common/v4l2-info.h b/utils/common/v4l2-info.h
index ac227971..eeb7bc6b 100644
--- a/utils/common/v4l2-info.h
+++ b/utils/common/v4l2-info.h
@@ -8,6 +8,8 @@ 
 
 #include <string>
 
+#include "linux/compiler.h"
+
 #include <linux/videodev2.h>
 #include <linux/v4l2-subdev.h>
 
diff --git a/utils/cx18-ctl/cx18-ctl.c b/utils/cx18-ctl/cx18-ctl.c
index 8586f72d..7c13b1a3 100644
--- a/utils/cx18-ctl/cx18-ctl.c
+++ b/utils/cx18-ctl/cx18-ctl.c
@@ -34,6 +34,8 @@ 
 #include <sys/time.h>
 #include <math.h>
 
+#include "linux/compiler.h"
+
 #include <linux/videodev2.h>
 #include <v4l-getsubopt.h>
 
diff --git a/utils/ivtv-ctl/ivtv-ctl.c b/utils/ivtv-ctl/ivtv-ctl.c
index b42b3489..bf36f40b 100644
--- a/utils/ivtv-ctl/ivtv-ctl.c
+++ b/utils/ivtv-ctl/ivtv-ctl.c
@@ -34,6 +34,8 @@ 
 #include <sys/time.h>
 #include <math.h>
 
+#include "linux/compiler.h"
+
 #include <linux/videodev2.h>
 #include <v4l-getsubopt.h>
 
diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
index 538f4ef3..ba7c7c4d 100644
--- a/utils/keytable/keytable.c
+++ b/utils/keytable/keytable.c
@@ -12,6 +12,8 @@ 
    GNU General Public License for more details.
  */
 
+#include "linux/compiler.h"
+
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c
index 33df0880..f91c1cfa 100644
--- a/utils/media-ctl/media-ctl.c
+++ b/utils/media-ctl/media-ctl.c
@@ -34,6 +34,8 @@ 
 #include <string.h>
 #include <unistd.h>
 
+#include "linux/compiler.h"
+
 #include <linux/media.h>
 #include <linux/types.h>
 #include <linux/v4l2-mediabus.h>
diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h
index 3517bd07..2c2b2158 100644
--- a/utils/v4l2-compliance/v4l2-compliance.h
+++ b/utils/v4l2-compliance/v4l2-compliance.h
@@ -26,6 +26,8 @@ 
 #include <string>
 #include <cstdint>
 
+#include "linux/compiler.h"
+
 #include <linux/videodev2.h>
 #include <linux/v4l2-subdev.h>
 #include <linux/media.h>
diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp
index 1f9cd0fb..ea120eb8 100644
--- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
@@ -9,6 +9,8 @@ 
 #include <sys/stat.h>
 #include <sys/sysmacros.h>
 
+#include "linux/compiler.h"
+
 #include <linux/media.h>
 
 #include "v4l2-ctl.h"
diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
index 13bc057d..7af62ec8 100644
--- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
@@ -3,6 +3,8 @@ 
 #include <netdb.h>
 #include <sys/types.h>
 
+#include "linux/compiler.h"
+
 #include <linux/media.h>
 
 #include "compiler.h"
diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
index a64fa514..d8a6c617 100644
--- a/utils/v4l2-ctl/v4l2-ctl.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl.cpp
@@ -27,6 +27,8 @@ 
 #include <getopt.h>
 #include <sys/epoll.h>
 
+#include "linux/compiler.h"
+
 #include <linux/media.h>
 
 #include "v4l2-ctl.h"
diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
index a1911e80..fd1bd24a 100644
--- a/utils/v4l2-ctl/v4l2-ctl.h
+++ b/utils/v4l2-ctl/v4l2-ctl.h
@@ -1,6 +1,8 @@ 
 #ifndef _V4L2_CTL_H
 #define _V4L2_CTL_H
 
+#include "linux/compiler.h"
+
 #include <cstdint>
 #include <linux/videodev2.h>
 #include <linux/v4l2-subdev.h>
diff --git a/utils/v4l2-dbg/v4l2-dbg.cpp b/utils/v4l2-dbg/v4l2-dbg.cpp
index bd08b4cf..1b0d278a 100644
--- a/utils/v4l2-dbg/v4l2-dbg.cpp
+++ b/utils/v4l2-dbg/v4l2-dbg.cpp
@@ -31,6 +31,8 @@ 
 #include <sys/klog.h>
 #endif
 
+#include "linux/compiler.h"
+
 #include <linux/videodev2.h>
 #include <v4l-getsubopt.h>