This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Problem including Cygwin header files.


Hi all.

I have run into a strange problem that seems to be some sort of
incompatibility between Cygwin's header files and the header
files used by VC++ and Gygwin with the -mno-cygwin flag.
The problem shows up when #including the <winsock.h> header:

% cat t.c
#include <winsock.h>

int main() {
  return 0;
}

It works just fine with VC++ or Cygwin in mingw mode:

% cl -c t.c
% gcc -c -mno-cygwin t.c

But this blows up under Cygwin:

% gcc -c t.c
/usr/include/w32api/winsock.h:28: parse error before SOCKET
/usr/include/w32api/winsock.h:28: warning: data definition has no type or 
storage class
... (The compiler errors go on after that) ...


The line of code on line 28 of winsock.h is:

typedef u_int    SOCKET;

The problem seems to be related to the <sys/types.h> include.
If you add a "#include <sys/types.h>" to the top of t.c, it
will compile as expected. Thing is, I am not sure if this
is correct. If you poke around in winsock.h you will find
some code like so:

#if !defined( _BSDTYPES_DEFINED ) && !defined( _SYS_TYPES_H )
/* also defined in gmon.h and in cygwin's sys/types */
typedef unsigned char	u_char;
typedef unsigned short	u_short;
typedef unsigned int	u_int;
typedef unsigned long	u_long;
#define _BSDTYPES_DEFINED
#endif /* ndef _BSDTYPES_ _SYS_TYPES_H */

typedef u_int	SOCKET;

This block seems to want to define these u_* types
when winsock.h is pulled in by itself. If you look
at the /usr/include/sys/types.h file for Cygwin
it includes a block that defines these types
except in the case where <sys/types.h> is pulled in
from the winsock.h file (when _WINSOCK_H) if defined.

Thing is, the !defined( _SYS_TYPES_H ) check is
not going to do this since <sys/types.h> is getting
pulled in by the include of <windows.h> earlier in
the file.

At that point, I deleted the && !defined( _SYS_TYPES_H )
check and tried to compile things again. That fixed
the first problem but I still get this error:

% gcc -c t.c
In file included from t.c:6:
/usr/include/w32api/winsock.h:494: parse error before 'fd_set'

Looking at the sys/types.h again, I found the following comment:

"We don't define fd_set and friends if we are compiling POSIX
 source, or if we have included the Windows Sockets.h header
 (which defines Windows versions of them)."

At this point I am kind of stuck. Am I on the right track
with this earlier change? Is this some nasty incompatibility
between the VC++ version of winsock.h and the w32api version?
I am kind of at a loss about where to go from here, so if
someone that knows a little more about these header file
issues could give me a pointer it would really help.

thanks
Mo DeJong
Red Hat Inc

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]