Thanks Rich.

I thought that BSDWAIT was defined in one of the standard headers.

You are right about where BSDWAIT is defined, but now I am back to how should I write the "ifdef" ?

I could use !(defined(__ANDROID__) || (defined(__linux__)&& !defined(__GLIBC__)))  in the place of "if !defined(__ANDROID__)", but then things might go wrong for uclibc and other libcs.

If I understand you correctly, all new implementations should use int instead of union, so above ifdef should be a workable solution.

#if defined(_BSD) || (defined(IRIS4D) && __STDC__) || defined(__lucid) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
# if !defined(__ANDROID__)
#  define BSDWAIT
# endif
#endif /* _BSD || (IRIS4D && __STDC__) || __lucid || glibc */

Regards
Paul



On Fri, Jun 21, 2013 at 5:52 PM, Rich Felker <dalias@aerifal.cx> wrote:
On Fri, Jun 21, 2013 at 11:19:01AM +0200, Paul Schutte wrote:
> Good day,
>
> I just want to know what would be right approach to fixing the compile
> error in tcsh.
>
> I use the source code at ftp://ftp.astron.com/pub/tcsh/tcsh-6.18.01.tar.gz
>
> I get the following error:
> gcc -c -g -O2 -I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'    sh.proc.c
> sh.proc.c: In function 'pchild':
> sh.proc.c:155:16: error: storage size of 'w' isn't known
> make: *** [sh.proc.o] Error 1
>
> Those lines are:
>
> #ifdef BSDWAIT
>     union wait w;
> #else /* !BSDWAIT */
>     int     w;
> #endif /* !BSDWAIT */
>
>
> If I just use
>
> //#ifdef BSDWAIT
> //    union wait w;
> //#else /* !BSDWAIT */
>     int     w;
> //#endif /* !BSDWAIT */
>
> it compiles and works (for months now without an issue).
>
>
> My question really is what should the proper "ifdef" be if I want to send
> the fix to the tcsh maintainers ?

Where is BSDWAIT defined? That's the location of the relevant ifdef.
Using "union wait" on any Linux system, glibc ones included, is wrong;
glibc just included gcc-specific hacks in the declaration of wait and
waitpid to allow them to accept "union wait *" instead of "int *" if
necessary. I suspect defined(__linux__) leads to #define BSDWAIT, in
which case this should just be fixed.

With that said, using "union wait" at all is nonsensical. As the
standards require the argument to be int *, any modern BSD should work
fine with int *. In case there are historical ones that prototype
the functions with union wait *, it might work to simply declare "w"
as int and cast it to (void *) when passing it to the functions.

Rich