Date: Fri, 25 Oct 1996 18:03:16 +1000 From: Bruce Evans <bde@zeta.org.au> To: bde@freefall.freebsd.org, peter@spinner.DIALix.COM Cc: cvs-all@freefall.freebsd.org, CVS-committers@freefall.freebsd.org, cvs-lib@freefall.freebsd.org, cvs-sbin@freefall.freebsd.org Subject: Re: cvs commit: src/lib/libmd mdXhl.c src/sbin/md5 md5.c Message-ID: <199610250803.SAA11209@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
>> Modified: lib/libmd mdXhl.c
>> sbin/md5 md5.c
>> Log:
>> Moved #include of <sys/types.h> earlier so that this compiles when
>> <stdio.h> doesn't (bogusly) include <sys/types.h>.
>
>Bogus it may be, but if we're even going to pretend that we are trying to
>conform to important standards where possible (such as Spec1170 aka the
>"Single Unix" spec), stdio.h and all the other major include files _must_
>be self contained. POSIX may not require it, but the X/Open stuff does.
If we're going to pretend to be ANSI and POSIX conformant, then standard
headers must not include massive namespace pollution from other headers.
POSIX specifies that only a few names in the application namespace may
be defined in <sys/types.h>:
1. dev_t, gid_t, ino_t, mode_t, nlink_t, off_t, pid_t, size_t, ssize_t, uid_t
2. all other names ending with _t (this applies all POSIX headers)
(2) says that including <sys/types.h> in any POSIX header is OK provided
<sys/types.h> doesn't define any junk. The FreeBSD <sys/types.h>
defines a lot of junk :-(. See my list posted a few months ago.
Even if _POSIX_SOURCE is defined, the junk includes everything in
<machine/endian.h>.
Even if <sys/types.h> were clean, it isn't convenient to depend on it to
define enough types in POSIX headers that are also specified ANSI, because
it can't be included in the _ANSI_SOURCE case (if we pretend to be ANSI
conformant) unless it has zillions of ifdefs to prevent exportation of
the non-ANSI parts in the _ANSI_SOURCE case, and then it would still need
to define the necessary types in the implementation namespace, but we can
types in the implementation namespace just by including <machine/ansi.h>.
The problem in <stdio.h> is that fpos_t needs to be the same as off_t,
but off_t is not allowed in the ANSI namespace.
Of course headers should be self-contained. The ones defined by ANSI
are specified to be self-contained, although the POSIX ones aren't.
Here are my diffs for making stdio.h self contained. I've been using
essentially the same version for 3 years now.
Bruce
diff -c2 stdio.h~ stdio.h
*** stdio.h~ Wed Jul 3 17:15:02 1996
--- stdio.h Tue May 28 02:34:06 1996
***************
*** 40,50 ****
#define _STDIO_H_
- #if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
- #include <sys/types.h>
- #endif
-
#include <sys/cdefs.h>
-
#include <machine/ansi.h>
#ifdef _BSD_SIZE_T_
typedef _BSD_SIZE_T_ size_t;
--- 40,46 ----
#define _STDIO_H_
#include <sys/cdefs.h>
#include <machine/ansi.h>
+
#ifdef _BSD_SIZE_T_
typedef _BSD_SIZE_T_ size_t;
***************
*** 68,72 ****
*/
#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
! typedef off_t fpos_t;
#else
typedef struct __sfpos {
--- 64,68 ----
*/
#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
! typedef _BSD_OFF_T_ fpos_t;
#else
typedef struct __sfpos {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199610250803.SAA11209>
