Re: BUG: "machine/types.h" not protected by multiple #include

Corinna Vinschen via Cygwin <[email protected]>
Newsgroups gmane.os.cygwin
Message-ID <[email protected]>
On Feb 14 20:41, Carlo B. via Cygwin wrote:
> Hello,
> while compiling libsrtp2, I got this error:
> 
> /usr/include/machine/types.h:35:8: error: redefinition of ‘struct flock’
>    35 | struct flock {
>       |        ^~~~~
> In file included from /usr/include/sys/types.h:222,
>                  from
> ../gstreamer/subprojects/libsrtp-2.7.0/crypto/include/integers.h:60:
> /usr/include/machine/types.h:35:8: note: originally defined here
>    35 | struct flock {
>       |        ^~~~~
> 
> This happens because into the library there is this code:
> 
> <--- CUT --->
> #ifdef HAVE_SYS_TYPES_H
> #include <sys/types.h>
> #endif
> #ifdef HAVE_MACHINE_TYPES_H
> #include <machine/types.h>
> #endif
> <--- CUT --->
> 
> The first inclusion of "sys/types.h" includes also "machine/types.h"
> and this is ok.
> Next, the second directive includes again "machine/types.h" and here
> it generates the error.

Directly including machine/types.h is wrong.  This is a header meant
to be only included via sys/types.h.  It contains this test at the
start of the file:

#ifndef _SYS_TYPES_H
#error "must be included via <sys/types.h>"
#endif /* !_SYS_TYPES_H */

Check this against the files in /usr/include/bits from GLibc.
Many of those files are not guarded against multiple inclusions
either.

Yes, we could guard machine/types.h against multiple inclusion,
but the right thing to do would be to change the above code to
never include machine/types.h.

And if you really think you can't do without, add an #else at least:

  #ifdef HAVE_SYS_TYPES_H
  #include <sys/types.h>
  #elif defined(HAVE_MACHINE_TYPES_H)
  #include <machine/types.h>
  #endif


Corinna

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.