This is the mail archive of the cygwin 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]
Other format: [Raw text]

Re: Define _POSIX_SOURCE in cygwin's features.h?


Hi,

Christopher Faylor, le Thu 12 Jan 2006 13:47:10 -0500, a écrit :
> Just to add even more clarification, this wasn't some guy writing a
> program for his class assignment.  It was someone trying to port a
> standard linux/unix application.

If he doesn't define _POSIX_SOURCE for getting function definitions, his
application isn't a standard unix one.

> The program had a test for _POSIX_SOURCE which would have worked
> correctly under Cygwin.  Again, I'm not really interested in hearing
> what someone should have done or should have known to do.

Christopher Faylor, le Thu 12 Jan 2006 14:24:23 -0500, a écrit :
> This particular application was ircd.  It was testing _POSIX_SOURCE (and
> a few other defines) to determine whether it should use setsid or a
> two-argument version of setpgrp, e.g.:
> 
> #ifdef _POSIX_SOURCE
>     setsid ();
> #else
>     setpgrp(..., ...);
> #endif

Testing for _POSIX_SOURCE _doesn't_ make sense. Read a posix book. One
of the first things it would tell you is that you must define
_POSIX_SOURCE yourself for pulling posix function definitions & such.

If a programmer wants to determine whether setsid or setpgr can be used,
he can just use an autoconf rule for that. I repeat: read posix, testing
for _POSIX_SOURCE does _not_ make sense in a program.

Christopher Faylor, le Thu 12 Jan 2006 13:53:50 -0500, a écrit :
> >I don't see why we should try and fix this in cygwin.
> >
> >Consider how many times people come here and say "My app works fine on
> >Linux, how come it just dies with a SEGV on cygwin" and someone points
> >out the trivially obvious buffer overrun and we have to explain how it
> >only ever worked on Linux by luck because of differences in the
> >environment and the way the stack is set up.
> 
> If I could easily make cygwin behave exactly the same way so that a
> buffer overrun that worked on linux went undetected on cygwin, too, I'd
> do that.  If there was some linker option to ensure that, I'd use it.

This is /weird/. Reproducing bugs is just silly ! 8!

> It turns out that _POSIX_SOURCE *is* turned on by default on in glibc
> regardless of whether you define _GNU_SOURCE or not.  So that would
> explain why this application built.
> 
> Apparently _POSIX_SOURCE is turned on by this segment of features.h:
> 
>   #if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \
>        !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
>   # define _POSIX_SOURCE  1
>   # if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500
>   #  define _POSIX_C_SOURCE       2
>   # else
>   #  define _POSIX_C_SOURCE       199506L
>   # endif
>   #endif

Ok, now _this_ makes sense. This is a lazyness of GNU people: gcc
is _not_ an ansi compiler, only gcc -ansi is ; and in that case
__STRICT_ANSI__ is defined for headers to avoid defining things like
_POSIX_C_SOURCE themselves.

Since cygwin uses the gcc compiler, these few lines should _indeed_ be
added to features.h. But not more !

(BTW, that means that ircd can only be compiled with a gcc compiler, not
an ansi compiler).

> I was wondering if anyone had specific examples where defining
> _POSIX_SOURCE would help or hurt existing applications.

It can hurt:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
static const char *confstr(num)
	unsigned int num;
{
	static const char *strs[] = { "foo", "bar", "baz" };
	if (num >= sizeof(strs)/sizeof(*strs))
		return "unknown";
	return strs[num];
}
int main(argc, argv)
	int argc;
	char *argv[];
{
	char *conf;
	argv++;
	while ((conf = *(argv++)))
		puts(confstr(atoi(conf)));
	return 0;
}

This program is a perfectly valid ansi C program:
$ gcc test.c -o test -ansi -Wall -pedantic
It compiles fine with ansi C compilers.

But it is not a valid posix C program:
$ gcc test.c -o test
test.c:5: error: conflicting types for 'confstr'
/usr/include/unistd.h:544: error: previous declaration of 'confstr' was here

So, does cygwin want gcc to be by default an ansi compiler or a posix
compiler?

Regards,
Samuel

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.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]