Patchwork [21/25] Don’t include sys/types.h or stdint.h from most public headers.

login
register
mail settings
Submitter Zack Weinberg
Date June 26, 2019, 5:50 p.m.
Message ID <20190626175029.4699-12-zackw@panix.com>
Download mbox | patch
Permalink /patch/33442/
State New
Headers show

Comments

Zack Weinberg - June 26, 2019, 5:50 p.m.
Many public headers include sys/types.h and/or stdint.h when they only
need and/or are supposed to define a small number of types from that
header.  This patch changes as many of them as practical to include
only the single-type headers for the types they are actually specified
to define, and use the impl-namespace aliases for any types they need
but are not specified to define.  In most cases, where a header has
historically used uintN_t types, I changed it to use __uintN_t types;
in a few cases I chose to have it continue to define the complete set
of those types (using <bits/stdint-uintn.h>).

After this patch, the public headers that still include sys/types.h are:
stdlib.h and sys/param.h, where removal would risk breaking far too much;
the inclusion of sys/types.h; regex.h, which is taken verbatim from
gnulib and can't include features.h directly (I'm open to better ideas);
sys/bitypes.h, which is an alternative name for sys/types.h; and
the networking headers, which will be dealt with separately.  The headers
that still include stdint.h are: inttypes.h, as required by ISO C;
elf.h and thread_db.h, see discussion of debugger interface headers below;
and, again, the networking headers will be dealt with separately.

While I was at it, I moved headers out of sysdeps where possible: If
we have only a sysdeps/generic/something.h or sysdeps/gnu/something.h,
no other sysdeps variants, it is not really system-dependent and can
be moved to the directory that installs it.  If we have both
sysdeps/generic/ and gnu/something.h, the generic version is never
used (since we support only GNUish systems these days) and can be
deleted, and the gnu-version can be moved to the directory that
installs it.  If the only copy of a bits header is in the
top-level bits directory, it is not system-dependent.

For utmp.h and utmpx.h, I think we might be able to fold their
respective bits headers into the primary headers and make them not
system-dependent at all.  The remaining variation is between
s390*-*-linux* and everything else, and it appears to me that the s390
versions of the bits headers are actually the headers that everyone
should be using.  The only difference is that the s390 headers
unconditionally use 64-bit quantities for lastlog.ll_time,
utmp{,x}.ut_tv, and utmp{,x}.ut_session, whereas the generic headers
use either 64- or 32-bit quantities depending on
__WORDSIZE_TIME64_COMPAT32.  I could be wrong, but I don’t think it
makes sense for programs with 64-bit and 32-bit time_t to have
different ideas of the layout of a structures that are copied directly
to and from a shared file on disk.  But fixing that doesn’t belong in
this patch series.

The conform tests expect utmpx.h to define time_t and suseconds_t.
These are the public names for the types of the fields of struct
timeval, and utmpx.h is required to define struct timeval, so this is
a reasonable expectation even though POSIX doesn't _explicitly_ say
it's also required to define time_t and suseconds_t.  utmp.h is not a
standard header but it makes sense for it to be as consistent with
utmpx.h as possible, especially in our implementation where
/var/log/utmp and /var/log/utmpx have the same format.

I thought I was going to need to change all of the arch-specific
bits/epoll.h headers as well as sys/epoll.h, but it turned out not to
be necessary.  I still took the opportunity to give them all multiple
inclusion guards.

I suspect we do not need as many copies of bits/fcntl.h and bits/sem.h
as we have, but that’s complicated enough that it deserves its own patchset.

The debugger interface headers are a mess and I only have so much
patience for them.  This does the bare minimum required for
thread_db.h, sys/procfs.h, and sys/user.h, which are at least
nominally cross-platform interfaces, to avoid including sys/types.h,
sys/time.h, and/or signal.h.  Exposure of sys/ucontext.h is reduced
but not eliminated.  Cross-architecture consistency should be improved.
It would be desirable to stop including stdint.h from elf.h and
thread_db.h as well, but that would involve touching dozens more
bits headers and I ran out of patience.

Git does not understand “remove file X and then rename file Y over the
top of it” very well, so the diff looks bigger than it should.

This is another partial fix for Hurd-specific bug 23088.  The headers
that are still affected by that bug are aio.h, mqueue.h, regex.h,
signal.h, stdlib.h, and sys/types.h.

	* io/ftw.h: Don't include sys/types.h.
	* misc/sys/uio.h: Don't include sys/types.h.
	Include bits/types.h, bits/types/size_t.h, and bits/types/ssize_t.h.
	* posix/spawn.h: Don't include sys/types.h.
	Include bits/types.h, bits/types/mode_t.h, and bits/types/pid_t.h.
	* rt/aio.h: Don't include sys/types.h.
	Include bits/types.h, bits/pthreadtypes.h,
	bits/types/size_t.h, and bits/types/ssize_t.h.
	* sysdeps/pthread/semaphore.h: Don't include sys/types.h.
	* sysdeps/unix/sysv/linux/bits/uio-ext.h: Use __pid_t, not pid_t.

	* sysdeps/generic/netinet/in_systm.h: Rename to
	inet/netinet/in_systm.h.  Include bits/stdint-uintn.h,
	not sys/types.h or stdint.h.
	* sysdeps/generic/netinet/ip.h: Rename to
	inet/netinet/ip.h.  Include bits/stdint-uintn.h and
	bits/endian.h, not sys/types.h.
	* sysdeps/gnu/netinet/tcp.h: Rename to
	inet/netinet/tcp.h. Include bits/stdint-uintn.h and
	bits/endian.h, not sys/types.h or stdint.h.
	* sydeps/gnu/net/if.h: Rename to socket/net/if.h.
	Don’t include sys/types.h.

	* include/net/if.h: Include socket/net/if.h, rather than
	whatever the next net/if.h on the include path is.
	* include/netinet/in_systm.h, include/netinet/ip.h
	* include/netinet/tcp.h: New trivial wrappers.

	* sysdeps/generic/net/if.h: Delete, never used.
	* sysdeps/generic/netinet/tcp.h: Delete, never used.

	* bits/utmp.h: Delete file.
        * sysdeps/gnu/bits/utmp.h: Move to bits/utmp.h.
        Add multiple include guard.
        Don’t include paths.h, sys/time.h, or sys/types.h.
        Don’t use struct timeval.
        Use __intN_t for consistency with bits/utmpx.h.
        * sysdeps/unix/sysv/linux/s390/bits/utmp.h: Add multiple include guard.
        Don’t include paths.h, sys/time.h, sys/types.h, or bits/wordsize.h.
        Don’t use struct timeval.
        Use __intN_t for consistency with bits/utmpx.h.
        Use __time64_t unconditionally for lastlog.ll_time.
        Use __int64_t unconditionally for utmp.ut_session.
        Adjust indentation and blank lines to match bits/utmp.h.

        * sysdeps/gnu/bits/utmpx.h: Move to bits/utmpx.h.
        Add multiple include guard.
        Don’t include paths.h, sys/time.h, bits/types.h, or bits/wordsize.h.
        Don’t define _PATH_UTMPX or _PATH_WTMPX.
        Don’t use struct timeval.
        Use pid_t for consistency with bits/utmp.h.
        * sysdeps/unix/sysv/linux/s390/bits/utmpx.h: Add multiple include guard.
        Don’t define _PATH_UTMPX or _PATH_WTMPX.
        Don’t include paths.h, sys/time.h, bits/types.h, or bits/wordsize.h.
        Don’t define _PATH_UTMPX or _PATH_WTMPX.
        Don’t use struct timeval.
        Use pid_t for consistency with bits/utmp.h.
        Use __int64_t unconditionally for utmpx.ut_session.

        * login/utmp.h: Don’t include sys/types.h.
        Do include paths.h, bits/types.h, bits/types/pid_t.h,
        bits/types/suseconds_t, bits/types/time_t.h, and
        bits/types/struct_timeval.h.
        Move __BEGIN_DECLS to enclose only prototypes.

        * sysdeps/gnu/utmpx.h: Move to login/utmpx.h.
        Don’t include sys/time.h.  Do include bits/types.h,
        bits/types/suseconds_t, bits/types/time_t.h, and
        bits/types/struct_timeval.h.
        When __USE_GNU, include paths.h and define _PATH_UTMPX and _PATH_WTMPX.

        * login/Makefile (headers): Add utmpx.h and bits/utmpx.h.
        (routines): Add endutxent, getutmp, getutmpx, getutxent,
        getutxid, getutxline, pututxline, setutxent, updwtmpx, and
        utmpxname.  Reorganize.
        * sysdeps/gnu/Makefile: Do not add anything to sysdep_routines
        or sysdep_headers when subdir == login.

	* sysdeps/gnu/sys/mtio.h: Move to misc/sys/mtio.h.
	Don't include sys/types.h.
	* sysdeps/gnu/Makefile: Don't add anything to sysdep_headers
	for the misc directory.
	* misc/Makefile (headers): Add sys/mtio.h.
	* include/sys/mtio.h: New wrapper.

	* elf/link.h, inet/aliases.h, misc/sys/xattr.h:
	Don't include sys/types.h.  Include bits/types/size_t.h.

	* gmon/sys/gmon.h: Don't include sys/types.h.
	* gmon/sys/profil.h: Don't include sys/types.h.
	Include bits/types/size_t.h and bits/types/struct_timeval.h.
	* io/fts.h: Don't include sys/types.h.
	Include bits/types/dev_t.h, bits/types/ino_t.h, bits/types/ino64_t.h,
	and bits/types/nlink_t.h.
	* io/sys/sendfile.h: Don't include sys/types.h.
	Include bits/types.h, bits/types/off_t.h, bits/types/size_t.h,
	and bits/types/ssize_t.h.
	* stdlib/sys/random.h: Don't include sys/types.h.
	Include bits/types/size_t.h and bits/types/ssize_t.h.

	* gmon/tst-sprofil.h: Include sys/time.h.
	* sysdeps/mach/hurd/sendfile.c: Include sys/types.h.

	* sysdeps/unix/sysv/linux/sys/epoll.h: Don’t include stdint.h
	or sys/types.h.  Do include features.h and bits/types.h.
	(union epoll_data, struct epoll_event): Use __uint32_t and
	__uint64_t for field types.

	* sysdeps/unix/sysv/linux/alpha/bits/epoll.h
	* sysdeps/unix/sysv/linux/bits/epoll.h
	* sysdeps/unix/sysv/linux/hppa/bits/epoll.h
	* sysdeps/unix/sysv/linux/mips/bits/epoll.h
	* sysdeps/unix/sysv/linux/sparc/bits/epoll.h
	* sysdeps/unix/sysv/linux/x86/bits/epoll.h:
	Add multiple inclusion guard.

	* sysdeps/unix/sysv/linux/alpha/sys/acct.h: Style fix.
	* sysdeps/unix/sysv/linux/sys/acct.h: Include features.h
	and bits/stdint-uintn.h.  Don't include sys/types.h, stdint.h,
	or bits/types/time_t.h.

	* sysdeps/unix/sysv/linux/sys/fsuid.h
	* sysdeps/unix/sysv/linux/sys/quota.h
	Include bits/types.h, not sys/types.h.

	* sysdeps/nptl/sys/procfs.h: Include features.h and bits/types.h,
	not sys/types.h.
	* sysdeps/nptl/thread_db.h: Don’t include sys/types.h.
	* sysdeps/nptl/proc_service.h: Include bits/types/pid_t.h and
	bits/types/size_t.h.

	* sysdeps/unix/sysv/linux/sys/procfs.h: Include bits/types.h and
	bits/types/struct_timeval.h, not sys/time.h or sys/types.h.

	* sysdeps/unix/sysv/linux/aarch64/bits/procfs.h: Add multiple
	inclusion guard.  Include bits/types.h.  Correct a comment.

	* sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h:
	Add multiple inclusion guard.  Include sys/ucontext.h.

	* sysdeps/unix/sysv/linux/alpha/bits/procfs.h
	* sysdeps/unix/sysv/linux/sparc/bits/procfs.h
	Add multiple inclusion guard.  Don’t include signal.h or sys/ucontext.h.
	* sysdeps/unix/sysv/linux/ia64/bits/procfs.h:
        Add multiple inclusion guard.  Include sys/ucontext.h, not signal.h.
	* sysdeps/unix/sysv/linux/powerpc/bits/procfs.h:
        Add multiple inclusion guard.  Don’t include signal.h or
	sys/ucontext.h.  Include bits/wordsize.h and asm/elf.h.
	Adjust conditional for whether to provide various fallback
	definitions.

	* sysdeps/unix/sysv/linux/arm/bits/procfs.h
	* sysdeps/unix/sysv/linux/csky/bits/procfs.h
	* sysdeps/unix/sysv/linux/hppa/bits/procfs.h
	* sysdeps/unix/sysv/linux/m68k/bits/procfs.h
	* sysdeps/unix/sysv/linux/microblaze/bits/procfs.h
	* sysdeps/unix/sysv/linux/mips/bits/procfs.h
	* sysdeps/unix/sysv/linux/nios2/bits/procfs.h
	* sysdeps/unix/sysv/linux/riscv/bits/procfs.h
	* sysdeps/unix/sysv/linux/s390/bits/procfs.h
	* sysdeps/unix/sysv/linux/sh/bits/procfs.h
	* sysdeps/unix/sysv/linux/x86/bits/procfs.h:
        Add multiple inclusion guard.  Improve commentary.

	* sysdeps/posix/dl-fileid.h (r_file_id): Use __dev_t and __ino64_t
	for field types.

	* nss/nss.h
	* sysdeps/powerpc/sys/platform/ppc.h
	* sysdeps/unix/sysv/linux/sys/eventfd.h
	* sysdeps/unix/sysv/linux/sys/fanotify.h
	* sysdeps/unix/sysv/linux/sys/inotify.h
	* sysdeps/unix/sysv/linux/sys/raw.h
	* sysdeps/unix/sysv/linux/sys/signalfd.h:
	Include bits/types.h, not stdint.h.
	Include features.h where not already doing so.
	Use __(u)intN_t types instead of (u)intN_t types in all
	declarations.

	* sysdeps/unix/sysv/linux/powerpc/bits/powerpc.h:
	Use __uint64_t instead of uint64_t.
	* nss/tst-nss-test4.c: Include stdint.h.

	* bits/fcntl.h: Add multiple include guard.  Hoist inclusion of
	bits/types.h to top of file.
	* sysdeps/mach/hurd/bits/fcntl.h: Add multiple include guard.
	Include bits/types.h, not sys/types.h; remove redundant inclusion
	of bits/types.h in middle of file.

	* bits/sem.h: Add multiple include guard.  Include bits/types.h,
	not sys/types.h.
	* sysdeps/gnu/bits/sem.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/sem.h: Likewise.
	* sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise.
	* sysvipc/sys/sem.h: Include bits/types/pid_t.h and
	bits/types/time_t.h.

	* resolv/bits/types/res_state.h: Include bits/types.h, not
	sys/types.h.  Use __uint32_t and __uint16_t, not uint32_t and
	uint16_t.

	* sysdeps/mach/hurd/bits/socket.h: Include bits/types.h, not
	sys/types.h.
	* sysdeps/unix/sysv/linux/bits/socket.h: Likewise.  Use __pid_t,
	__uid_t, and __gid_t, not pid_t, uid_t, and gid_t.
	* socket/sys/socket.h: Include bits/types.h, bits/types/ssize_t.h,
	and bits/types/socklen_t.h.
	* inet/htonl.c, include/htons.c: Include endian.h.
	* include/netinet/ether.h: Include bits/types/size_t.h.

	* scripts/check-obsolete-constructs.py
	(HEADER_ALLOWED_INCLUDES, SYSDEP_ALLOWED_INCLUDES): Update.

	* sysdeps/mach/hurd/i386/Makefile: Update list of xfails for
        bug 23088.
---
 bits/fcntl.h                                  |   9 +-
 bits/sem.h                                    |   7 +-
 {sysdeps/gnu/bits => bits}/utmp.h             |  32 ++++--
 {sysdeps/gnu/bits => bits}/utmpx.h            |  35 +++---
 elf/link.h                                    |   2 +-
 gmon/sys/gmon.h                               |   2 -
 gmon/sys/profil.h                             |   4 +-
 gmon/tst-sprofil.c                            |   1 +
 include/net/if.h                              |   2 +-
 include/netinet/ether.h                       |   1 +
 include/netinet/in_systm.h                    |   1 +
 include/netinet/ip.h                          |   1 +
 include/netinet/tcp.h                         |   1 +
 include/sys/mtio.h                            |   1 +
 include/utmpx.h                               |   1 +
 inet/aliases.h                                |   4 +-
 inet/htonl.c                                  |   3 +-
 inet/htons.c                                  |   2 +
 {sysdeps/generic => inet}/netinet/in_systm.h  |   3 +-
 {sysdeps/generic => inet}/netinet/ip.h        |   3 +-
 {sysdeps/gnu => inet}/netinet/tcp.h           |   4 +-
 io/fts.h                                      |   5 +-
 io/ftw.h                                      |   1 -
 io/sys/sendfile.h                             |   6 +-
 login/Makefile                                |  13 ++-
 login/utmp.h                                  |  15 ++-
 {sysdeps/gnu => login}/utmpx.h                |   9 +-
 misc/Makefile                                 |   6 +-
 {sysdeps/gnu => misc}/sys/mtio.h              |   3 -
 misc/sys/uio.h                                |   5 +-
 misc/sys/xattr.h                              |   3 +-
 nss/nss.h                                     |   6 +-
 nss/tst-nss-test4.c                           |   1 +
 posix/spawn.h                                 |   5 +-
 resolv/bits/types/res_state.h                 |  12 +-
 rt/aio.h                                      |   7 +-
 rt/mqueue.h                                   |   8 +-
 scripts/check-obsolete-constructs.py          |  62 +++-------
 {sysdeps/gnu => socket}/net/if.h              |   8 +-
 socket/sys/socket.h                           |   3 +
 stdlib/sys/random.h                           |   4 +-
 sysdeps/generic/net/if.h                      |  49 --------
 sysdeps/generic/netinet/tcp.h                 | 107 ------------------
 sysdeps/gnu/Makefile                          |  12 --
 sysdeps/gnu/bits/sem.h                        |   7 +-
 sysdeps/mach/hurd/bits/fcntl.h                |  11 +-
 sysdeps/mach/hurd/bits/socket.h               |   2 +-
 sysdeps/mach/hurd/i386/Makefile               |  35 ------
 sysdeps/mach/hurd/sendfile.c                  |   1 +
 sysdeps/nptl/proc_service.h                   |   3 +
 sysdeps/nptl/sys/procfs.h                     |   3 +-
 sysdeps/nptl/thread_db.h                      |   1 -
 sysdeps/posix/dl-fileid.h                     |   4 +-
 sysdeps/powerpc/sys/platform/ppc.h            |  10 +-
 sysdeps/pthread/semaphore.h                   |   2 +-
 sysdeps/unix/sysv/linux/aarch64/bits/procfs.h |  13 ++-
 sysdeps/unix/sysv/linux/alpha/bits/epoll.h    |   5 +
 .../sysv/linux/alpha/bits/procfs-prregset.h   |   9 ++
 sysdeps/unix/sysv/linux/alpha/bits/procfs.h   |   8 +-
 sysdeps/unix/sysv/linux/alpha/sys/acct.h      |   2 +-
 sysdeps/unix/sysv/linux/arm/bits/procfs.h     |   9 +-
 sysdeps/unix/sysv/linux/bits/epoll.h          |   5 +
 sysdeps/unix/sysv/linux/bits/sem.h            |   7 +-
 sysdeps/unix/sysv/linux/bits/socket.h         |   8 +-
 sysdeps/unix/sysv/linux/bits/uio-ext.h        |   4 +-
 sysdeps/unix/sysv/linux/csky/bits/procfs.h    |   5 +
 sysdeps/unix/sysv/linux/hppa/bits/epoll.h     |   5 +
 sysdeps/unix/sysv/linux/hppa/bits/procfs.h    |   5 +
 sysdeps/unix/sysv/linux/ia64/bits/ipc.h       |   2 +-
 sysdeps/unix/sysv/linux/ia64/bits/procfs.h    |   8 +-
 sysdeps/unix/sysv/linux/m68k/bits/procfs.h    |   9 +-
 .../unix/sysv/linux/microblaze/bits/procfs.h  |   9 +-
 sysdeps/unix/sysv/linux/microblaze/sys/user.h |   4 +-
 sysdeps/unix/sysv/linux/mips/bits/epoll.h     |   5 +
 sysdeps/unix/sysv/linux/mips/bits/procfs.h    |   5 +
 sysdeps/unix/sysv/linux/nios2/bits/procfs.h   |   5 +
 sysdeps/unix/sysv/linux/powerpc/bits/ppc.h    |   2 +-
 sysdeps/unix/sysv/linux/powerpc/bits/procfs.h |  20 ++--
 sysdeps/unix/sysv/linux/powerpc/sys/user.h    |   1 +
 sysdeps/unix/sysv/linux/riscv/bits/procfs.h   |   8 ++
 sysdeps/unix/sysv/linux/s390/bits/procfs.h    |   7 ++
 .../{gnu => unix/sysv/linux/s390}/bits/utmp.h |  37 +++---
 sysdeps/unix/sysv/linux/s390/bits/utmpx.h     |  34 ++----
 sysdeps/unix/sysv/linux/sh/bits/procfs.h      |   5 +
 sysdeps/unix/sysv/linux/sparc/bits/epoll.h    |   5 +
 sysdeps/unix/sysv/linux/sparc/bits/procfs.h   |   7 +-
 sysdeps/unix/sysv/linux/sys/acct.h            |   6 +-
 sysdeps/unix/sysv/linux/sys/epoll.h           |  10 +-
 sysdeps/unix/sysv/linux/sys/eventfd.h         |   5 +-
 sysdeps/unix/sysv/linux/sys/fanotify.h        |   6 +-
 sysdeps/unix/sysv/linux/sys/fsuid.h           |   2 +-
 sysdeps/unix/sysv/linux/sys/inotify.h         |  11 +-
 sysdeps/unix/sysv/linux/sys/procfs.h          |   6 +-
 sysdeps/unix/sysv/linux/sys/quota.h           |   2 +-
 sysdeps/unix/sysv/linux/sys/raw.h             |   7 +-
 sysdeps/unix/sysv/linux/sys/signalfd.h        |  47 ++++----
 sysdeps/unix/sysv/linux/x86/bits/epoll.h      |   5 +
 sysdeps/unix/sysv/linux/x86/bits/procfs.h     |   5 +
 sysvipc/sys/sem.h                             |   2 +
 99 files changed, 443 insertions(+), 477 deletions(-)
 copy {sysdeps/gnu/bits => bits}/utmp.h (83%)
 rename {sysdeps/gnu/bits => bits}/utmpx.h (82%)
 create mode 100644 include/netinet/in_systm.h
 create mode 100644 include/netinet/ip.h
 create mode 100644 include/netinet/tcp.h
 create mode 100644 include/sys/mtio.h
 create mode 100644 include/utmpx.h
 rename {sysdeps/generic => inet}/netinet/in_systm.h (97%)
 rename {sysdeps/generic => inet}/netinet/ip.h (99%)
 rename {sysdeps/gnu => inet}/netinet/tcp.h (99%)
 rename {sysdeps/gnu => login}/utmpx.h (94%)
 rename {sysdeps/gnu => misc}/sys/mtio.h (99%)
 rename {sysdeps/gnu => socket}/net/if.h (98%)
 delete mode 100644 sysdeps/generic/net/if.h
 delete mode 100644 sysdeps/generic/netinet/tcp.h
 rename sysdeps/{gnu => unix/sysv/linux/s390}/bits/utmp.h (83%)

Patch

diff --git a/bits/fcntl.h b/bits/fcntl.h
index 8bb1357684..c69869f1c4 100644
--- a/bits/fcntl.h
+++ b/bits/fcntl.h
@@ -16,10 +16,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_FCNTL_H
+#define _BITS_FCNTL_H 1
+
 #ifndef	_FCNTL_H
 #error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
 #endif
 
+#include <bits/types.h>
 
 /* File access modes for `open' and `fcntl'.  */
 #define	O_RDONLY	0	/* Open read-only.  */
@@ -104,9 +108,6 @@ 
 /* File descriptor flags used with F_GETFD and F_SETFD.  */
 #define	FD_CLOEXEC	1	/* Close on exec.  */
 
-
-#include <bits/types.h>
-
 /* The structure describing an advisory lock.  This is the type of the third
    argument to `fcntl' for the F_GETLK, F_SETLK, and F_SETLKW requests.  */
 struct flock
@@ -144,3 +145,5 @@  struct flock64
 # define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
 # define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
 #endif
+
+#endif
diff --git a/bits/sem.h b/bits/sem.h
index 02754c7e58..6eed74c12e 100644
--- a/bits/sem.h
+++ b/bits/sem.h
@@ -15,11 +15,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_SEM_H
+#define _BITS_SEM_H 1
+
 #ifndef _SYS_SEM_H
 # error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
 #endif
 
-#include <sys/types.h>
+#include <bits/types.h>
 
 /* Flags for `semop'.  */
 #define SEM_UNDO	0x1000		/* undo the operation on exit */
@@ -58,3 +61,5 @@  struct semid_ds
    incorrect.  One can test the macro _SEM_SEMUN_UNDEFINED to see whether
    one must define the union or not.  */
 #define _SEM_SEMUN_UNDEFINED	1
+
+#endif /* bits/sem.h */
diff --git a/sysdeps/gnu/bits/utmp.h b/bits/utmp.h
similarity index 83%
copy from sysdeps/gnu/bits/utmp.h
copy to bits/utmp.h
index 7357034cb6..3d593e0c0a 100644
--- a/sysdeps/gnu/bits/utmp.h
+++ b/bits/utmp.h
@@ -16,13 +16,13 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_UTMP_H
+#define _BITS_UTMP_H 1
+
 #ifndef _UTMP_H
 # error "Never include <bits/utmp.h> directly; use <utmp.h> instead."
 #endif
 
-#include <paths.h>
-#include <sys/time.h>
-#include <sys/types.h>
 #include <bits/wordsize.h>
 
 
@@ -36,7 +36,7 @@ 
 struct lastlog
   {
 #if __WORDSIZE_TIME64_COMPAT32
-    int32_t ll_time;
+    __int32_t ll_time;
 #else
     __time_t ll_time;
 #endif
@@ -68,23 +68,29 @@  struct utmp
     __attribute_nonstring__;	/* Hostname for remote login.  */
   struct exit_status ut_exit;	/* Exit status of a process marked
 				   as DEAD_PROCESS.  */
+
 /* The ut_session and ut_tv fields must be the same size when compiled
    32- and 64-bit.  This allows data files and shared memory to be
-   shared between 32- and 64-bit applications.  */
+   shared between 32- and 64-bit applications.  Even on 64-bit systems,
+   struct timeval is not guaranteed to have both fields be 64 bits.  */
 #if __WORDSIZE_TIME64_COMPAT32
-  int32_t ut_session;		/* Session ID, used for windowing.  */
+  __int32_t ut_session;		/* Session ID, used for windowing.  */
   struct
   {
-    int32_t tv_sec;		/* Seconds.  */
-    int32_t tv_usec;		/* Microseconds.  */
+    __int32_t tv_sec;		/* Seconds.  */
+    __int32_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
 #else
-  long int ut_session;		/* Session ID, used for windowing.  */
-  struct timeval ut_tv;		/* Time entry was made.  */
+  __int64_t ut_session;		/* Session ID, used for windowing.  */
+  struct
+  {
+    __int64_t tv_sec;		/* Seconds.  */
+    __int64_t tv_usec;		/* Microseconds.  */
+  } ut_tv;			/* Time entry was made.  */
 #endif
 
-  int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
-  char __glibc_reserved[20];		/* Reserved for future use.  */
+  __int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
+  char __glibc_reserved[20];	/* Reserved for future use.  */
 };
 
 /* Backwards compatibility hacks.  */
@@ -124,3 +130,5 @@  struct utmp
 #define _HAVE_UT_ID	1
 #define _HAVE_UT_TV	1
 #define _HAVE_UT_HOST	1
+
+#endif /* bits/utmp.h */
diff --git a/sysdeps/gnu/bits/utmpx.h b/bits/utmpx.h
similarity index 82%
rename from sysdeps/gnu/bits/utmpx.h
rename to bits/utmpx.h
index 472a7d57d3..ac4a5323fd 100644
--- a/sysdeps/gnu/bits/utmpx.h
+++ b/bits/utmpx.h
@@ -16,22 +16,13 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_UTMPX_H
+#define _BITS_UTMPX_H 1
+
 #ifndef _UTMPX_H
 # error "Never include <bits/utmpx.h> directly; use <utmpx.h> instead."
 #endif
 
-#include <bits/types.h>
-#include <sys/time.h>
-#include <bits/wordsize.h>
-
-
-#ifdef __USE_GNU
-# include <paths.h>
-# define _PATH_UTMPX	_PATH_UTMP
-# define _PATH_WTMPX	_PATH_WTMP
-#endif
-
-
 #define __UT_LINESIZE	32
 #define __UT_NAMESIZE	32
 #define __UT_HOSTSIZE	256
@@ -55,7 +46,7 @@  struct __exit_status
 struct utmpx
 {
   short int ut_type;		/* Type of login.  */
-  __pid_t ut_pid;		/* Process ID of login process.  */
+  pid_t ut_pid;			/* Process ID of login process.  */
   char ut_line[__UT_LINESIZE];	/* Devicename.  */
   char ut_id[4];		/* Inittab ID. */
   char ut_user[__UT_NAMESIZE];	/* Username.  */
@@ -63,9 +54,10 @@  struct utmpx
   struct __exit_status ut_exit;	/* Exit status of a process marked
 				   as DEAD_PROCESS.  */
 
-/* The fields ut_session and ut_tv must be the same size when compiled
-   32- and 64-bit.  This allows files and shared memory to be shared
-   between 32- and 64-bit applications.  */
+/* The ut_session and ut_tv fields must be the same size when compiled
+   32- and 64-bit.  This allows data files and shared memory to be
+   shared between 32- and 64-bit applications.  Even on 64-bit systems,
+   struct timeval is not guaranteed to have both fields be 64 bits.  */
 #if __WORDSIZE_TIME64_COMPAT32
   __int32_t ut_session;		/* Session ID, used for windowing.  */
   struct
@@ -74,9 +66,14 @@  struct utmpx
     __int32_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
 #else
-  long int ut_session;		/* Session ID, used for windowing.  */
-  struct timeval ut_tv;		/* Time entry was made.  */
+  __int64_t ut_session;		/* Session ID, used for windowing.  */
+  struct
+  {
+    __int64_t tv_sec;		/* Seconds.  */
+    __int64_t tv_usec;		/* Microseconds.  */
+  } ut_tv;			/* Time entry was made.  */
 #endif
+
   __int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
   char __glibc_reserved[20];		/* Reserved for future use.  */
 };
@@ -100,3 +97,5 @@  struct utmpx
 #ifdef __USE_GNU
 # define ACCOUNTING	9	/* System accounting.  */
 #endif
+
+#endif /* bits/utmpx.h */
diff --git a/elf/link.h b/elf/link.h
index 7a463bc2bf..7871b9aef8 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -23,7 +23,6 @@ 
 #include <features.h>
 #include <elf.h>
 #include <dlfcn.h>
-#include <sys/types.h>
 
 /* We use this macro to refer to ELF types independent of the native wordsize.
    `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'.  */
@@ -31,6 +30,7 @@ 
 #define _ElfW(e,w,t)	_ElfW_1 (e, w, _##t)
 #define _ElfW_1(e,w,t)	e##w##t
 
+#include <bits/types/size_t.h>
 #include <bits/elfclass.h>		/* Defines __ELF_NATIVE_CLASS.  */
 #include <bits/link.h>
 
diff --git a/gmon/sys/gmon.h b/gmon/sys/gmon.h
index b4cc3b043a..5d7de0fe9b 100644
--- a/gmon/sys/gmon.h
+++ b/gmon/sys/gmon.h
@@ -34,8 +34,6 @@ 
 
 #include <features.h>
 
-#include <sys/types.h>
-
 /*
  * See gmon_out.h for gmon.out format.
  */
diff --git a/gmon/sys/profil.h b/gmon/sys/profil.h
index ba99ac8634..1122590213 100644
--- a/gmon/sys/profil.h
+++ b/gmon/sys/profil.h
@@ -20,8 +20,8 @@ 
 
 #include <features.h>
 
-#include <sys/time.h>
-#include <sys/types.h>
+#include <bits/types/size_t.h>
+#include <bits/types/struct_timeval.h>
 
 /* This interface is intended to follow the sprofil() system calls as
    described by the sprofil(2) man page of Irix v6.5, except that:
diff --git a/gmon/tst-sprofil.c b/gmon/tst-sprofil.c
index 3f7f909cba..53de7a624d 100644
--- a/gmon/tst-sprofil.c
+++ b/gmon/tst-sprofil.c
@@ -20,6 +20,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/profil.h>
+#include <sys/time.h>
 
 #include <bits/wordsize.h>
 
diff --git a/include/net/if.h b/include/net/if.h
index 6c4cbc96c3..2e7af05ed2 100644
--- a/include/net/if.h
+++ b/include/net/if.h
@@ -1,6 +1,6 @@ 
 #ifndef _NET_IF_H
 
-# include_next <net/if.h>
+#include <socket/net/if.h>
 
 #ifndef _ISOMAC
 libc_hidden_proto (if_nametoindex)
diff --git a/include/netinet/ether.h b/include/netinet/ether.h
index 8bfe7e03ad..a60aa27240 100644
--- a/include/netinet/ether.h
+++ b/include/netinet/ether.h
@@ -2,6 +2,7 @@ 
 #include <inet/netinet/ether.h>
 
 # ifndef _ISOMAC
+#  include <bits/types/size_t.h>
 
 libc_hidden_proto (ether_aton_r)
 libc_hidden_proto (ether_ntoa_r)
diff --git a/include/netinet/in_systm.h b/include/netinet/in_systm.h
new file mode 100644
index 0000000000..7634c9b5a0
--- /dev/null
+++ b/include/netinet/in_systm.h
@@ -0,0 +1 @@ 
+#include <inet/netinet/in_systm.h>
diff --git a/include/netinet/ip.h b/include/netinet/ip.h
new file mode 100644
index 0000000000..da55733e90
--- /dev/null
+++ b/include/netinet/ip.h
@@ -0,0 +1 @@ 
+#include <inet/netinet/ip.h>
diff --git a/include/netinet/tcp.h b/include/netinet/tcp.h
new file mode 100644
index 0000000000..edba529813
--- /dev/null
+++ b/include/netinet/tcp.h
@@ -0,0 +1 @@ 
+#include <inet/netinet/tcp.h>
diff --git a/include/sys/mtio.h b/include/sys/mtio.h
new file mode 100644
index 0000000000..f4861bda70
--- /dev/null
+++ b/include/sys/mtio.h
@@ -0,0 +1 @@ 
+#include <misc/sys/mtio.h>
diff --git a/include/utmpx.h b/include/utmpx.h
new file mode 100644
index 0000000000..cfe9b7c054
--- /dev/null
+++ b/include/utmpx.h
@@ -0,0 +1 @@ 
+#include <login/utmpx.h>
diff --git a/inet/aliases.h b/inet/aliases.h
index 67828ca7b6..eebbbc46f2 100644
--- a/inet/aliases.h
+++ b/inet/aliases.h
@@ -19,9 +19,7 @@ 
 #define _ALIASES_H	1
 
 #include <features.h>
-
-#include <sys/types.h>
-
+#include <bits/types/size_t.h>
 
 __BEGIN_DECLS
 
diff --git a/inet/htonl.c b/inet/htonl.c
index 39acfa6557..bb6b4f5899 100644
--- a/inet/htonl.c
+++ b/inet/htonl.c
@@ -15,8 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <stdint.h>
 #include <netinet/in.h>
+#include <endian.h>
+#include <stdint.h>
 
 #undef	htonl
 #undef	ntohl
diff --git a/inet/htons.c b/inet/htons.c
index 500ca50f49..2b22ca123c 100644
--- a/inet/htons.c
+++ b/inet/htons.c
@@ -16,6 +16,8 @@ 
    <http://www.gnu.org/licenses/>.  */
 
 #include <netinet/in.h>
+#include <endian.h>
+#include <stdint.h>
 
 #undef	htons
 #undef	ntohs
diff --git a/sysdeps/generic/netinet/in_systm.h b/inet/netinet/in_systm.h
similarity index 97%
rename from sysdeps/generic/netinet/in_systm.h
rename to inet/netinet/in_systm.h
index 2b3c74281b..6964aca21a 100644
--- a/sysdeps/generic/netinet/in_systm.h
+++ b/inet/netinet/in_systm.h
@@ -19,8 +19,7 @@ 
 #ifndef _NETINET_IN_SYSTM_H
 #define _NETINET_IN_SYSTM_H 1
 
-#include <sys/types.h>
-#include <stdint.h>
+#include <bits/stdint-uintn.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/generic/netinet/ip.h b/inet/netinet/ip.h
similarity index 99%
rename from sysdeps/generic/netinet/ip.h
rename to inet/netinet/ip.h
index 13b03ff79f..35f61d1694 100644
--- a/sysdeps/generic/netinet/ip.h
+++ b/inet/netinet/ip.h
@@ -19,9 +19,10 @@ 
 #define __NETINET_IP_H 1
 
 #include <features.h>
-#include <sys/types.h>
 
 #include <netinet/in.h>
+#include <bits/endian.h>
+#include <bits/stdint-uintn.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/gnu/netinet/tcp.h b/inet/netinet/tcp.h
similarity index 99%
rename from sysdeps/gnu/netinet/tcp.h
rename to inet/netinet/tcp.h
index 1a164a9649..7b07accce7 100644
--- a/sysdeps/gnu/netinet/tcp.h
+++ b/inet/netinet/tcp.h
@@ -85,9 +85,9 @@ 
 #define TCP_REPAIR_OFF_NO_WP	 -1
 
 #ifdef __USE_MISC
-# include <sys/types.h>
+# include <bits/stdint-uintn.h>
+# include <bits/endian.h>
 # include <sys/socket.h>
-# include <stdint.h>
 
 typedef	uint32_t tcp_seq;
 /*
diff --git a/io/fts.h b/io/fts.h
index acfa260f07..0e43b35236 100644
--- a/io/fts.h
+++ b/io/fts.h
@@ -51,8 +51,11 @@ 
 #define	_FTS_H 1
 
 #include <features.h>
-#include <sys/types.h>
 
+#include <bits/types/dev_t.h>
+#include <bits/types/ino_t.h>
+#include <bits/types/ino64_t.h>
+#include <bits/types/nlink_t.h>
 
 typedef struct {
 	struct _ftsent *fts_cur;	/* current node */
diff --git a/io/ftw.h b/io/ftw.h
index 1ef67f7f3c..ea1d1ee48b 100644
--- a/io/ftw.h
+++ b/io/ftw.h
@@ -24,7 +24,6 @@ 
 
 #include <features.h>
 
-#include <sys/types.h>
 #include <sys/stat.h>
 
 
diff --git a/io/sys/sendfile.h b/io/sys/sendfile.h
index b21c0857be..d0e8a6777e 100644
--- a/io/sys/sendfile.h
+++ b/io/sys/sendfile.h
@@ -20,7 +20,11 @@ 
 #define _SYS_SENDFILE_H	1
 
 #include <features.h>
-#include <sys/types.h>
+
+#include <bits/types.h>
+#include <bits/types/off_t.h>
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 
 __BEGIN_DECLS
 
diff --git a/login/Makefile b/login/Makefile
index 92535f0aec..e9bdd1ad15 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -23,12 +23,15 @@  subdir	:= login
 
 include ../Makeconfig
 
-headers	:= utmp.h bits/utmp.h lastlog.h pty.h
+headers	:= utmp.h bits/utmp.h utmpx.h bits/utmpx.h lastlog.h pty.h
 
-routines := getlogin getlogin_r setlogin getlogin_r_chk \
-	    getutent getutent_r getutid getutline getutid_r getutline_r \
-	    utmp_file utmpname updwtmp getpt grantpt unlockpt ptsname \
-	    ptsname_r_chk
+routines :=								\
+	getlogin getlogin_r getlogin_r_chk setlogin			\
+	getpt grantpt ptsname ptsname_r_chk unlockpt			\
+	getutent getutent_r getutid getutid_r getutline getutline_r	\
+	getutmp updwtmp utmp_file utmpname				\
+	endutxent getutmpx getutxent getutxid getutxline pututxline	\
+	setutxent updwtmpx utmpxname
 
 CFLAGS-grantpt.c += -DLIBEXECDIR='"$(libexecdir)"'
 
diff --git a/login/utmp.h b/login/utmp.h
index 168c159b7b..9c12e3c915 100644
--- a/login/utmp.h
+++ b/login/utmp.h
@@ -20,21 +20,26 @@ 
 
 #include <features.h>
 
-#include <sys/types.h>
-
-
-__BEGIN_DECLS
+/* utmp.h is not standardized; utmpx.h is, and is required to define
+   pid_t and struct timeval.  It makes sense for utmp.h to be
+   consistent.  */
+#include <bits/types.h>
+#include <bits/types/pid_t.h>
+#include <bits/types/suseconds_t.h>
+#include <bits/types/time_t.h>
+#include <bits/types/struct_timeval.h>
 
 /* Get system dependent values and data structures.  */
 #include <bits/utmp.h>
 
 /* Compatibility names for the strings of the canonical file names.  */
+#include <paths.h>
 #define UTMP_FILE	_PATH_UTMP
 #define UTMP_FILENAME	_PATH_UTMP
 #define WTMP_FILE	_PATH_WTMP
 #define WTMP_FILENAME	_PATH_WTMP
 
-
+__BEGIN_DECLS
 
 /* Make FD be the controlling terminal, stdin, stdout, and stderr;
    then close FD.  Returns 0 on success, nonzero on error.  */
diff --git a/sysdeps/gnu/utmpx.h b/login/utmpx.h
similarity index 94%
rename from sysdeps/gnu/utmpx.h
rename to login/utmpx.h
index 41c122d970..de18f58e9e 100644
--- a/sysdeps/gnu/utmpx.h
+++ b/login/utmpx.h
@@ -19,15 +19,22 @@ 
 #define	_UTMPX_H	1
 
 #include <features.h>
-#include <sys/time.h>
 
 /* Required according to Unix98.  */
+#include <bits/types.h>
 #include <bits/types/pid_t.h>
+#include <bits/types/suseconds_t.h>
+#include <bits/types/time_t.h>
+#include <bits/types/struct_timeval.h>
 
 /* Get system dependent values and data structures.  */
 #include <bits/utmpx.h>
 
 #ifdef __USE_GNU
+# include <paths.h>
+# define _PATH_UTMPX	_PATH_UTMP
+# define _PATH_WTMPX	_PATH_WTMP
+
 /* Compatibility names for the strings of the canonical file names.  */
 # define UTMPX_FILE	_PATH_UTMPX
 # define UTMPX_FILENAME	_PATH_UTMPX
diff --git a/misc/Makefile b/misc/Makefile
index e6c73896cd..106ce57776 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -36,9 +36,9 @@  headers :=								\
 	bits/uio-ext.h bits/uio_lim.h bits/xopen_lim.h			\
 	gnu/libc-version.h						\
 	sys/auxv.h sys/cdefs.h sys/dir.h sys/file.h sys/ioctl.h		\
-	sys/mman.h sys/param.h sys/ptrace.h sys/queue.h sys/reboot.h	\
-	sys/select.h sys/swap.h sys/syscall.h sys/sysinfo.h		\
-	sys/syslog.h sys/sysmacros.h sys/uio.h sys/xattr.h
+	sys/mman.h sys/mtio.h sys/param.h sys/ptrace.h sys/queue.h	\
+	sys/reboot.h sys/select.h sys/swap.h sys/syscall.h		\
+	sys/sysinfo.h sys/syslog.h sys/sysmacros.h sys/uio.h sys/xattr.h
 
 routines := brk sbrk sstk ioctl \
 	    readv writev preadv preadv64 pwritev pwritev64 \
diff --git a/sysdeps/gnu/sys/mtio.h b/misc/sys/mtio.h
similarity index 99%
rename from sysdeps/gnu/sys/mtio.h
rename to misc/sys/mtio.h
index 0ce41c58df..1387b13fac 100644
--- a/sysdeps/gnu/sys/mtio.h
+++ b/misc/sys/mtio.h
@@ -21,11 +21,8 @@ 
 #ifndef _SYS_MTIO_H
 #define _SYS_MTIO_H	1
 
-/* Get necessary definitions from system and kernel headers.  */
-#include <sys/types.h>
 #include <sys/ioctl.h>
 
-
 /* Structure for MTIOCTOP - magnetic tape operation command.  */
 struct mtop
   {
diff --git a/misc/sys/uio.h b/misc/sys/uio.h
index ec1ca4af82..40bedd079a 100644
--- a/misc/sys/uio.h
+++ b/misc/sys/uio.h
@@ -19,7 +19,10 @@ 
 #define _SYS_UIO_H	1
 
 #include <features.h>
-#include <sys/types.h>
+
+#include <bits/types.h>
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 #include <bits/types/struct_iovec.h>
 #include <bits/uio_lim.h>
 #ifdef __IOV_MAX
diff --git a/misc/sys/xattr.h b/misc/sys/xattr.h
index f1143f892c..03c7dec9aa 100644
--- a/misc/sys/xattr.h
+++ b/misc/sys/xattr.h
@@ -19,8 +19,9 @@ 
 #define _SYS_XATTR_H	1
 
 #include <features.h>
-#include <sys/types.h>
 
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 
 __BEGIN_DECLS
 
diff --git a/nss/nss.h b/nss/nss.h
index 9d4f33e999..0be375259f 100644
--- a/nss/nss.h
+++ b/nss/nss.h
@@ -22,7 +22,7 @@ 
 #define _NSS_H	1
 
 #include <features.h>
-#include <stdint.h>
+#include <bits/types.h>
 
 
 __BEGIN_DECLS
@@ -44,8 +44,8 @@  struct gaih_addrtuple
     struct gaih_addrtuple *next;
     char *name;
     int family;
-    uint32_t addr[4];
-    uint32_t scopeid;
+    __uint32_t addr[4];
+    __uint32_t scopeid;
   };
 
 
diff --git a/nss/tst-nss-test4.c b/nss/tst-nss-test4.c
index cf6ef46b01..14bea82cb6 100644
--- a/nss/tst-nss-test4.c
+++ b/nss/tst-nss-test4.c
@@ -20,6 +20,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 
 #include <support/support.h>
 
diff --git a/posix/spawn.h b/posix/spawn.h
index 471dbea022..2dd75439cb 100644
--- a/posix/spawn.h
+++ b/posix/spawn.h
@@ -21,7 +21,10 @@ 
 
 #include <features.h>
 #include <sched.h>
-#include <sys/types.h>
+
+#include <bits/types.h>
+#include <bits/types/mode_t.h>
+#include <bits/types/pid_t.h>
 #include <bits/types/sigset_t.h>
 
 
diff --git a/resolv/bits/types/res_state.h b/resolv/bits/types/res_state.h
index 2544a627f6..81febe13b0 100644
--- a/resolv/bits/types/res_state.h
+++ b/resolv/bits/types/res_state.h
@@ -1,7 +1,7 @@ 
 #ifndef __res_state_defined
 #define __res_state_defined 1
 
-#include <sys/types.h>
+#include <bits/types.h>
 #include <netinet/in.h>
 
 /* res_state: the global state used by the resolver stub.  */
@@ -28,7 +28,7 @@  struct __res_state {
 	unsigned unused:23;
 	struct {
 		struct in_addr	addr;
-		uint32_t	mask;
+		__uint32_t	mask;
 	} sort_list[MAXRESOLVSORT];
 	/* 4 byte hole here on 64-bit architectures.  */
 	void * __glibc_unused_qhook;
@@ -40,11 +40,11 @@  struct __res_state {
 	union {
 		char	pad[52];	/* On an i386 this means 512b total. */
 		struct {
-			uint16_t		nscount;
-			uint16_t		nsmap[MAXNS];
+			__uint16_t		nscount;
+			__uint16_t		nsmap[MAXNS];
 			int			nssocks[MAXNS];
-			uint16_t		nscount6;
-			uint16_t		nsinit;
+			__uint16_t		nscount6;
+			__uint16_t		nsinit;
 			struct sockaddr_in6	*nsaddrs[MAXNS];
 #ifdef _LIBC
 			unsigned long long int __glibc_extension_index
diff --git a/rt/aio.h b/rt/aio.h
index d1b97bf0e4..a874e45ac9 100644
--- a/rt/aio.h
+++ b/rt/aio.h
@@ -23,7 +23,12 @@ 
 #define _AIO_H	1
 
 #include <features.h>
-#include <sys/types.h>
+
+#include <bits/types.h>
+#include <bits/pthreadtypes.h>
+#include <bits/types/off_t.h>
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 #include <bits/types/sigevent_t.h>
 #include <bits/sigevent-consts.h>
 #include <bits/types/struct_timespec.h>
diff --git a/rt/mqueue.h b/rt/mqueue.h
index 308a52c1bc..dcc786d12d 100644
--- a/rt/mqueue.h
+++ b/rt/mqueue.h
@@ -19,13 +19,19 @@ 
 #define _MQUEUE_H	1
 
 #include <features.h>
-#include <sys/types.h>
 #include <fcntl.h>
+
+#include <bits/types.h>
+#include <bits/pthreadtypes.h>
 #include <bits/types/sigevent_t.h>
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 #include <bits/types/struct_timespec.h>
+
 /* Get the definition of mqd_t and struct mq_attr.  */
 #include <bits/mqueue.h>
 
+
 __BEGIN_DECLS
 
 /* Establish connection between a process and a message queue NAME and
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index f456c98def..1ecb7c9823 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -515,16 +515,15 @@  HEADER_ALLOWED_INCLUDES = {
     #           mqueue.h -> fcntl.h
     #           sched.h -> time.h
     #           spawn.h -> sched.h
-    "aio.h":                       [ "sys/types.h" ],
-    "ftw.h":                       [ "sys/stat.h", "sys/types.h" ],
+    "ftw.h":                       [ "sys/stat.h" ],
     "langinfo.h":                  [ "nl_types.h" ],
-    "mqueue.h":                    [ "fcntl.h", "sys/types.h" ],
+    "mqueue.h":                    [ "fcntl.h" ],
     "pthread.h":                   [ "sched.h", "time.h" ],
     "regex.h":                     [ "limits.h", "sys/types.h" ],
     "sched.h":                     [ "time.h" ],
-    "semaphore.h":                 [ "sys/types.h" ],
-    "spawn.h":                     [ "sched.h", "sys/types.h" ],
+    "spawn.h":                     [ "sched.h" ],
     "termios.h":                   [ "sys/ttydefaults.h" ],
+    "utmpx.h":                     [ "paths.h" ],
 
     # POSIX sys/ headers
     # mandated: sys/msg.h -> sys/ipc.h
@@ -538,77 +537,54 @@  HEADER_ALLOWED_INCLUDES = {
     # necessary for backward compatibility with BSD
     "sys/types.h":                 [ "endian.h" ],
 
-    "sys/uio.h":                   [ "sys/types.h" ],
-
     # POSIX networking headers
     # allowed: netdb.h -> netinet/in.h
     #          arpa/inet.h -> netinet/in.h
     "netdb.h":                     [ "netinet/in.h", "rpc/netdb.h" ],
     "arpa/inet.h":                 [ "netinet/in.h" ],
-    "net/if.h":                    [ "sys/socket.h", "sys/types.h" ],
+    "net/if.h":                    [ "sys/socket.h" ],
     "netinet/in.h":                [ "sys/socket.h" ],
-    "netinet/tcp.h":               [ "stdint.h", "sys/socket.h",
-                                     "sys/types.h" ],
+    "netinet/tcp.h":               [ "sys/socket.h" ],
 
     # Nonstandardized top-level headers
-    "aliases.h":                   [ "sys/types.h" ],
     "argp.h":                      [ "ctype.h", "errno.h", "getopt.h",
                                      "limits.h", "stdio.h" ],
     "argz.h":                      [ "errno.h", "string.h" ],
     "elf.h":                       [ "stdint.h" ],
     "envz.h":                      [ "argz.h", "errno.h" ],
-    "fts.h":                       [ "sys/types.h" ],
     "gshadow.h":                   [ "paths.h" ],
     "ieee754.h":                   [ "float.h" ],
     "lastlog.h":                   [ "utmp.h" ],
     "libintl.h":                   [ "locale.h" ],
-    "link.h":                      [ "dlfcn.h", "elf.h", "sys/types.h" ],
+    "link.h":                      [ "dlfcn.h", "elf.h" ],
     "mntent.h":                    [ "paths.h" ],
-    "nss.h":                       [ "stdint.h" ],
     "obstack.h":                   [ "stddef.h", "string.h" ],
     "proc_service.h":              [ "sys/procfs.h" ],
     "pty.h":                       [ "sys/ioctl.h", "termios.h" ],
     "sgtty.h":                     [ "sys/ioctl.h" ],
     "shadow.h":                    [ "paths.h" ],
     "stdio_ext.h":                 [ "stdio.h" ],
-    "thread_db.h":                 [ "pthread.h", "stdint.h", "sys/procfs.h",
-                                     "sys/types.h" ],
+    "thread_db.h":                 [ "pthread.h", "stdint.h", "sys/procfs.h" ],
     "ucontext.h":                  [ "sys/ucontext.h" ],
-    "utmp.h":                      [ "sys/types.h" ],
-    "utmpx.h":                     [ "sys/time.h" ],
+    "utmp.h":                      [ "paths.h" ],
     "values.h":                    [ "float.h", "limits.h" ],
 
     # Nonstandardized sys/ headers
-    "sys/acct.h":                  [ "endian.h", "stdint.h", "sys/types.h" ],
     "sys/auxv.h":                  [ "elf.h" ],
     "sys/elf.h":                   [ "sys/procfs.h" ],
-    "sys/epoll.h":                 [ "stdint.h", "sys/types.h" ],
-    "sys/eventfd.h":               [ "stdint.h" ],
-    "sys/fanotify.h":              [ "stdint.h" ],
     "sys/file.h":                  [ "fcntl.h" ],
-    "sys/fsuid.h":                 [ "sys/types.h" ],
-    "sys/gmon.h":                  [ "sys/types.h" ],
-    "sys/inotify.h":               [ "stdint.h" ],
     "sys/ioctl.h":                 [ "sys/ttydefaults.h" ],
     "sys/mount.h":                 [ "sys/ioctl.h" ],
-    "sys/mtio.h":                  [ "sys/ioctl.h", "sys/types.h" ],
+    "sys/mtio.h":                  [ "sys/ioctl.h" ],
     "sys/param.h":                 [ "endian.h", "limits.h", "sys/types.h" ],
-    "sys/platform/ppc.h":          [ "stdint.h" ],
-    "sys/procfs.h":                [ "sys/time.h", "sys/types.h",
-                                     "sys/user.h" ],
-    "sys/profil.h":                [ "sys/time.h", "sys/types.h" ],
+    "sys/procfs.h":                [ "sys/ucontext.h", "sys/user.h" ],
     "sys/ptrace.h":                [ "sys/ucontext.h" ],
-    "sys/quota.h":                 [ "sys/types.h" ],
-    "sys/random.h":                [ "sys/types.h" ],
-    "sys/raw.h":                   [ "stdint.h", "sys/ioctl.h" ],
-    "sys/sendfile.h":              [ "sys/types.h" ],
-    "sys/signalfd.h":              [ "stdint.h" ],
+    "sys/raw.h":                   [ "sys/ioctl.h" ],
     "sys/socketvar.h":             [ "sys/socket.h" ],
     "sys/timerfd.h":               [ "time.h" ],
     "sys/ttychars.h":              [ "sys/ttydefaults.h" ],
     "sys/ucontext.h":              [ "sys/procfs.h" ],
     "sys/vfs.h":                   [ "sys/statfs.h" ],
-    "sys/xattr.h":                 [ "sys/types.h" ],
 
     # Nonstandardized headers that do nothing but include some other
     # header(s).  These exist for compatibility with old systems where
@@ -656,8 +632,7 @@  HEADER_ALLOWED_INCLUDES = {
     "netinet/if_fddi.h":           [ "stdint.h", "sys/types.h" ],
     "netinet/if_tr.h":             [ "stdint.h", "sys/types.h" ],
     "netinet/igmp.h":              [ "netinet/in.h", "sys/types.h" ],
-    "netinet/in_systm.h":          [ "stdint.h", "sys/types.h" ],
-    "netinet/ip.h":                [ "netinet/in.h", "sys/types.h" ],
+    "netinet/ip.h":                [ "netinet/in.h" ],
     "netinet/ip6.h":               [ "inttypes.h", "netinet/in.h" ],
     "netinet/ip_icmp.h":           [ "netinet/in.h", "netinet/ip.h",
                                      "stdint.h", "sys/types.h" ],
@@ -675,14 +650,8 @@  HEADER_ALLOWED_INCLUDES = {
     "features.h":                  [ "gnu/stubs.h", "stdc-predef.h",
                                      "sys/cdefs.h" ],
 
-    "bits/fcntl.h":                [ "sys/types.h" ],
-    "bits/ipc.h":                  [ "sys/types.h" ],
     "bits/procfs.h":               [ "signal.h", "sys/ucontext.h" ],
-    "bits/sem.h":                  [ "sys/types.h" ],
-    "bits/socket.h":               [ "sys/types.h" ],
-    "bits/types/res_state.h":      [ "netinet/in.h", "sys/types.h" ],
-    "bits/utmp.h":                 [ "paths.h", "sys/time.h", "sys/types.h" ],
-    "bits/utmpx.h":                [ "paths.h", "sys/time.h" ],
+    "bits/types/res_state.h":      [ "netinet/in.h" ],
 
     "bits/types/__va_list.h":      [ "stdarg.h" ],
     "bits/types/ptrdiff_t.h":      [ "stddef.h" ],
@@ -730,7 +699,8 @@  SYSDEP_ALLOWED_INCLUDES = {
         "bits/ioctls.h":           [ "asm/ioctls.h", "linux/sockios.h" ],
         "bits/local_lim.h":        [ "linux/limits.h" ],
         "bits/param.h":            [ "linux/limits.h", "linux/param.h" ],
-        "bits/procfs.h":           [ "asm/ptrace.h" ],
+        "bits/procfs.h":           [ "asm/elf.h", "asm/ptrace.h" ],
+        "bits/procfs-prregset.h":  [ "sys/ucontext.h" ],
         "bits/sigcontext.h":       [ "asm/sigcontext.h" ],
         "bits/socket.h":           [ "asm/socket.h" ],
     },
diff --git a/sysdeps/gnu/net/if.h b/socket/net/if.h
similarity index 98%
rename from sysdeps/gnu/net/if.h
rename to socket/net/if.h
index e94ed67c21..b2fdbf7be0 100644
--- a/sysdeps/gnu/net/if.h
+++ b/socket/net/if.h
@@ -21,12 +21,6 @@ 
 
 #include <features.h>
 
-#ifdef __USE_MISC
-# include <sys/types.h>
-# include <sys/socket.h>
-#endif
-
-
 /* Length of interface name.  */
 #define IF_NAMESIZE	16
 
@@ -38,6 +32,8 @@  struct if_nameindex
 
 
 #ifdef __USE_MISC
+# include <sys/socket.h>  /* for struct sockaddr */
+
 /* Standard interface flags. */
 enum
   {
diff --git a/socket/sys/socket.h b/socket/sys/socket.h
index ce793dc3e2..9770d90d2a 100644
--- a/socket/sys/socket.h
+++ b/socket/sys/socket.h
@@ -23,7 +23,10 @@ 
 
 __BEGIN_DECLS
 
+#include <bits/types.h>
 #include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
+#include <bits/types/socklen_t.h>
 #include <bits/types/struct_iovec.h>
 
 /* This operating system-specific header file defines the SOCK_*, PF_*,
diff --git a/stdlib/sys/random.h b/stdlib/sys/random.h
index 2297edf2f2..1da7f6bea0 100644
--- a/stdlib/sys/random.h
+++ b/stdlib/sys/random.h
@@ -20,7 +20,9 @@ 
 #define _SYS_RANDOM_H 1
 
 #include <features.h>
-#include <sys/types.h>
+
+#include <bits/types/size_t.h>
+#include <bits/types/ssize_t.h>
 
 /* Flags for use with getrandom.  */
 #define GRND_NONBLOCK 0x01
diff --git a/sysdeps/generic/net/if.h b/sysdeps/generic/net/if.h
deleted file mode 100644
index 4af66511e7..0000000000
diff --git a/sysdeps/generic/netinet/tcp.h b/sysdeps/generic/netinet/tcp.h
deleted file mode 100644
index 3b59e949d8..0000000000
diff --git a/sysdeps/gnu/Makefile b/sysdeps/gnu/Makefile
index a03d40e4ca..fdfbfc45d8 100644
--- a/sysdeps/gnu/Makefile
+++ b/sysdeps/gnu/Makefile
@@ -58,24 +58,12 @@  $(foreach o,$(object-suffixes) $(object-suffixes:=.d),\
 	  $(objpfx)errlist$o): $(objpfx)errlist-compat.h
 endif
 
-ifeq ($(subdir),login)
-sysdep_routines += setutxent getutxent endutxent getutxid getutxline \
-		   pututxline utmpxname updwtmpx getutmpx getutmp
-
-sysdep_headers += utmpx.h bits/utmpx.h
-endif
-
 
 ifeq ($(subdir),inet)
 sysdep_headers += netinet/udp.h netinet/ip_icmp.h
 endif
 
 
-ifeq ($(subdir),misc)
-sysdep_headers += sys/mtio.h
-endif
-
-
 ifeq ($(subdir),csu)
 routines += unwind-resume
 shared-only-routines += unwind-resume
diff --git a/sysdeps/gnu/bits/sem.h b/sysdeps/gnu/bits/sem.h
index 12ec4e61b1..2eeb12af0c 100644
--- a/sysdeps/gnu/bits/sem.h
+++ b/sysdeps/gnu/bits/sem.h
@@ -15,11 +15,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_SEM_H
+#define _BITS_SEM_H 1
+
 #ifndef _SYS_SEM_H
 # error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
 #endif
 
-#include <sys/types.h>
+#include <bits/types.h>
 
 /* Flags for `semop'.  */
 #define SEM_UNDO	0x1000		/* undo the operation on exit */
@@ -85,3 +88,5 @@  struct  seminfo
 };
 
 #endif /* __USE_MISC */
+
+#endif /* bits/sem.h */
diff --git a/sysdeps/mach/hurd/bits/fcntl.h b/sysdeps/mach/hurd/bits/fcntl.h
index 9da4f8a145..b666a71ac2 100644
--- a/sysdeps/mach/hurd/bits/fcntl.h
+++ b/sysdeps/mach/hurd/bits/fcntl.h
@@ -16,11 +16,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_FCNTL_H
+#define _BITS_FCNTL_H 1
+
 #ifndef _FCNTL_H
 # error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
 #endif
 
-#include <sys/types.h>
+#include <bits/types.h>
 
 /* File access modes.  These are understood by io servers; they can be
    passed in `dir_lookup', and are returned by `io_get_openmodes'.
@@ -180,13 +183,9 @@ 
 # define F_DUPFD_CLOEXEC 1030	/* Duplicate, set FD_CLOEXEC on new one.  */
 #endif
 
-
 /* File descriptor flags used with F_GETFD and F_SETFD.  */
 #define	FD_CLOEXEC	1	/* Close on exec.  */
 
-
-#include <bits/types.h>
-
 /* The structure describing an advisory lock.  This is the type of the third
    argument to `fcntl' for the F_GETLK, F_SETLK, and F_SETLKW requests.  */
 struct flock
@@ -228,3 +227,5 @@  struct flock64
 # define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
 # define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
 #endif
+
+#endif /* bits/fcntl.h */
diff --git a/sysdeps/mach/hurd/bits/socket.h b/sysdeps/mach/hurd/bits/socket.h
index ad590af3f6..77498ca43e 100644
--- a/sysdeps/mach/hurd/bits/socket.h
+++ b/sysdeps/mach/hurd/bits/socket.h
@@ -25,7 +25,7 @@ 
 #endif
 
 
-#include <sys/types.h>
+#include <bits/types.h>
 #include <bits/types/size_t.h>
 #include <bits/types/socklen_t.h>
 #include <bits/wordsize.h>
diff --git a/sysdeps/mach/hurd/i386/Makefile b/sysdeps/mach/hurd/i386/Makefile
index bf62a5fc67..88747c684a 100644
--- a/sysdeps/mach/hurd/i386/Makefile
+++ b/sysdeps/mach/hurd/i386/Makefile
@@ -20,69 +20,34 @@  ifeq ($(subdir),conform)
 conformtest-xfail-conds += i386-gnu
 
 # For bug 23088
-test-xfail-POSIX/fcntl.h/conform = yes
 test-xfail-POSIX/signal.h/conform = yes
-test-xfail-POSIX/semaphore.h/conform = yes
 test-xfail-POSIX/regex.h/conform = yes
 test-xfail-POSIX/aio.h/conform = yes
 test-xfail-POSIX/mqueue.h/conform = yes
 test-xfail-POSIX/sys/types.h/conform = yes
-test-xfail-UNIX98/fcntl.h/conform = yes
-test-xfail-UNIX98/netdb.h/conform = yes
 test-xfail-UNIX98/signal.h/conform = yes
-test-xfail-UNIX98/semaphore.h/conform = yes
 test-xfail-UNIX98/regex.h/conform = yes
 test-xfail-UNIX98/aio.h/conform = yes
-test-xfail-UNIX98/ftw.h/conform = yes
 test-xfail-UNIX98/mqueue.h/conform = yes
-test-xfail-UNIX98/netinet/in.h/conform = yes
-test-xfail-UNIX98/sys/sem.h/conform = yes
-test-xfail-UNIX98/sys/uio.h/conform = yes
-test-xfail-UNIX98/sys/socket.h/conform = yes
 test-xfail-UNIX98/sys/types.h/conform = yes
 test-xfail-UNIX98/stdlib.h/conform = yes
-test-xfail-UNIX98/arpa/inet.h/conform = yes
-test-xfail-POSIX2008/fcntl.h/conform = yes
-test-xfail-POSIX2008/netdb.h/conform = yes
 test-xfail-POSIX2008/signal.h/conform = yes
-test-xfail-POSIX2008/semaphore.h/conform = yes
 test-xfail-POSIX2008/regex.h/conform = yes
 test-xfail-POSIX2008/aio.h/conform = yes
 test-xfail-POSIX2008/mqueue.h/conform = yes
-test-xfail-POSIX2008/netinet/in.h/conform = yes
-test-xfail-POSIX2008/sys/socket.h/conform = yes
 test-xfail-POSIX2008/sys/types.h/conform = yes
-test-xfail-POSIX2008/arpa/inet.h/conform = yes
-test-xfail-XOPEN2K/fcntl.h/conform = yes
-test-xfail-XOPEN2K/netdb.h/conform = yes
 test-xfail-XOPEN2K/signal.h/conform = yes
-test-xfail-XOPEN2K/semaphore.h/conform = yes
 test-xfail-XOPEN2K/regex.h/conform = yes
 test-xfail-XOPEN2K/aio.h/conform = yes
-test-xfail-XOPEN2K/ftw.h/conform = yes
 test-xfail-XOPEN2K/mqueue.h/conform = yes
-test-xfail-XOPEN2K/netinet/in.h/conform = yes
-test-xfail-XOPEN2K/sys/sem.h/conform = yes
-test-xfail-XOPEN2K/sys/uio.h/conform = yes
-test-xfail-XOPEN2K/sys/socket.h/conform = yes
 test-xfail-XOPEN2K/sys/types.h/conform = yes
 test-xfail-XOPEN2K/stdlib.h/conform = yes
-test-xfail-XOPEN2K/arpa/inet.h/conform = yes
-test-xfail-XOPEN2K8/fcntl.h/conform = yes
-test-xfail-XOPEN2K8/netdb.h/conform = yes
 test-xfail-XOPEN2K8/signal.h/conform = yes
-test-xfail-XOPEN2K8/semaphore.h/conform = yes
 test-xfail-XOPEN2K8/regex.h/conform = yes
 test-xfail-XOPEN2K8/aio.h/conform = yes
-test-xfail-XOPEN2K8/ftw.h/conform = yes
 test-xfail-XOPEN2K8/mqueue.h/conform = yes
-test-xfail-XOPEN2K8/netinet/in.h/conform = yes
-test-xfail-XOPEN2K8/sys/sem.h/conform = yes
-test-xfail-XOPEN2K8/sys/uio.h/conform = yes
-test-xfail-XOPEN2K8/sys/socket.h/conform = yes
 test-xfail-XOPEN2K8/sys/types.h/conform = yes
 test-xfail-XOPEN2K8/stdlib.h/conform = yes
-test-xfail-XOPEN2K8/arpa/inet.h/conform = yes
 
 # For bug 23819
 test-xfail-ISO11/threads.h/linknamespace = yes
diff --git a/sysdeps/mach/hurd/sendfile.c b/sysdeps/mach/hurd/sendfile.c
index 4857396cf7..dbb1ab8730 100644
--- a/sysdeps/mach/hurd/sendfile.c
+++ b/sysdeps/mach/hurd/sendfile.c
@@ -17,6 +17,7 @@ 
    <http://www.gnu.org/licenses/>.  */
 
 #include <sys/sendfile.h>
+#include <sys/types.h>
 #include <stddef.h>
 
 /* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
diff --git a/sysdeps/nptl/proc_service.h b/sysdeps/nptl/proc_service.h
index 4aa52c6390..600cbd132e 100644
--- a/sysdeps/nptl/proc_service.h
+++ b/sysdeps/nptl/proc_service.h
@@ -22,6 +22,9 @@ 
 /* The definitions in this file must correspond to those in the debugger.  */
 #include <sys/procfs.h>
 
+#include <bits/types/size_t.h>
+#include <bits/types/pid_t.h>
+
 __BEGIN_DECLS
 
 /* Functions in this interface return one of these status codes.  */
diff --git a/sysdeps/nptl/sys/procfs.h b/sysdeps/nptl/sys/procfs.h
index 6ade66dfb6..0f886746e2 100644
--- a/sysdeps/nptl/sys/procfs.h
+++ b/sysdeps/nptl/sys/procfs.h
@@ -19,7 +19,8 @@ 
 #ifndef _SYS_PROCFS_H
 #define _SYS_PROCFS_H	1
 
-#include <sys/types.h>
+#include <features.h>
+#include <bits/types.h>
 
 /* The rest of this file provides the types for emulation of the
    Solaris <proc_service.h> interfaces that should be implemented by
diff --git a/sysdeps/nptl/thread_db.h b/sysdeps/nptl/thread_db.h
index 4d949b0c37..3d6cb3a891 100644
--- a/sysdeps/nptl/thread_db.h
+++ b/sysdeps/nptl/thread_db.h
@@ -24,7 +24,6 @@ 
    with the goal to share the same code in the debugger.  */
 #include <pthread.h>
 #include <stdint.h>
-#include <sys/types.h>
 #include <sys/procfs.h>
 #include <bits/types/sigset_t.h>
 
diff --git a/sysdeps/posix/dl-fileid.h b/sysdeps/posix/dl-fileid.h
index 1ed7c2c57b..6a5dfc7446 100644
--- a/sysdeps/posix/dl-fileid.h
+++ b/sysdeps/posix/dl-fileid.h
@@ -23,8 +23,8 @@ 
    a unique identifier for a file.  */
 struct r_file_id
   {
-    dev_t dev;
-    ino64_t ino;
+    __dev_t dev;
+    __ino64_t ino;
   };
 
 /* Sample FD to fill in *ID.  Returns true on success.
diff --git a/sysdeps/powerpc/sys/platform/ppc.h b/sysdeps/powerpc/sys/platform/ppc.h
index 40ac0a5245..fe4d445dd4 100644
--- a/sysdeps/powerpc/sys/platform/ppc.h
+++ b/sysdeps/powerpc/sys/platform/ppc.h
@@ -20,24 +20,24 @@ 
 #define _SYS_PLATFORM_PPC_H	1
 
 #include <features.h>
-#include <stdint.h>
+#include <bits/types.h>
 #include <bits/ppc.h>
 
 /* Read the Time Base Register.   */
-static __inline__ uint64_t
+static __inline__ __uint64_t
 __ppc_get_timebase (void)
 {
 #if __GNUC_PREREQ (4, 8)
   return __builtin_ppc_get_timebase ();
 #else
 # ifdef __powerpc64__
-  uint64_t __tb;
+  __uint64_t __tb;
   /* "volatile" is necessary here, because the user expects this assembly
      isn't moved after an optimization.  */
   __asm__ volatile ("mfspr %0, 268" : "=r" (__tb));
   return __tb;
 # else  /* not __powerpc64__ */
-  uint32_t __tbu, __tbl, __tmp; \
+  __uint32_t __tbu, __tbl, __tmp;
   __asm__ volatile ("0:\n\t"
 		    "mftbu %0\n\t"
 		    "mftbl %1\n\t"
@@ -45,7 +45,7 @@  __ppc_get_timebase (void)
 		    "cmpw %0, %2\n\t"
 		    "bne- 0b"
 		    : "=r" (__tbu), "=r" (__tbl), "=r" (__tmp));
-  return (((uint64_t) __tbu << 32) | __tbl);
+  return (((__uint64_t) __tbu << 32) | __tbl);
 # endif  /* not __powerpc64__ */
 #endif
 }
diff --git a/sysdeps/pthread/semaphore.h b/sysdeps/pthread/semaphore.h
index 87c054392c..075b0be175 100644
--- a/sysdeps/pthread/semaphore.h
+++ b/sysdeps/pthread/semaphore.h
@@ -19,7 +19,7 @@ 
 #define _SEMAPHORE_H	1
 
 #include <features.h>
-#include <sys/types.h>
+
 #ifdef __USE_XOPEN2K
 # include <bits/types/struct_timespec.h>
 #endif
diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h b/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
index ea91de06bd..fec2f6a266 100644
--- a/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
@@ -17,19 +17,28 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
+#include <bits/types.h>
+
 /* Type for a general-purpose register.  */
 typedef __uint64_t elf_greg_t;
 
 /* And the whole bunch of them.  We could have used `struct
-   pt_regs' directly in the typedef, but tradition says that
+   user_regs_struct' directly in the typedef, but tradition says that
    the register set is an array, which does have some peculiar
-   semantics, so leave it that way.  */
+   semantics, so leave it that way.
+
+   struct user_regs_struct is defined in sys/user.h.  */
 #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
 typedef struct user_fpsimd_struct elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/epoll.h b/sysdeps/unix/sysv/linux/alpha/bits/epoll.h
index 3bf1853cd8..41dd9c51c4 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -25,3 +28,5 @@  enum
     EPOLL_CLOEXEC  = 010000000
 #define EPOLL_CLOEXEC EPOLL_CLOEXEC
   };
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
index a5fffc0005..58b015fbc6 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
@@ -17,9 +17,18 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_PRREGSET_H
+#define _BITS_PROCFS_PRREGSET_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs-prregset.h> directly; use <sys/procfs.h> instead."
 #endif
 
+/* For gregset_t and fpregset_t.  FIXME: sys/procfs.h should not
+   expose all of sys/ucontext.h.  */
+#include <sys/ucontext.h>
+
 typedef gregset_t __prgregset_t;
 typedef fpregset_t __prfpregset_t;
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/procfs.h b/sysdeps/unix/sysv/linux/alpha/bits/procfs.h
index d0fd280821..f04a453bd5 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/procfs.h
@@ -16,13 +16,13 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-#include <signal.h>
-#include <sys/ucontext.h>
-
 /*
  * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long.
  * I have no idea why that is so.  For now, we just leave it at 33
@@ -36,3 +36,5 @@  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 typedef double elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/acct.h b/sysdeps/unix/sysv/linux/alpha/sys/acct.h
index 95e5b86e2f..98c92edc0d 100644
--- a/sysdeps/unix/sysv/linux/alpha/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/alpha/sys/acct.h
@@ -16,8 +16,8 @@ 
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _SYS_ACCT_H
-
 #define _SYS_ACCT_H	1
+
 #include <features.h>
 
 #include <bits/types/time_t.h>
diff --git a/sysdeps/unix/sysv/linux/arm/bits/procfs.h b/sysdeps/unix/sysv/linux/arm/bits/procfs.h
index f168b3af20..333fff661b 100644
--- a/sysdeps/unix/sysv/linux/arm/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/arm/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -26,9 +29,13 @@  typedef unsigned long elf_greg_t;
 /* And the whole bunch of them.  We could have used `struct
    user_regs' directly in the typedef, but tradition says that
    the register set is an array, which does have some peculiar
-   semantics, so leave it that way.  */
+   semantics, so leave it that way.
+
+   struct user_regs is defined in sys/user.h.  */
 #define ELF_NGREG (sizeof (struct user_regs) / sizeof (elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
 typedef struct user_fpregs elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/bits/epoll.h b/sysdeps/unix/sysv/linux/bits/epoll.h
index eaba990c23..a00f3d9431 100644
--- a/sysdeps/unix/sysv/linux/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -25,3 +28,5 @@  enum
     EPOLL_CLOEXEC = 02000000
 #define EPOLL_CLOEXEC EPOLL_CLOEXEC
   };
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/bits/sem.h b/sysdeps/unix/sysv/linux/bits/sem.h
index a216459010..68600e3917 100644
--- a/sysdeps/unix/sysv/linux/bits/sem.h
+++ b/sysdeps/unix/sysv/linux/bits/sem.h
@@ -15,11 +15,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_SEM_H
+#define _BITS_SEM_H 1
+
 #ifndef _SYS_SEM_H
 # error "Never include <bits/sem.h> directly; use <sys/sem.h> instead."
 #endif
 
-#include <sys/types.h>
+#include <bits/types.h>
 #include <bits/sem-pad.h>
 
 /* Flags for `semop'.  */
@@ -95,3 +98,5 @@  struct  seminfo
 };
 
 #endif /* __USE_MISC */
+
+#endif /* bits/sem.h */
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index 19e664842f..ef3d6f9fc5 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -24,7 +24,7 @@ 
 #endif
 
 
-#include <sys/types.h>
+#include <bits/types.h>
 #include <bits/types/size_t.h>
 #include <bits/types/socklen_t.h>
 
@@ -337,9 +337,9 @@  enum
 /* User visible structure for SCM_CREDENTIALS message */
 struct ucred
 {
-  pid_t pid;			/* PID of sending process.  */
-  uid_t uid;			/* UID of sending process.  */
-  gid_t gid;			/* GID of sending process.  */
+  __pid_t pid;			/* PID of sending process.  */
+  __uid_t uid;			/* UID of sending process.  */
+  __gid_t gid;			/* GID of sending process.  */
 };
 #endif
 
diff --git a/sysdeps/unix/sysv/linux/bits/uio-ext.h b/sysdeps/unix/sysv/linux/bits/uio-ext.h
index c4ea63df0b..a39080691b 100644
--- a/sysdeps/unix/sysv/linux/bits/uio-ext.h
+++ b/sysdeps/unix/sysv/linux/bits/uio-ext.h
@@ -26,7 +26,7 @@ 
 __BEGIN_DECLS
 
 /* Read from another process' address space.  */
-extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec,
+extern ssize_t process_vm_readv (__pid_t __pid, const struct iovec *__lvec,
 				 unsigned long int __liovcnt,
 				 const struct iovec *__rvec,
 				 unsigned long int __riovcnt,
@@ -34,7 +34,7 @@  extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec,
   __THROW;
 
 /* Write to another process' address space.  */
-extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
+extern ssize_t process_vm_writev (__pid_t __pid, const struct iovec *__lvec,
 				  unsigned long int __liovcnt,
 				  const struct iovec *__rvec,
 				  unsigned long int __riovcnt,
diff --git a/sysdeps/unix/sysv/linux/csky/bits/procfs.h b/sysdeps/unix/sysv/linux/csky/bits/procfs.h
index 4ec0c5e759..97982b65bd 100644
--- a/sysdeps/unix/sysv/linux/csky/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/csky/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -35,3 +38,5 @@  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 #define ELF_NFPREG (sizeof (struct user_fp) / sizeof (elf_fpreg_t))
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/epoll.h b/sysdeps/unix/sysv/linux/hppa/bits/epoll.h
index 156bda0f3c..77722144f0 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -25,3 +28,5 @@  enum
     EPOLL_CLOEXEC = 010000000
 #define EPOLL_CLOEXEC EPOLL_CLOEXEC
   };
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/procfs.h b/sysdeps/unix/sysv/linux/hppa/bits/procfs.h
index 9d57472b5e..5bbdb2bc2e 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -28,3 +31,5 @@  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 #define ELF_NFPREG 32
 typedef double elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/ipc.h b/sysdeps/unix/sysv/linux/ia64/bits/ipc.h
index 6f9705e28a..a6fbabec64 100644
--- a/sysdeps/unix/sysv/linux/ia64/bits/ipc.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/ipc.h
@@ -20,7 +20,7 @@ 
 # error "Never use <bits/ipc.h> directly; include <sys/ipc.h> instead."
 #endif
 
-#include <sys/types.h>
+#include <bits/types.h>
 
 /* Mode bits for `msgget', `semget', and `shmget'.  */
 #define IPC_CREAT	01000		/* Create key if key does not exist. */
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/procfs.h b/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
index 8918975e1d..754e9690c9 100644
--- a/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
@@ -16,11 +16,15 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-#include <signal.h>
+/* For struct __ia64_fpreg.  FIXME: sys/procfs.h should not expose all
+   of sys/ucontext.h.  */
 #include <sys/ucontext.h>
 #include <bits/sigcontext.h>
 
@@ -39,3 +43,5 @@  typedef elf_greg_t greg_t;
 typedef elf_gregset_t gregset_t;
 typedef elf_fpregset_t fpregset_t;
 #define NGREG ELF_NGREG
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/bits/procfs.h b/sysdeps/unix/sysv/linux/m68k/bits/procfs.h
index 4a9d4aa3cc..401ac2354a 100644
--- a/sysdeps/unix/sysv/linux/m68k/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/m68k/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -26,9 +29,13 @@  typedef unsigned long elf_greg_t;
 /* And the whole bunch of them.  We could have used `struct
    user_regs_struct' directly in the typedef, but tradition says that
    the register set is an array, which does have some peculiar
-   semantics, so leave it that way.  */
+   semantics, so leave it that way.
+
+   struct user_regs_struct is defined by sys/user.h.  */
 #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
 typedef struct user_m68kfp_struct elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/microblaze/bits/procfs.h b/sysdeps/unix/sysv/linux/microblaze/bits/procfs.h
index 7da4b7385b..0f425272a3 100644
--- a/sysdeps/unix/sysv/linux/microblaze/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/microblaze/bits/procfs.h
@@ -17,6 +17,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -27,9 +30,13 @@  typedef unsigned long elf_greg_t;
 /* And the whole bunch of them.  We could have used `struct
    user_regs_struct' directly in the typedef, but tradition says that
    the register set is an array, which does have some peculiar
-   semantics, so leave it that way.  */
+   semantics, so leave it that way.
+
+   struct user_regs_struct is defined by sys/user.h.  */
 #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
 typedef struct user_fpregs_struct elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/microblaze/sys/user.h b/sysdeps/unix/sysv/linux/microblaze/sys/user.h
index baf6a28247..e6542ecd1b 100644
--- a/sysdeps/unix/sysv/linux/microblaze/sys/user.h
+++ b/sysdeps/unix/sysv/linux/microblaze/sys/user.h
@@ -17,7 +17,9 @@ 
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _SYS_USER_H
-# define _SYS_USER_H	1
+#define _SYS_USER_H	1
+
+#include <features.h>
 
 #include <features.h>
 
diff --git a/sysdeps/unix/sysv/linux/mips/bits/epoll.h b/sysdeps/unix/sysv/linux/mips/bits/epoll.h
index eaba990c23..a00f3d9431 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -25,3 +28,5 @@  enum
     EPOLL_CLOEXEC = 02000000
 #define EPOLL_CLOEXEC EPOLL_CLOEXEC
   };
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/mips/bits/procfs.h b/sysdeps/unix/sysv/linux/mips/bits/procfs.h
index 7df96af52d..6543713624 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -35,3 +38,5 @@  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 typedef double elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/nios2/bits/procfs.h b/sysdeps/unix/sysv/linux/nios2/bits/procfs.h
index a8431229ff..0c401edadc 100644
--- a/sysdeps/unix/sysv/linux/nios2/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/nios2/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -32,3 +35,5 @@  typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
 typedef struct user_fpregs elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h b/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
index 4b5667a68e..77436a93f7 100644
--- a/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
@@ -26,7 +26,7 @@ 
 __BEGIN_DECLS
 
 /* Read the time base frequency.   */
-extern uint64_t __ppc_get_timebase_freq (void);
+extern __uint64_t __ppc_get_timebase_freq (void);
 
 __END_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/procfs.h b/sysdeps/unix/sysv/linux/powerpc/bits/procfs.h
index cf67771a9d..18c6870977 100644
--- a/sysdeps/unix/sysv/linux/powerpc/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/procfs.h
@@ -16,17 +16,20 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-#include <signal.h>
-#include <sys/ucontext.h>
+#include <bits/wordsize.h>
+#include <asm/elf.h>
+
+/* These definitions may have been provided by asm/elf.h.  Otherwise
+   we define them here.  */
+#ifndef ELF_NGREG
 
-/* These definitions are normally provided by ucontext.h via
-   asm/sigcontext.h, asm/ptrace.h, and asm/elf.h.  Otherwise we define
-   them here.  */
-#if !defined __PPC64_ELF_H && !defined _ASM_POWERPC_ELF_H
 #define ELF_NGREG       48      /* includes nip, msr, lr, etc. */
 #define ELF_NFPREG      33      /* includes fpscr */
 #if __WORDSIZE == 32
@@ -46,4 +49,7 @@  typedef struct {
   unsigned int u[4];
 } __attribute__ ((__aligned__ (16))) elf_vrreg_t;
 typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
-#endif
+
+#endif /* ifndef ELF_NGREG */
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/user.h b/sysdeps/unix/sysv/linux/powerpc/sys/user.h
index 2d90235a14..3c928cef37 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/user.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sys/user.h
@@ -22,6 +22,7 @@ 
 #include <bits/types/size_t.h>
 
 #include <asm/ptrace.h>
+#include <bits/types/size_t.h>
 
 struct user {
 	struct pt_regs	regs;			/* entire machine state */
diff --git a/sysdeps/unix/sysv/linux/riscv/bits/procfs.h b/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
index f2e4503d5d..6ab26013a6 100644
--- a/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
@@ -16,10 +16,16 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
+/* FIXME: sys/ucontext.h does not define NGREG or NFPREG unless
+   __USE_MISC is active, and sys/procfs.h should not expose all of
+   sys/ucontext.h.  */
 #include <sys/ucontext.h>
 
 /* ELF register definitions */
@@ -29,3 +35,5 @@ 
 typedef unsigned long int elf_greg_t;
 typedef unsigned long int elf_gregset_t[32];
 typedef union __riscv_mc_fp_state elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/s390/bits/procfs.h b/sysdeps/unix/sysv/linux/s390/bits/procfs.h
index 364051c1c7..597ccdb754 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/procfs.h
@@ -16,10 +16,15 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
+/* FIXME: sys/ucontext.h does not define NGREG unless __USE_MISC is
+   active, and sys/procfs.h should not expose all of sys/ucontext.h.  */
 #include <sys/ucontext.h>
 
 typedef greg_t elf_greg_t;
@@ -27,3 +32,5 @@  typedef greg_t elf_greg_t;
 typedef gregset_t elf_gregset_t;
 typedef fpreg_t   elf_fpreg_t;
 typedef fpregset_t elf_fpregset_t;
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/gnu/bits/utmp.h b/sysdeps/unix/sysv/linux/s390/bits/utmp.h
similarity index 83%
rename from sysdeps/gnu/bits/utmp.h
rename to sysdeps/unix/sysv/linux/s390/bits/utmp.h
index 7357034cb6..553fb30fb5 100644
--- a/sysdeps/gnu/bits/utmp.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/utmp.h
@@ -1,4 +1,4 @@ 
-/* The `struct utmp' type, describing entries in the utmp file.  GNU version.
+/* The `struct utmp' type, describing entries in the utmp file.  S/390 version.
    Copyright (C) 1993-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,15 +16,13 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_UTMP_H
+#define _BITS_UTMP_H 1
+
 #ifndef _UTMP_H
 # error "Never include <bits/utmp.h> directly; use <utmp.h> instead."
 #endif
 
-#include <paths.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <bits/wordsize.h>
-
 
 #define UT_LINESIZE	32
 #define UT_NAMESIZE	32
@@ -35,11 +33,7 @@ 
    previous logins.  */
 struct lastlog
   {
-#if __WORDSIZE_TIME64_COMPAT32
-    int32_t ll_time;
-#else
-    __time_t ll_time;
-#endif
+    __time64_t ll_time;
     char ll_line[UT_LINESIZE];
     char ll_host[UT_HOSTSIZE];
   };
@@ -68,23 +62,20 @@  struct utmp
     __attribute_nonstring__;	/* Hostname for remote login.  */
   struct exit_status ut_exit;	/* Exit status of a process marked
 				   as DEAD_PROCESS.  */
+
 /* The ut_session and ut_tv fields must be the same size when compiled
    32- and 64-bit.  This allows data files and shared memory to be
-   shared between 32- and 64-bit applications.  */
-#if __WORDSIZE_TIME64_COMPAT32
-  int32_t ut_session;		/* Session ID, used for windowing.  */
+   shared between 32- and 64-bit applications.  Even on 64-bit systems,
+   struct timeval is not guaranteed to have both fields be 64 bits.  */
+  __int64_t ut_session;		/* Session ID, used for windowing.  */
   struct
   {
-    int32_t tv_sec;		/* Seconds.  */
-    int32_t tv_usec;		/* Microseconds.  */
+    __int64_t tv_sec;		/* Seconds.  */
+    __int64_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
-#else
-  long int ut_session;		/* Session ID, used for windowing.  */
-  struct timeval ut_tv;		/* Time entry was made.  */
-#endif
 
-  int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
-  char __glibc_reserved[20];		/* Reserved for future use.  */
+  __int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
+  char __glibc_reserved[20];	/* Reserved for future use.  */
 };
 
 /* Backwards compatibility hacks.  */
@@ -124,3 +115,5 @@  struct utmp
 #define _HAVE_UT_ID	1
 #define _HAVE_UT_TV	1
 #define _HAVE_UT_HOST	1
+
+#endif /* bits/utmp.h */
diff --git a/sysdeps/unix/sysv/linux/s390/bits/utmpx.h b/sysdeps/unix/sysv/linux/s390/bits/utmpx.h
index ea3e860a2d..e498e72cff 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/utmpx.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/utmpx.h
@@ -1,4 +1,4 @@ 
-/* Structures and definitions for the user accounting database.  GNU version.
+/* Structures and definitions for the user accounting database.  S/390 version.
    Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,22 +16,13 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_UTMPX_H
+#define _BITS_UTMPX_H 1
+
 #ifndef _UTMPX_H
 # error "Never include <bits/utmpx.h> directly; use <utmpx.h> instead."
 #endif
 
-#include <bits/types.h>
-#include <sys/time.h>
-#include <bits/wordsize.h>
-
-
-#ifdef __USE_GNU
-# include <paths.h>
-# define _PATH_UTMPX	_PATH_UTMP
-# define _PATH_WTMPX	_PATH_WTMP
-#endif
-
-
 #define __UT_LINESIZE	32
 #define __UT_NAMESIZE	32
 #define __UT_HOSTSIZE	256
@@ -55,7 +46,7 @@  struct __exit_status
 struct utmpx
 {
   short int ut_type;		/* Type of login.  */
-  __pid_t ut_pid;		/* Process ID of login process.  */
+  pid_t ut_pid;			/* Process ID of login process.  */
   char ut_line[__UT_LINESIZE];	/* Devicename.  */
   char ut_id[4];		/* Inittab ID. */
   char ut_user[__UT_NAMESIZE];	/* Username.  */
@@ -63,20 +54,17 @@  struct utmpx
   struct __exit_status ut_exit;	/* Exit status of a process marked
 				   as DEAD_PROCESS.  */
 
-/* The fields ut_session and ut_tv must be the same size when compiled
-   32- and 64-bit.  This allows files and shared memory to be shared
-   between 32- and 64-bit applications.  */
-#if __WORDSIZE == 32
+/* The ut_session and ut_tv fields must be the same size when compiled
+   32- and 64-bit.  This allows data files and shared memory to be
+   shared between 32- and 64-bit applications.  Even on 64-bit systems,
+   struct timeval is not guaranteed to have both fields be 64 bits.  */
   __int64_t ut_session;		/* Session ID, used for windowing.  */
   struct
   {
     __int64_t tv_sec;		/* Seconds.  */
     __int64_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
-#else
-  long int ut_session;		/* Session ID, used for windowing.  */
-  struct timeval ut_tv;		/* Time entry was made.  */
-#endif
+
   __int32_t ut_addr_v6[4];	/* Internet address of remote host.  */
   char __glibc_reserved[20];		/* Reserved for future use.  */
 };
@@ -100,3 +88,5 @@  struct utmpx
 #ifdef __USE_GNU
 # define ACCOUNTING	9	/* System accounting.  */
 #endif
+
+#endif /* bits/utmpx.h */
diff --git a/sysdeps/unix/sysv/linux/sh/bits/procfs.h b/sysdeps/unix/sysv/linux/sh/bits/procfs.h
index 5e33070aac..1825874736 100644
--- a/sysdeps/unix/sysv/linux/sh/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/sh/bits/procfs.h
@@ -16,9 +16,14 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
 /* elf_gregset_t and elf_fpregset_t are defined by sys/user.h for
    SH.  */
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/epoll.h b/sysdeps/unix/sysv/linux/sparc/bits/epoll.h
index 29e00522b3..2ddfe7b5ee 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -25,3 +28,5 @@  enum
     EPOLL_CLOEXEC = 0x400000
 #define EPOLL_CLOEXEC EPOLL_CLOEXEC
   };
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/procfs.h b/sysdeps/unix/sysv/linux/sparc/bits/procfs.h
index cc7ca46f4a..9aa9c6d72c 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/procfs.h
@@ -16,12 +16,13 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-#include <signal.h>
-#include <sys/ucontext.h>
 #include <bits/wordsize.h>
 
 #if __WORDSIZE == 64
@@ -59,3 +60,5 @@  typedef struct
 
 typedef unsigned long elf_greg_t;
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+#endif /* bits/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
index 4c119dafd2..515045b275 100644
--- a/sysdeps/unix/sysv/linux/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -18,10 +18,10 @@ 
 #ifndef _SYS_ACCT_H
 #define _SYS_ACCT_H	1
 
-#include <sys/types.h>
-#include <stdint.h>
+#include <features.h>
+
 #include <bits/endian.h>
-#include <bits/types/time_t.h>
+#include <bits/stdint-uintn.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h
index 51ec53dbca..3a16323328 100644
--- a/sysdeps/unix/sysv/linux/sys/epoll.h
+++ b/sysdeps/unix/sysv/linux/sys/epoll.h
@@ -18,9 +18,9 @@ 
 #ifndef	_SYS_EPOLL_H
 #define	_SYS_EPOLL_H	1
 
-#include <stdint.h>
-#include <sys/types.h>
+#include <features.h>
 
+#include <bits/types.h>
 #include <bits/types/sigset_t.h>
 
 /* Get the platform-dependent flags.  */
@@ -76,13 +76,13 @@  typedef union epoll_data
 {
   void *ptr;
   int fd;
-  uint32_t u32;
-  uint64_t u64;
+  __uint32_t u32;
+  __uint64_t u64;
 } epoll_data_t;
 
 struct epoll_event
 {
-  uint32_t events;	/* Epoll events */
+  __uint32_t events;	/* Epoll events */
   epoll_data_t data;	/* User data variable */
 } __EPOLL_PACKED;
 
diff --git a/sysdeps/unix/sysv/linux/sys/eventfd.h b/sysdeps/unix/sysv/linux/sys/eventfd.h
index d0a9d4c4a8..b6a6c18157 100644
--- a/sysdeps/unix/sysv/linux/sys/eventfd.h
+++ b/sysdeps/unix/sysv/linux/sys/eventfd.h
@@ -18,13 +18,14 @@ 
 #ifndef	_SYS_EVENTFD_H
 #define	_SYS_EVENTFD_H	1
 
-#include <stdint.h>
+#include <features.h>
+#include <bits/types.h>
 
 /* Get the platform-dependent flags.  */
 #include <bits/eventfd.h>
 
 /* Type for event counter.  */
-typedef uint64_t eventfd_t;
+typedef __uint64_t eventfd_t;
 
 
 __BEGIN_DECLS
diff --git a/sysdeps/unix/sysv/linux/sys/fanotify.h b/sysdeps/unix/sysv/linux/sys/fanotify.h
index a37b9b6eb3..c024f6a32a 100644
--- a/sysdeps/unix/sysv/linux/sys/fanotify.h
+++ b/sysdeps/unix/sysv/linux/sys/fanotify.h
@@ -18,10 +18,10 @@ 
 #ifndef	_SYS_FANOTIFY_H
 #define	_SYS_FANOTIFY_H	1
 
-#include <stdint.h>
+#include <features.h>
+#include <bits/types.h>
 #include <linux/fanotify.h>
 
-
 __BEGIN_DECLS
 
 /* Create and initialize fanotify group.  */
@@ -30,7 +30,7 @@  extern int fanotify_init (unsigned int __flags, unsigned int __event_f_flags)
 
 /* Add, remove, or modify an fanotify mark on a filesystem object.  */
 extern int fanotify_mark (int __fanotify_fd, unsigned int __flags,
-			  uint64_t __mask, int __dfd, const char *__pathname)
+			  __uint64_t __mask, int __dfd, const char *__pathname)
      __THROW;
 
 __END_DECLS
diff --git a/sysdeps/unix/sysv/linux/sys/fsuid.h b/sysdeps/unix/sysv/linux/sys/fsuid.h
index 54bd2d9c60..054d20c9e6 100644
--- a/sysdeps/unix/sysv/linux/sys/fsuid.h
+++ b/sysdeps/unix/sysv/linux/sys/fsuid.h
@@ -19,7 +19,7 @@ 
 #define _SYS_FSUID_H	1
 
 #include <features.h>
-#include <sys/types.h>
+#include <bits/types.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/sys/inotify.h b/sysdeps/unix/sysv/linux/sys/inotify.h
index 4b59b8e376..4dc7fc208f 100644
--- a/sysdeps/unix/sysv/linux/sys/inotify.h
+++ b/sysdeps/unix/sysv/linux/sys/inotify.h
@@ -18,7 +18,8 @@ 
 #ifndef	_SYS_INOTIFY_H
 #define	_SYS_INOTIFY_H	1
 
-#include <stdint.h>
+#include <features.h>
+#include <bits/types.h>
 
 /* Get the platform-dependent flags.  */
 #include <bits/inotify.h>
@@ -28,9 +29,9 @@ 
 struct inotify_event
 {
   int wd;		/* Watch descriptor.  */
-  uint32_t mask;	/* Watch mask.  */
-  uint32_t cookie;	/* Cookie to synchronize two events.  */
-  uint32_t len;		/* Length (including NULs) of name.  */
+  __uint32_t mask;	/* Watch mask.  */
+  __uint32_t cookie;	/* Cookie to synchronize two events.  */
+  __uint32_t len;	/* Length (including NULs) of name.  */
   char name __flexarr;	/* Name.  */
 };
 
@@ -89,7 +90,7 @@  extern int inotify_init1 (int __flags) __THROW;
 
 /* Add watch of object NAME to inotify instance FD.  Notify about
    events specified by MASK.  */
-extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask)
+extern int inotify_add_watch (int __fd, const char *__name, __uint32_t __mask)
   __THROW;
 
 /* Remove the watch specified by WD from the inotify instance FD.  */
diff --git a/sysdeps/unix/sysv/linux/sys/procfs.h b/sysdeps/unix/sysv/linux/sys/procfs.h
index d24c19138a..c9ef13ff6e 100644
--- a/sysdeps/unix/sysv/linux/sys/procfs.h
+++ b/sysdeps/unix/sysv/linux/sys/procfs.h
@@ -30,8 +30,10 @@ 
    GDB unless you know what you are doing.  */
 
 #include <features.h>
-#include <sys/time.h>
-#include <sys/types.h>
+
+#include <bits/types.h>
+#include <bits/types/struct_timeval.h>
+
 #include <sys/user.h>
 
 /* bits/procfs.h, provided by each architecture, must define
diff --git a/sysdeps/unix/sysv/linux/sys/quota.h b/sysdeps/unix/sysv/linux/sys/quota.h
index 8c3a5a1da6..cf55f48ae5 100644
--- a/sysdeps/unix/sysv/linux/sys/quota.h
+++ b/sysdeps/unix/sysv/linux/sys/quota.h
@@ -52,8 +52,8 @@ 
 #define _SYS_QUOTA_H 1
 
 #include <features.h>
-#include <sys/types.h>
 
+#include <bits/types.h>
 #include <linux/quota.h>
 
 /*
diff --git a/sysdeps/unix/sysv/linux/sys/raw.h b/sysdeps/unix/sysv/linux/sys/raw.h
index b4e5a82b6e..fbdefe0221 100644
--- a/sysdeps/unix/sysv/linux/sys/raw.h
+++ b/sysdeps/unix/sysv/linux/sys/raw.h
@@ -18,7 +18,8 @@ 
 #ifndef _SYS_RAW_H
 #define _SYS_RAW_H	1
 
-#include <stdint.h>
+#include <features.h>
+#include <bits/types.h>
 #include <sys/ioctl.h>
 
 /* The major device number for raw devices.  */
@@ -31,8 +32,8 @@ 
 struct raw_config_request
 {
   int raw_minor;
-  uint64_t block_major;
-  uint64_t block_minor;
+  __uint64_t block_major;
+  __uint64_t block_minor;
 };
 
 #endif /* sys/raw.h */
diff --git a/sysdeps/unix/sysv/linux/sys/signalfd.h b/sysdeps/unix/sysv/linux/sys/signalfd.h
index 13fd8b43fc..5a8f035301 100644
--- a/sysdeps/unix/sysv/linux/sys/signalfd.h
+++ b/sysdeps/unix/sysv/linux/sys/signalfd.h
@@ -18,7 +18,8 @@ 
 #ifndef	_SYS_SIGNALFD_H
 #define	_SYS_SIGNALFD_H	1
 
-#include <stdint.h>
+#include <features.h>
+#include <bits/types.h>
 #include <bits/types/sigset_t.h>
 
 /* Get the platform-dependent flags.  */
@@ -26,28 +27,28 @@ 
 
 struct signalfd_siginfo
 {
-  uint32_t ssi_signo;
-  int32_t ssi_errno;
-  int32_t ssi_code;
-  uint32_t ssi_pid;
-  uint32_t ssi_uid;
-  int32_t ssi_fd;
-  uint32_t ssi_tid;
-  uint32_t ssi_band;
-  uint32_t ssi_overrun;
-  uint32_t ssi_trapno;
-  int32_t ssi_status;
-  int32_t ssi_int;
-  uint64_t ssi_ptr;
-  uint64_t ssi_utime;
-  uint64_t ssi_stime;
-  uint64_t ssi_addr;
-  uint16_t ssi_addr_lsb;
-  uint16_t __pad2;
-  int32_t ssi_syscall;
-  uint64_t ssi_call_addr;
-  uint32_t ssi_arch;
-  uint8_t __pad[28];
+  __uint32_t ssi_signo;
+  __int32_t ssi_errno;
+  __int32_t ssi_code;
+  __uint32_t ssi_pid;
+  __uint32_t ssi_uid;
+  __int32_t ssi_fd;
+  __uint32_t ssi_tid;
+  __uint32_t ssi_band;
+  __uint32_t ssi_overrun;
+  __uint32_t ssi_trapno;
+  __int32_t ssi_status;
+  __int32_t ssi_int;
+  __uint64_t ssi_ptr;
+  __uint64_t ssi_utime;
+  __uint64_t ssi_stime;
+  __uint64_t ssi_addr;
+  __uint16_t ssi_addr_lsb;
+  __uint16_t __pad2;
+  __int32_t ssi_syscall;
+  __uint64_t ssi_call_addr;
+  __uint32_t ssi_arch;
+  __uint8_t __pad[28];
 };
 
 __BEGIN_DECLS
diff --git a/sysdeps/unix/sysv/linux/x86/bits/epoll.h b/sysdeps/unix/sysv/linux/x86/bits/epoll.h
index 162874aba3..c8c8737f44 100644
--- a/sysdeps/unix/sysv/linux/x86/bits/epoll.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/epoll.h
@@ -15,6 +15,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_EPOLL_H
+#define _BITS_EPOLL_H 1
+
 #ifndef	_SYS_EPOLL_H
 # error "Never use <bits/epoll.h> directly; include <sys/epoll.h> instead."
 #endif
@@ -27,3 +30,5 @@  enum
   };
 
 #define __EPOLL_PACKED __attribute__ ((__packed__))
+
+#endif /* bits/epoll.h */
diff --git a/sysdeps/unix/sysv/linux/x86/bits/procfs.h b/sysdeps/unix/sysv/linux/x86/bits/procfs.h
index 55ea4c9f48..6feb88c26c 100644
--- a/sysdeps/unix/sysv/linux/x86/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/procfs.h
@@ -16,6 +16,9 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PROCFS_H
+#define _BITS_PROCFS_H 1
+
 #ifndef _SYS_PROCFS_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
@@ -48,3 +51,5 @@  typedef struct user_fpxregs_struct elf_fpxregset_t;
    floating-point stuff.  */
 typedef struct user_fpregs_struct elf_fpregset_t;
 #endif
+
+#endif /* bits/procfs.h */
diff --git a/sysvipc/sys/sem.h b/sysvipc/sys/sem.h
index 6b5d43d71c..09e633592d 100644
--- a/sysvipc/sys/sem.h
+++ b/sysvipc/sys/sem.h
@@ -25,6 +25,8 @@ 
 
 /* Define types required by the standard.  */
 #include <bits/types/size_t.h>
+#include <bits/types/pid_t.h>
+#include <bits/types/time_t.h>
 #ifdef __USE_GNU
 # include <bits/types/struct_timespec.h>
 #endif