summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-11-15 08:22:03 +0000
committerJakub Jelinek <jakub@redhat.com>2005-11-15 08:22:03 +0000
commit22d7fbdbae4032639461a7a081762a05deee0529 (patch)
treeff70bd4613f1f05823b2417b2687449d73ac45b0
parent1beea155aecf2e7d6bfa1399b7c0f4f53dde408c (diff)
Updated to fedora-glibc-20051115T0809
-rw-r--r--ChangeLog291
-rw-r--r--Makeconfig2
-rw-r--r--NEWS32
-rw-r--r--config.h.in16
-rw-r--r--config.make.in4
-rwxr-xr-xconfigure162
-rw-r--r--configure.in125
-rw-r--r--csu/Makefile17
-rw-r--r--csu/elf-init.c17
-rw-r--r--csu/munch-tmpl.c38
-rw-r--r--csu/munch.awk11
-rw-r--r--debug/execinfo.h5
-rw-r--r--dlfcn/dlfcn.c10
-rw-r--r--elf/dl-conflict.c6
-rw-r--r--elf/dl-open.c6
-rw-r--r--elf/elf.h1
-rw-r--r--elf/soinit.c9
-rw-r--r--fedora/branch.mk4
-rw-r--r--hesiod/hesiod.c6
-rw-r--r--hurd/intr-msg.c22
-rw-r--r--iconvdata/ibm1364.h2
-rw-r--r--iconvdata/ibm1388.h4
-rw-r--r--iconvdata/testdata/IBM1364bin98184 -> 98186 bytes
-rw-r--r--iconvdata/testdata/IBM1364..UTF8bin78604 -> 78606 bytes
-rw-r--r--iconvdata/testdata/IBM1388bin162348 -> 162352 bytes
-rw-r--r--iconvdata/testdata/IBM1388..UTF8bin129566 -> 129570 bytes
-rw-r--r--include/fcntl.h4
-rw-r--r--include/libc-symbols.h130
-rw-r--r--include/resolv.h2
-rw-r--r--include/string.h2
-rw-r--r--io/Makefile53
-rw-r--r--io/Versions6
-rw-r--r--io/fcntl.h38
-rw-r--r--io/fstatat.c58
-rw-r--r--io/fstatat64.c58
-rw-r--r--io/sys/stat.h47
-rw-r--r--io/tst-fchownat.c145
-rw-r--r--io/tst-fstatat.c143
-rw-r--r--io/tst-futimesat.c147
-rw-r--r--io/tst-openat.c169
-rw-r--r--io/tst-renameat.c149
-rw-r--r--io/tst-unlinkat.c178
-rw-r--r--libio/stdio.h5
-rw-r--r--localedata/ChangeLog9
-rw-r--r--localedata/SUPPORTED2
-rw-r--r--localedata/locales/pt_BR4
-rw-r--r--malloc/malloc.c20
-rw-r--r--misc/Makefile2
-rw-r--r--misc/Versions1
-rw-r--r--misc/hsearch_r.c4
-rw-r--r--nis/nss_nis/nis-publickey.c4
-rw-r--r--nptl/ChangeLog15
-rw-r--r--nptl/sysdeps/unix/sysv/linux/configure3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c95
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S3
-rw-r--r--nscd/connections.c2
-rw-r--r--posix/execl.c3
-rw-r--r--posix/execv.c5
-rw-r--r--posix/unistd.h14
-rw-r--r--resolv/Versions2
-rw-r--r--resolv/res_data.c4
-rw-r--r--resolv/res_init.c31
-rw-r--r--resolv/res_libc.c16
-rw-r--r--resolv/res_send.c46
-rw-r--r--rt/mqueue.h9
-rw-r--r--stdio-common/Makefile2
-rw-r--r--stdio-common/Versions5
-rw-r--r--stdio-common/psignal.c4
-rw-r--r--stdio-common/vfprintf.c8
-rw-r--r--stdlib/exit.c11
-rw-r--r--string/strsignal.c6
-rw-r--r--string/tester.c6
-rw-r--r--sunrpc/svc.c14
-rw-r--r--sysdeps/generic/check_fds.c32
-rw-r--r--sysdeps/generic/errlist.c6
-rw-r--r--sysdeps/generic/fchownat.c (renamed from sysdeps/unix/bsd/sun/sunos4/tcsetattr.c)45
-rw-r--r--sysdeps/generic/futimesat.c (renamed from sysdeps/unix/bsd/sun/sunos4/tcflush.c)36
-rw-r--r--sysdeps/generic/fxstatat.c49
-rw-r--r--sysdeps/generic/fxstatat64.c50
-rw-r--r--sysdeps/generic/getenv.c5
-rw-r--r--sysdeps/generic/getgroups.c4
-rw-r--r--sysdeps/generic/init-posix.c28
-rw-r--r--sysdeps/generic/libc-tls.c5
-rw-r--r--sysdeps/generic/openat.c69
-rw-r--r--sysdeps/generic/openat64.c69
-rw-r--r--sysdeps/generic/renameat.c50
-rw-r--r--sysdeps/generic/unlinkat.c (renamed from sysdeps/unix/bsd/sun/sunos4/tcgetattr.c)32
-rwxr-xr-xsysdeps/i386/configure3
-rw-r--r--sysdeps/i386/configure.in3
-rw-r--r--sysdeps/ia64/elf/initfini.c24
-rw-r--r--sysdeps/ia64/fpu/libm-symbols.h4
-rw-r--r--sysdeps/mach/hurd/bits/stat.h7
-rw-r--r--sysdeps/mach/hurd/getpeername.c13
-rw-r--r--sysdeps/mach/hurd/ioctl.c9
-rw-r--r--sysdeps/posix/getaddrinfo.c30
-rw-r--r--sysdeps/posix/gettimeofday.c8
-rw-r--r--sysdeps/posix/system.c6
-rw-r--r--sysdeps/powerpc/powerpc64/Makefile2
-rw-r--r--sysdeps/powerpc/powerpc64/hp-timing.c (renamed from sysdeps/unix/bsd/sun/sunos4/tcflow.c)19
-rw-r--r--sysdeps/powerpc/powerpc64/hp-timing.h136
-rw-r--r--sysdeps/pthread/configure2
-rw-r--r--sysdeps/unix/bsd/init-posix.c4
-rw-r--r--sysdeps/unix/bsd/sun/Dist1
-rw-r--r--sysdeps/unix/bsd/sun/bits/signum.h69
-rw-r--r--sysdeps/unix/bsd/sun/m68k/Dist1
-rw-r--r--sysdeps/unix/bsd/sun/m68k/Makefile3
-rw-r--r--sysdeps/unix/bsd/sun/m68k/bits/sigcontext.h30
-rw-r--r--sysdeps/unix/bsd/sun/m68k/brk.S49
-rw-r--r--sysdeps/unix/bsd/sun/m68k/dl-brk.S1
-rw-r--r--sysdeps/unix/bsd/sun/m68k/sethostid.S44
-rw-r--r--sysdeps/unix/bsd/sun/m68k/sigtramp.c145
-rw-r--r--sysdeps/unix/bsd/sun/m68k/syscall.S28
-rw-r--r--sysdeps/unix/bsd/sun/m68k/sysdep.h62
-rw-r--r--sysdeps/unix/bsd/sun/m68k/vfork.S56
-rw-r--r--sysdeps/unix/bsd/sun/sethostid.c1
-rw-r--r--sysdeps/unix/bsd/sun/sigreturn.S28
-rw-r--r--sysdeps/unix/bsd/sun/sparc/Dist1
-rw-r--r--sysdeps/unix/bsd/sun/sparc/Makefile7
-rw-r--r--sysdeps/unix/bsd/sun/sparc/bits/sigcontext.h34
-rw-r--r--sysdeps/unix/bsd/sun/sparc/sethostid.S46
-rw-r--r--sysdeps/unix/bsd/sun/sparc/sigtramp.c247
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/.cvsignore4
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/Implies2
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/Makefile7
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/bits/fcntl.h142
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/bits/mman.h68
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/bits/resource.h174
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/bits/termios.h212
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/bits/utsname.h24
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/mmap.c42
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/speed.c118
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/sys/ttydefaults.h100
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/syscalls.list6
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/system.c2
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/tcsendbrk.c32
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/wait.c1
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/wait3.c1
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/wait4.c50
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/waitpid.c1
-rw-r--r--sysdeps/unix/bsd/sun/syscalls.list3
-rw-r--r--sysdeps/unix/bsd/ulimit.c5
-rw-r--r--sysdeps/unix/i386/brk.S6
-rw-r--r--sysdeps/unix/sh/sysdep.S4
-rw-r--r--sysdeps/unix/sparc/brk.S6
-rw-r--r--sysdeps/unix/sysv/linux/alpha/fxstatat.c100
-rw-r--r--sysdeps/unix/sysv/linux/device-nrs.h6
-rw-r--r--sysdeps/unix/sysv/linux/fchownat.c73
-rw-r--r--sysdeps/unix/sysv/linux/futimesat.c97
-rw-r--r--sysdeps/unix/sysv/linux/fxstatat.c106
-rw-r--r--sysdeps/unix/sysv/linux/fxstatat64.c135
-rw-r--r--sysdeps/unix/sysv/linux/i386/fchownat.c177
-rw-r--r--sysdeps/unix/sysv/linux/i386/fxstatat.c148
-rw-r--r--sysdeps/unix/sysv/linux/m68k/fchownat.c121
-rw-r--r--sysdeps/unix/sysv/linux/m68k/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/openat.c117
-rw-r--r--sysdeps/unix/sysv/linux/openat64.c4
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/chown.c140
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/fchownat.c205
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c105
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/renameat.c121
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c140
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sh/fchownat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sh/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sh/socket.S8
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c1
-rw-r--r--sysdeps/unix/sysv/linux/tcflow.c32
-rw-r--r--sysdeps/unix/sysv/linux/tcflush.c32
-rw-r--r--sysdeps/unix/sysv/linux/unlinkat.c74
-rw-r--r--sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c78
-rw-r--r--sysdeps/unix/sysv/linux/wordsize-64/fxstatat64.c1
-rw-r--r--time/sys/time.h19
175 files changed, 4394 insertions, 2740 deletions
diff --git a/ChangeLog b/ChangeLog
index c5f57e6648..b3c9124e8e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,296 @@
+2005-11-14 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-open.c [!SHARED]: Remove _dl_tls_static_size definition.
+ * sysdeps/generic/libc-tls.c: Initialize _dl_tls_static_size here.
+
+2005-11-11 Ulrich Drepper <drepper@redhat.com>
+
+ * io/Makefile (routines): Add fstatat, fstatat64, fxstatat, fxstatat64,
+ fchownat, and unlinkat.
+ (static-only-routines): Add fstatat and fstatat64.
+ (tests): Add tst-unlinkat, tst-fstatat, tst-futimesat, tst-renameat,
+ and tst-fchownat.
+ * io/Versions [GLIBC_2.4]: Add fchownat, __fxstatat, __fxstatat64,
+ and unlinkat.
+ * io/fcntl.h: Define AT_FDCWD, AT_SYMLINK_NOFOLLOW, and AT_REMOVEDIR.
+ * io/fstatat.c: New file.
+ * io/fstatat64.c: New file.
+ * io/sys/stat.h: Declare fstatat, fstatat64, __fxstatat, __fxstatat64
+ and define fstatat and fstatat64 inline functions.
+ * libio/stdio.h: Declare renameat.
+ * misc/Makefile (routines): Add futimesat.
+ * misc/Versions [GLIBC_2.4]: Add futimesat.
+ * posix/unistd.h: Declare fchownat and unlinkat.
+ * stdio-common/Makefile (routines): Add renameat.
+ * stdio-common/Versions [GLIBC_2.4]: Add renameat.
+ * sysdeps/generic/fchownat.c: New file.
+ * sysdeps/generic/futimesat.c: New file.
+ * sysdeps/generic/fxstatat.c: New file.
+ * sysdeps/generic/fxstatat64.c: New file.
+ * sysdeps/generic/renameat.c: New file.
+ * sysdeps/generic/unlinkat.c: New file.
+ * sysdeps/unix/sysv/linux/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/futimesat.c: New file.
+ * sysdeps/unix/sysv/linux/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/fxstatat64.c: New file.
+ * sysdeps/unix/sysv/linux/renameat.c: New file.
+ * sysdeps/unix/sysv/linux/unlinkat.c: New file.
+ * sysdeps/unix/sysv/linux/alpha/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/i386/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/i386/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/m68k/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/m68k/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/powerpc/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/s390/s390-32/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/sh/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/sh/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c: New file.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c: New file.
+ * sysdeps/unix/sysv/linux/wordsize-64/fxstatat64.c: New file.
+ * time/sys/time.h: Declare futimesat.
+ * include/fcntl.h: Declare __atfct_seterrno.
+ * sysdeps/unix/sysv/linux/openat.c (__atfct_seterrno): New function.
+ Split out from openat code and called.
+ (do_test): Allow openat to fail with ENOSYS. Handle AT_FDCWD.
+ * sysdeps/generic/openat.c: Handle AT_FDCWD.
+ * sysdeps/generic/openat64.c: Likewise.
+ * io/tst-unlinkat.c: New file.
+ * io/tst-fstatat.c: New file.
+ * io/tst-futimesat.c: New file.
+ * io/tst-renameat.c: New file.
+ * io/tst-fchownat.c: New file.
+ * io/tst-openat.c: Don't fail if openat is not implemented.
+
+ * sysdeps/unix/sysv/linux/powerpc/chown.c: Don't provide backward
+ compatibility code if new kernel is guaranteed.
+
+ * time/sys/time.h: Add a few nonnull attributes.
+
+2005-11-09 Ulrich Drepper <drepper@redhat.com>
+
+ * io/fcntl.h: Declare openat and openat64.
+ * io/Makefile (routines): Add openat and openat64.
+ (tests): Add tst-openat.
+ * io/Versions: Add openat and openat64 for GLIBC_2.4.
+ * sysdeps/generic/openat.c: New file.
+ * sysdeps/generic/openat64.c: New file.
+ * sysdeps/unix/sysv/linux/openat.c: New file.
+ * sysdeps/unix/sysv/linux/openat64.c: New file.
+ * io/tst-openat.c: New file.
+
+ * sysdeps/generic/check_fds.c (check_one_fd): For writable
+ descriptors, use /dev/full.
+ (__libc_check_standard_fds): Reverse modes so that common operations on
+ the descriptors fail.
+ * sysdeps/unix/sysv/linux/device-nrs.h: Add info for /dev/full.
+
+2005-11-07 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * elf/elf.h (R_M32R_REL32): New macro.
+
+2005-11-05 Marcus Brinkmann <marcus@gnu.org>
+
+ * sysdeps/mach/hurd/bits/stat.h (S_IMMAP0): New macro.
+ (S_ISPARE): Unset the S_IMMAP0 flag.
+
+2005-11-07 Roland McGrath <roland@redhat.com>
+
+ * configure.in: Grok --with-cpu=CPU option. If given, search for
+ sysdeps/.../machine/CPU subdirs, and give error if none are found.
+ * configure: Regenerated.
+ * config.make.in (with-cpu): New substituted variable.
+ * Makeconfig (+cflags): Add -mcpu=$(with-cpu) if set.
+
+ * malloc/malloc.c (munmap_chunk): Suppress warnings from last change.
+
+ * sysdeps/unix/bsd/sun: Directory and all subdirectories removed,
+ saved in ports repository.
+ * sysdeps/unix/sysv/linux/tcflush.c: Rewritten.
+ * sysdeps/unix/sysv/linux/tcflow.c: Rewritten.
+
+2005-11-06 Ulrich Drepper <drepper@redhat.com>
+
+ * malloc/malloc.c (munmap_chunk): Add sanity checks.
+
+ * sysdeps/pthread/configure: Fix comment.
+
+2005-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * configure.in: Remove gnu_as definition and everything using it.
+ * config.make.in: Remove gnu-as.
+ * config.h.in: Remove HAVE_GNU_AS.
+
+ * configure.in: Remove gnu_ld definition and everything using it.
+ * config.h.in: Remove HAVE_GNU_LD.
+ * config.make.in: Remove gnu-ld.
+ * csu/Makefile: Remove use of gnu-ld.
+ * csu/munch.awk: Removed.
+ * csu/munch-tmpl.c: Removed.
+ * include/libc-symbols.h: Remove use of HAVE_GNU_LD.
+ * posix/execl.c: Likewise.
+ * posix/execv.c: Likewise.
+ * stdio-common/psignal.c: Likewise.
+ * stdlib/exit.c: Likewise.
+ * string/strsignal.c: Likewise.
+ * string/tester.c: Likewise.
+ * sysdeps/generic/errlist.c: Likewise.
+ * sysdeps/generic/getenv.c: Likewise.
+ * sysdeps/generic/getgroups.c: Likewise.
+ * sysdeps/generic/init-posix.c: Likewise.
+ * sysdeps/posix/gettimeofday.c: Likewise.
+ * sysdeps/posix/system.c: Likewise.
+ * sysdeps/unix/bsd/init-posix.c: Likewise.
+ * sysdeps/unix/bsd/ulimit.c: Likewise.
+ * sysdeps/unix/bsd/sun/m68k/brk.S: Likewise.
+ * sysdeps/unix/bsd/sun/m68k/sethostid.S: Likewise.
+ * sysdeps/unix/bsd/sun/sparc/sethostid.S: Likewise.
+ * sysdeps/unix/i386/brk.S: Likewise.
+ * sysdeps/unix/sparc/brk.S: Likewise.
+
+ * configure.in: Remove test for support for subtracting local labels.
+ * config.h.in: Remove HAVE_SUBTRACT_LOCAL_LABELS.
+ * stdio-common/vfprintf.c: Remove test of
+ HAVE_SUBTRACT_LOCAL_LABELS.
+
+ * configure.in: If init_array/fini_array support is not available,
+ bail out.
+ * config.h.in: Remove trace of optional init_array/fini_array support.
+ * config.make.in: Likewise.
+ * csu/elf-init.c: Likewise.
+ * dlfcn/dlfcn.c: Likewise.
+ * elf/soinit.c: Likewise.
+ * sysdeps/ia64/elf/initfinit.c: Likewise.
+
+2005-11-04 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/i386/configure.in (libc_mtune_example): Variable removed.
+ * sysdeps/i386/configure: Regenerated.
+
+ [BZ #1089]
+ * configure.in: Change order of add-on sysdeps directories,
+ so they are interleaved with main sysdeps directories.
+ * configure: Regenerated.
+
+2005-11-03 Roland McGrath <roland@redhat.com>
+
+ * NEWS: Synch with 2.3 branch updates.
+
+2005-11-03 Ulrich Drepper <drepper@redhat.com>
+
+ * sunrpc/svc.c (svc_getreq_poll): Fix inefficient loop test.
+
+2005-11-03 Roland McGrath <roland@redhat.com>
+
+ [BZ #1548]
+ * sunrpc/svc.c (svc_getreqset): Use ffsl instead of ffs on fd_mask,
+ make sure constant is long.
+ From Jay Lan <jlan@engr.sgi.com>.
+
+2005-11-03 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #1774]
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Don't use simple
+ gethostbyname2 lookup if AI_V4MAPPED|AI_ALL is set.
+
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Avoid alloca when possible
+ while looking for scope delimiter.
+ Some pretty printing.
+
+2005-10-31 Steven Munroe <sjmunroe@us.ibm.com>
+
+ * sysdeps/powerpc/powerpc64/Makefile
+ (sysdep_routines, elide-routines.os): Add hp-timing.
+ * sysdeps/powerpc/powerpc64/hp-timing.c: New file.
+ * sysdeps/powerpc/powerpc64/hp-timing.h: New file.
+ * sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c: New file.
+
+2005-10-31 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/res_init.c (__res_iclose): New function. Broken out of
+ res_nclose. Take addition parameter which determines whether
+ addresses should be freed.
+ (res_nclose): Call __res_iclose.
+ (res_thread_freeres): Likewise.
+ * resolv/res_data.c (res_close): Call __res_iclose.
+ * resolv/res_libc.c (res_init): No need to separately free the
+ addresses.
+ (__res_maybe_init): Likewise.
+ * resolv/res_send.c: Use __res_iclose instead of res_nclose.
+ * resolv/Versions [GLIBC_PRIVATE]: Add __res_iclose.
+ * include/resolv.h: Declare __res_iclose.
+ Add libc_hidden_proto for __res_iclose.
+ * hesiod/hesiod.c (__hesiod_res_set): No need to free name server
+ addresses here again.
+
+ [BZ #1579]
+ * debug/execinfo.h: Change backtrace_symbols_fd comment.
+
+2005-10-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * sysdeps/ia64/fpu/libm-symbols.h (WEAK_LIBM_ENTRY): Add "__"
+ prefix to LOCAL_LIBM_ENTRY.
+ (WEAK_LIBM_END): Add "__" prefix to LOCAL_LIBM_END.
+
+2005-10-26 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-conflict.c (_dl_resolve_conflicts): Use _dl_debug_printf
+ instead of _dl_printf to print conflict processing debug message.
+ Reported by John Reiser <jreiser@BitWagon.com>.
+
+2005-10-30 Ulrich Drepper <drepper@redhat.com>
+
+ * misc/hsearch_r.c (hsearch_r): Remove duplicate test.
+ Patch by Chris Caputo <ccaputo@alt.net>.
+
+2005-10-28 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sh/sysdep.S: Remove unnecessary weak_alias.
+ * sysdeps/unix/sysv/linux/sh/socket.S: Honor NO_WEAK_ALIAS.
+
+2005-10-28 Thorsten Kukuk <kukuk@suse.de>
+
+ * nis/nss_nis/nis-publickey.c (_nss_nis_getpublickey): Fix off
+ by one error.
+
+2005-10-24 Roland McGrath <roland@redhat.com>
+
+ [BZ #1534]
+ * include/string.h: Use libc_hidden_proto for strnlen,
+ not libc_hidden_builtin_proto.
+
+2005-10-23 Ulrich Drepper <drepper@redhat.com>
+
+ * rt/mqueue.h: Cleanups.
+
+2005-10-22 Roland McGrath <roland@redhat.com>
+
+ [BZ #1254]
+ * sysdeps/mach/hurd/getpeername.c (__getpeername): Fix last change.
+ From Samuel Thibault <samuel.thibault@ens-lyon.org>.
+
+2005-10-17 Thomas Schwinge <tschwinge@gnu.org>
+
+ [BZ #1252]
+ * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): Don't use ?: as lvalue.
+ * sysdeps/mach/hurd/ioctl.c (__ioctl): Likewise.
+
+2005-10-20 Ulrich Drepper <drepper@redhat.com>
+
+ * iconvdata/ibm1364.h (__ucs4_to_ibm1364sb): Fix one mapping.
+ * iconvdata/ibm1388.h (__ucs4_to_ibm1388sb): Likewise.
+ * iconvdata/testdata/IBM1364: Add missing valid input.
+ * iconvdata/testdata/IBM1388: Likewise.
+ * iconvdata/testdata/IBM1364..UTF8: Adjust appropriately.
+ * iconvdata/testdata/IBM1388..UTF8: Likewise.
+ Patch by Masahide Washizawa <washi@jp.ibm.com>.
+
2005-08-23 GOTO Masanori <gotom@debian.or.jp>
+ [BZ #1498]
* sysdeps/alpha/remqu.S: Return the correct result when the same
dividend and divisor are provided, and they're negative numbers.
* sysdeps/alpha/divqu.S: Likewise.
diff --git a/Makeconfig b/Makeconfig
index b280aa5adb..97f74f7e1f 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -611,7 +611,7 @@ ifeq "$(strip $(+cflags))" ""
+cflags := $(default_cflags)
endif # $(+cflags) == ""
-+cflags := $(+cflags) $(+gccwarn)
++cflags := $(+cflags) $(addprefix -mcpu=,$(with-cpu)) $(+gccwarn)
+gcc-nowarn := -w
# Don't duplicate options if we inherited variables from the parent.
diff --git a/NEWS b/NEWS
index 10c68ca9e5..86c7b5e833 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes. 2005-4-5
+GNU C Library NEWS -- history of user-visible changes. 2005-11-11
Copyright (C) 1992-2002,2003,2004,2005 Free Software Foundation, Inc.
See the end for copying conditions.
@@ -12,6 +12,13 @@ Version 2.4
* New iconv converters for IBM1025, IBM1122, IBM1137, IBM1153,
IBM1154, IBM1155, IBM1156, IBM1157, and IBM1158 contributed by Jiro Sekiba.
+ More converters for IBM803, IBM901, IBM902, IBM921, IBM1008, IBM1097,
+ IBM1112, IBM1123, IBM1130, IBM1140, IBM1141, IBM1142, IBM1143, IBM1144,
+ IBM1145, IBM1146, IBM1147, IBM1148, IBM1149, IBM1166, IBM1167, IBM4517,
+ IBM4899, IBM4909, IBM4971, IBM5347, IBM9030, IBM9066, IBM9448, IBM12712,
+ IBM16804, IBM1364, IBM1371, IBM1388, IBM1390, and IBM1399 contributed
+ by Masahide Washizawa.
+
* It is now possible to install audit libraries for the dynamic linker using
LD_AUDIT. Implemented by Ulrich Drepper.
@@ -19,6 +26,26 @@ Version 2.4
longer supported. The new NPTL implementation requires Linux 2.6 kernels.
For a libc and libpthread that works well on Linux 2.4 kernels, we
recommend using the stable 2.3 branch.
+
+* New interfaces: fdopendir, openat, fstatat, fchownat, futimesat, renameat,
+ unlinkat.
+
+Version 2.3.6
+
+* The following bugs are resolved with this release:
+
+ 38, 253, 549, 622, 653, 721, 758, 851, 877, 915, 934, 955, 961,
+ 1016, 1037, 1076, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
+ 1087, 1088, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098,
+ 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109,
+ 1110, 1111, 1112, 1113, 1125, 1137, 1138, 1249, 1250, 1251, 1252,
+ 1253, 1254, 1350, 1358, 1394, 1438, 1498, 1534
+
+ Visit <http://sources.redhat.com/bugzilla/> for the details of each bug.
+
+* As of this release, GCC 4 can be used to compile the C Library.
+
+* Timezone data updated to 2005m version.
Version 2.3.5
@@ -1510,7 +1537,8 @@ Version 1.04
----------------------------------------------------------------------
Copyright information:
-Copyright (C) 1992-1999,2000,2001,2002 Free Software Foundation, Inc.
+Copyright (C) 1992-1999,2000,2001,2002,2003,2004,2005
+ Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
diff --git a/config.h.in b/config.h.in
index 552523a83e..147addddef 100644
--- a/config.h.in
+++ b/config.h.in
@@ -8,11 +8,6 @@
# error "glibc must not be compiled with -ffast-math"
#endif
-/* Define if using GNU ld, with support for weak symbols in a.out,
- and for symbol set and warning messages extensions in a.out and ELF.
- This implies HAVE_WEAK_SYMBOLS; set by --with-gnu-ld. */
-#undef HAVE_GNU_LD
-
/* Define if using ELF, which supports weak symbols.
This implies HAVE_ASM_WEAK_DIRECTIVE and NO_UNDERSCORES; set by
--with-elf. */
@@ -50,9 +45,6 @@
/* Define if __attribute__((section("foo"))) puts quotes around foo. */
#undef HAVE_SECTION_QUOTES
-/* Define if using the GNU assembler, gas. */
-#undef HAVE_GNU_AS
-
/* Define if the assembler supports the `.set' directive. */
#undef HAVE_ASM_SET_DIRECTIVE
@@ -158,10 +150,6 @@
/* Define if binutils support TLS handling. */
#undef HAVE_TLS_SUPPORT
-/* Define if the linker supports .preinit_array/.init_array/.fini_array
- sections. */
-#undef HAVE_INITFINI_ARRAY
-
/* Define if the compiler's exception support is based on libunwind. */
#undef HAVE_CC_WITH_LIBUNWIND
@@ -186,10 +174,6 @@
/* Override abi-tags ABI version if necessary. */
#undef __ABI_TAG_VERSION
-/* An extension in gcc 2.96 and up allows the subtraction of two
- local labels. */
-#undef HAVE_SUBTRACT_LOCAL_LABELS
-
/* bash 2.0 introduced the _XXX_GNU_nonoption_argv_flags_ variable to help
getopt determine whether a parameter is a flag or not. This features
was disabled later since it caused trouble. We are by default therefore
diff --git a/config.make.in b/config.make.in
index 3687507a17..748ea96b2e 100644
--- a/config.make.in
+++ b/config.make.in
@@ -31,6 +31,7 @@ base-machine = @base_machine@
config-vendor = @host_vendor@
config-os = @host_os@
config-sysdirs = @sysnames@
+with-cpu = @submachine@
defines = @DEFINES@
sysincludes = @SYSINCLUDES@
@@ -53,7 +54,6 @@ with-fp = @with_fp@
with-cvs = @with_cvs@
old-glibc-headers = @old_glibc_headers@
unwind-find-fde = @libc_cv_gcc_unwind_find_fde@
-have-initfini-array = @libc_cv_initfinit_array@
have-cpp-asm-debuginfo = @libc_cv_cpp_asm_debuginfo@
enable-check-abi = @enable_check_abi@
have-forced-unwind = @libc_cv_forced_unwind@
@@ -80,8 +80,6 @@ have-ksh = @libc_cv_have_ksh@
sizeof-long-double = @sizeof_long_double@
# Configuration options.
-gnu-as = @gnu_as@
-gnu-ld = @gnu_ld@
build-static = @static@
build-shared = @shared@
build-pic-default= @pic_default@
diff --git a/configure b/configure
index 00733b2486..e8e8b363f1 100755
--- a/configure
+++ b/configure
@@ -313,7 +313,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine submachine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -906,6 +906,7 @@ Optional Packages:
default]
--with-tls enable support for TLS
--without-__thread do not use TLS features even when supporting them
+ --with-cpu=CPU select code for CPU variant
Some influential environment variables:
CC C compiler command
@@ -1793,11 +1794,6 @@ config_os="`echo $config_os | sed 's/^unknown-//'`"
# Some configurations imply other options.
case "$host_os" in
-gnu* | linux* | bsd4.4* | netbsd* | freebsd*)
- # These systems always use GNU tools.
- gnu_ld=yes gnu_as=yes ;;
-esac
-case "$host_os" in
# i586-linuxaout is mangled into i586-pc-linux-gnuaout
linux*ecoff* | linux*aout* | gnu*aout* | gnu*ecoff*)
;;
@@ -1832,6 +1828,21 @@ case "$machine-$host_os" in
;;
esac
+submachine=
+
+# Check whether --with-cpu or --without-cpu was given.
+if test "${with_cpu+set}" = set; then
+ withval="$with_cpu"
+ case "$withval" in
+ yes|'') { { echo "$as_me:$LINENO: error: --with-cpu requires an argument" >&5
+echo "$as_me: error: --with-cpu requires an argument" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ no) ;;
+ *) submachine="$withval" ;;
+ esac
+
+fi;
+
# An add-on can set this when it the tuple to disable the sanity check below.
libc_config_ok=no
@@ -2066,7 +2077,7 @@ done
# For sparc/sparc32, try sparc/sparc32 and then sparc.
mach=
-tail=$machine
+tail=$machine${submachine:+/$submachine}
while m=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$m"; do
set $m
# Prepend the machine's FPU directory unless --without-fp.
@@ -2083,23 +2094,26 @@ done
# Find what sysdep directories exist.
sysnames=
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-for d in $add_ons_pfx ''; do
- for b in $base ''; do
- for m0 in $mach ''; do
- for v in /$vendor ''; do
- test "$v" = / && continue
- for o in /$ostry ''; do
- test "$o" = / && continue
- for m in $mach ''; do
+for b in $base ''; do
+ for m0 in $mach ''; do
+ for v in /$vendor ''; do
+ test "$v" = / && continue
+ for o in /$ostry ''; do
+ test "$o" = / && continue
+ for m in $mach ''; do
+ for d in $add_ons_pfx ''; do
for a in $add_ons_sfx ''; do
- if test "$m0$b$v$o$m"; then
- try="${d}sysdeps$m0$b$v$o$m$a"
+ if test "$m0$m0sub$b$v$o$m$msub"; then
+ try="${d}sysdeps$m0$m0sub$b$v$o$m$msub$a"
test -n "$enable_debug_configure" &&
echo "$0 DEBUG: try $try" >&2
if test -d $srcdir/$try; then
sysnames="$sysnames $try"
{ test -n "$o" || test -n "$b"; } && os_used=t
{ test -n "$m" || test -n "$m0"; } && machine_used=t
+ case x${m0:-$m} in
+ x*/$submachine) submachine_used=t ;;
+ esac
fi
fi
done
@@ -2108,14 +2122,18 @@ for d in $add_ons_pfx ''; do
done
done
done
- if test -n "$d"; then
- try="${d}sysdeps/generic"
- test -n "$enable_debug_configure" &&
- echo "$0 DEBUG: try $try" >&2
- if test -d $srcdir/$try; then
- sysnames="$sysnames $try"
+done
+for d in $add_ons_pfx ''; do
+ for a in $add_ons_sfx ''; do
+ if test -n "$d" && test "$d" != "$a"; then
+ try="${d}sysdeps/generic${a}"
+ test -n "$enable_debug_configure" &&
+ echo "$0 DEBUG: try $try" >&2
+ if test -d $srcdir/$try; then
+ sysnames="$sysnames $try"
+ fi
fi
- fi
+ done
done
IFS="$ac_save_ifs"
@@ -2129,6 +2147,12 @@ if test -z "$machine_used" && test "$machine" != none; then
echo "$as_me: error: The $machine is not supported." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "$submachine_used" && test -n "$submachine"; then
+ { { echo "$as_me:$LINENO: error: The $submachine subspecies of $host_cpu is not supported." >&5
+echo "$as_me: error: The $submachine subspecies of $host_cpu is not supported." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
# We have now validated the configuration.
@@ -5353,7 +5377,7 @@ _ACEOF
fi
- if test $libc_cv_visibility_attribute = yes -a $gnu_ld = yes; then
+ if test $libc_cv_visibility_attribute = yes; then
echo "$as_me:$LINENO: checking whether to put _rtld_local into .sdata section" >&5
echo $ECHO_N "checking whether to put _rtld_local into .sdata section... $ECHO_C" >&6
if test "${libc_cv_have_sdata_section+set}" = set; then
@@ -5380,7 +5404,7 @@ _ACEOF
echo "$as_me:$LINENO: checking for .preinit_array/.init_array/.fini_array support" >&5
echo $ECHO_N "checking for .preinit_array/.init_array/.fini_array support... $ECHO_C" >&6
-if test "${libc_cv_initfinit_array+set}" = set; then
+if test "${libc_cv_initfini_array+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat > conftest.c <<EOF
@@ -5398,23 +5422,21 @@ EOF
(exit $ac_status); }; }
then
if readelf -S conftest | fgrep INIT_ARRAY > /dev/null; then
- libc_cv_initfinit_array=yes
+ libc_cv_initfini_array=yes
else
- libc_cv_initfinit_array=no
+ libc_cv_initfini_array=no
fi
else
- libc_cv_initfinit_array=no
+ libc_cv_initfini_array=no
fi
rm -f conftest*
fi
-echo "$as_me:$LINENO: result: $libc_cv_initfinit_array" >&5
-echo "${ECHO_T}$libc_cv_initfinit_array" >&6
-
- if test $libc_cv_initfinit_array = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_INITFINI_ARRAY 1
-_ACEOF
-
+echo "$as_me:$LINENO: result: $libc_cv_initfini_array" >&5
+echo "${ECHO_T}$libc_cv_initfini_array" >&6
+ if test $libc_cv_initfini_array != yes; then
+ { { echo "$as_me:$LINENO: error: Need linker with .init_array/.fini_array support." >&5
+echo "$as_me: error: Need linker with .init_array/.fini_array support." >&2;}
+ { (exit 1); exit 1; }; }
fi
echo "$as_me:$LINENO: checking for libunwind-support in compiler" >&5
@@ -5890,7 +5912,7 @@ _ACEOF
fi
fi
-if test $elf = yes -a $gnu_ld = yes; then
+if test $elf = yes; then
echo "$as_me:$LINENO: checking whether cc puts quotes around section names" >&5
echo $ECHO_N "checking whether cc puts quotes around section names... $ECHO_C" >&6
if test "${libc_cv_have_section_quotes+set}" = set; then
@@ -6457,46 +6479,6 @@ _ACEOF
fi
-echo "$as_me:$LINENO: checking for local label subtraction" >&5
-echo $ECHO_N "checking for local label subtraction... $ECHO_C" >&6
-if test "${libc_cv_gcc_subtract_local_labels+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat > conftest.c <<EOF
-#line $LINENO "configure"
-int foo (int a)
-{
- static const int ar[] = { &&l1 - &&l1, &&l2 - &&l1 };
- void *p = &&l1 + ar[a];
- goto *p;
- l1:
- return 1;
- l2:
- return 2;
-}
-EOF
-if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles
- -o conftest conftest.c -lgcc >&5'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- libc_cv_gcc_subtract_local_labels=yes
-else
- libc_cv_gcc_subtract_local_labels=no
-fi
-rm -f conftest*
-fi
-echo "$as_me:$LINENO: result: $libc_cv_gcc_subtract_local_labels" >&5
-echo "${ECHO_T}$libc_cv_gcc_subtract_local_labels" >&6
-if test "$libc_cv_gcc_subtract_local_labels" = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_SUBTRACT_LOCAL_LABELS 1
-_ACEOF
-
-fi
-
if test "x$use__thread" != xno; then
echo "$as_me:$LINENO: checking for __thread" >&5
echo $ECHO_N "checking for __thread... $ECHO_C" >&6
@@ -7673,18 +7655,6 @@ fi
-if test $gnu_ld = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_GNU_LD 1
-_ACEOF
-
-fi
-if test $gnu_as = yes; then
- cat >>confdefs.h <<\_ACEOF
-#define HAVE_GNU_AS 1
-_ACEOF
-
-fi
if test $elf = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_ELF 1
@@ -7701,13 +7671,7 @@ fi
if test $shared = default; then
- if test $gnu_ld = yes; then
- shared=$elf
- else
- # For now we do not assume shared libs are available. In future more
- # tests might become available.
- shared=no
- fi
+ shared=$elf
fi
if test x"$libc_cv_idn" = xyes; then
@@ -8405,6 +8369,7 @@ s,@host_os@,$host_os,;t t
s,@subdirs@,$subdirs,;t t
s,@add_ons@,$add_ons,;t t
s,@base_machine@,$base_machine,;t t
+s,@submachine@,$submachine,;t t
s,@sysnames@,$sysnames,;t t
s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
@@ -8447,7 +8412,6 @@ s,@INSTALL_INFO@,$INSTALL_INFO,;t t
s,@BISON@,$BISON,;t t
s,@VERSIONING@,$VERSIONING,;t t
s,@libc_cv_asm_protected_directive@,$libc_cv_asm_protected_directive,;t t
-s,@libc_cv_initfinit_array@,$libc_cv_initfinit_array,;t t
s,@libc_cv_cc_with_libunwind@,$libc_cv_cc_with_libunwind,;t t
s,@libc_cv_z_nodelete@,$libc_cv_z_nodelete,;t t
s,@libc_cv_z_nodlopen@,$libc_cv_z_nodlopen,;t t
@@ -8482,8 +8446,6 @@ s,@libc_cv_rootsbindir@,$libc_cv_rootsbindir,;t t
s,@libc_cv_forced_unwind@,$libc_cv_forced_unwind,;t t
s,@use_ldconfig@,$use_ldconfig,;t t
s,@ldd_rewrite_script@,$ldd_rewrite_script,;t t
-s,@gnu_ld@,$gnu_ld,;t t
-s,@gnu_as@,$gnu_as,;t t
s,@elf@,$elf,;t t
s,@xcoff@,$xcoff,;t t
s,@static@,$static,;t t
diff --git a/configure.in b/configure.in
index f4556a1f1d..ba7ca30b2f 100644
--- a/configure.in
+++ b/configure.in
@@ -298,11 +298,6 @@ config_os="`echo $config_os | sed 's/^unknown-//'`"
# Some configurations imply other options.
case "$host_os" in
-gnu* | linux* | bsd4.4* | netbsd* | freebsd*)
- # These systems always use GNU tools.
- gnu_ld=yes gnu_as=yes ;;
-esac
-case "$host_os" in
# i586-linuxaout is mangled into i586-pc-linux-gnuaout
linux*ecoff* | linux*aout* | gnu*aout* | gnu*ecoff*)
;;
@@ -337,6 +332,17 @@ case "$machine-$host_os" in
;;
esac
+submachine=
+AC_ARG_WITH([cpu],
+ AS_HELP_STRING([--with-cpu=CPU], [select code for CPU variant]),
+ [dnl
+ case "$withval" in
+ yes|'') AC_MSG_ERROR([--with-cpu requires an argument]) ;;
+ no) ;;
+ *) submachine="$withval" ;;
+ esac
+])
+
# An add-on can set this when it the tuple to disable the sanity check below.
libc_config_ok=no
@@ -556,7 +562,7 @@ done
# For sparc/sparc32, try sparc/sparc32 and then sparc.
mach=
-tail=$machine
+tail=$machine${submachine:+/$submachine}
while m=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$m"; do
set $m
# Prepend the machine's FPU directory unless --without-fp.
@@ -575,23 +581,26 @@ changequote([,])dnl
# Find what sysdep directories exist.
sysnames=
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-for d in $add_ons_pfx ''; do
- for b in $base ''; do
- for m0 in $mach ''; do
- for v in /$vendor ''; do
- test "$v" = / && continue
- for o in /$ostry ''; do
- test "$o" = / && continue
- for m in $mach ''; do
+for b in $base ''; do
+ for m0 in $mach ''; do
+ for v in /$vendor ''; do
+ test "$v" = / && continue
+ for o in /$ostry ''; do
+ test "$o" = / && continue
+ for m in $mach ''; do
+ for d in $add_ons_pfx ''; do
for a in $add_ons_sfx ''; do
- if test "$m0$b$v$o$m"; then
- try="${d}sysdeps$m0$b$v$o$m$a"
+ if test "$m0$m0sub$b$v$o$m$msub"; then
+ try="${d}sysdeps$m0$m0sub$b$v$o$m$msub$a"
test -n "$enable_debug_configure" &&
echo "$0 [DEBUG]: try $try" >&2
if test -d $srcdir/$try; then
sysnames="$sysnames $try"
{ test -n "$o" || test -n "$b"; } && os_used=t
{ test -n "$m" || test -n "$m0"; } && machine_used=t
+ case x${m0:-$m} in
+ x*/$submachine) submachine_used=t ;;
+ esac
fi
fi
done
@@ -600,14 +609,18 @@ for d in $add_ons_pfx ''; do
done
done
done
- if test -n "$d"; then
- try="${d}sysdeps/generic"
- test -n "$enable_debug_configure" &&
- echo "$0 DEBUG: try $try" >&2
- if test -d $srcdir/$try; then
- sysnames="$sysnames $try"
+done
+for d in $add_ons_pfx ''; do
+ for a in $add_ons_sfx ''; do
+ if test -n "$d" && test "$d" != "$a"; then
+ try="${d}sysdeps/generic${a}"
+ test -n "$enable_debug_configure" &&
+ echo "$0 DEBUG: try $try" >&2
+ if test -d $srcdir/$try; then
+ sysnames="$sysnames $try"
+ fi
fi
- fi
+ done
done
IFS="$ac_save_ifs"
@@ -617,6 +630,10 @@ fi
if test -z "$machine_used" && test "$machine" != none; then
AC_MSG_ERROR(The $machine is not supported.)
fi
+if test -z "$submachine_used" && test -n "$submachine"; then
+ AC_MSG_ERROR(The $submachine subspecies of $host_cpu is not supported.)
+fi
+AC_SUBST(submachine)
# We have now validated the configuration.
@@ -1233,7 +1250,7 @@ EOF
AC_DEFINE(HAVE_BROKEN_ALIAS_ATTRIBUTE)
fi
- if test $libc_cv_visibility_attribute = yes -a $gnu_ld = yes; then
+ if test $libc_cv_visibility_attribute = yes; then
AC_CACHE_CHECK(whether to put _rtld_local into .sdata section,
libc_cv_have_sdata_section,
[echo "int i;" > conftest.c
@@ -1250,7 +1267,7 @@ EOF
fi
AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support,
- libc_cv_initfinit_array, [dnl
+ libc_cv_initfini_array, [dnl
cat > conftest.c <<EOF
int _start (void) { return 0; }
int __start (void) { return 0; }
@@ -1261,17 +1278,16 @@ EOF
-static -nostartfiles -nostdlib 1>&AS_MESSAGE_LOG_FD])
then
if readelf -S conftest | fgrep INIT_ARRAY > /dev/null; then
- libc_cv_initfinit_array=yes
+ libc_cv_initfini_array=yes
else
- libc_cv_initfinit_array=no
+ libc_cv_initfini_array=no
fi
else
- libc_cv_initfinit_array=no
+ libc_cv_initfini_array=no
fi
rm -f conftest*])
- AC_SUBST(libc_cv_initfinit_array)
- if test $libc_cv_initfinit_array = yes; then
- AC_DEFINE(HAVE_INITFINI_ARRAY)
+ if test $libc_cv_initfini_array != yes; then
+ AC_MSG_ERROR([Need linker with .init_array/.fini_array support.])
fi
AC_CACHE_CHECK(for libunwind-support in compiler,
@@ -1536,7 +1552,7 @@ if test $elf != yes; then
fi
fi
-if test $elf = yes -a $gnu_ld = yes; then
+if test $elf = yes; then
AC_CACHE_CHECK(whether cc puts quotes around section names,
libc_cv_have_section_quotes,
[cat > conftest.c <<EOF
@@ -1849,35 +1865,6 @@ if test "$libc_cv_gcc_builtin_redirection" = yes ; then
AC_DEFINE(HAVE_BUILTIN_REDIRECTION)
fi
-dnl Check whether the compiler supports subtraction of local labels.
-AC_CACHE_CHECK(for local label subtraction, libc_cv_gcc_subtract_local_labels,
-[cat > conftest.c <<EOF
-changequote(,)dnl
-#line $LINENO "configure"
-int foo (int a)
-{
- static const int ar[] = { &&l1 - &&l1, &&l2 - &&l1 };
- void *p = &&l1 + ar[a];
- goto *p;
- l1:
- return 1;
- l2:
- return 2;
-}
-changequote([,])dnl
-EOF
-dnl No \ in command here because it ends up inside ''.
-if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles
- -o conftest conftest.c -lgcc >&AS_MESSAGE_LOG_FD]); then
- libc_cv_gcc_subtract_local_labels=yes
-else
- libc_cv_gcc_subtract_local_labels=no
-fi
-rm -f conftest*])
-if test "$libc_cv_gcc_subtract_local_labels" = yes; then
- AC_DEFINE(HAVE_SUBTRACT_LOCAL_LABELS)
-fi
-
dnl Check whether the compiler supports the __thread keyword.
if test "x$use__thread" != xno; then
AC_CACHE_CHECK([for __thread], libc_cv_gcc___thread,
@@ -2103,13 +2090,7 @@ AC_SUBST(libc_cv_forced_unwind)
AC_SUBST(use_ldconfig)
AC_SUBST(ldd_rewrite_script)
-AC_SUBST(gnu_ld) AC_SUBST(gnu_as) AC_SUBST(elf) AC_SUBST(xcoff)
-if test $gnu_ld = yes; then
- AC_DEFINE(HAVE_GNU_LD)
-fi
-if test $gnu_as = yes; then
- AC_DEFINE(HAVE_GNU_AS)
-fi
+AC_SUBST(elf) AC_SUBST(xcoff)
if test $elf = yes; then
AC_DEFINE(HAVE_ELF)
fi
@@ -2120,13 +2101,7 @@ fi
AC_SUBST(static)
AC_SUBST(shared)
if test $shared = default; then
- if test $gnu_ld = yes; then
- shared=$elf
- else
- # For now we do not assume shared libs are available. In future more
- # tests might become available.
- shared=no
- fi
+ shared=$elf
fi
if test x"$libc_cv_idn" = xyes; then
diff --git a/csu/Makefile b/csu/Makefile
index bd82641d41..550dc2983c 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -39,8 +39,8 @@ omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \
b$(start-installed-name) $(csu-dummies) \
S$(start-installed-name))
install-lib = $(start-installed-name) g$(start-installed-name) $(csu-dummies)
-distribute = initfini.c gmon-start.c start.c defs.awk munch.awk \
- abi-note.S init.c munch-tmpl.c not-cancel.h
+distribute = initfini.c gmon-start.c start.c defs.awk \
+ abi-note.S init.c c not-cancel.h
generated = version-info.h
before-compile = $(objpfx)version-info.h
@@ -75,19 +75,6 @@ before-compile += $(objpfx)abi-tag.h
generated += abi-tag.h
endif
-ifneq (yes,$(gnu-ld))
-libc-init = munch-init
-$(objpfx)munch-init.c: munch.awk munch-tmpl.c $(+subdir_inits)
- $(AWK) -f $< subdirs='$(+init_subdirs)' $(word 2,$^) > $@-t
- mv -f $@-t $@
-generated += munch-init.c
-
-# All initialization source files.
-+subdir_inits := $(wildcard $(foreach dir,$(subdirs),$(dir)/init-$(dir).c))
-# All subdirectories containing initialization source files.
-+init_subdirs := $(patsubst %/,%,$(dir $(+subdir_inits)))
-endif
-
ifeq ($(have-initfini),yes)
CPPFLAGS += -DHAVE_INITFINI
diff --git a/csu/elf-init.c b/csu/elf-init.c
index 12ae15747c..0ec460b67b 100644
--- a/csu/elf-init.c
+++ b/csu/elf-init.c
@@ -36,7 +36,7 @@
#include <stddef.h>
-#ifdef HAVE_INITFINI_ARRAY
+
/* These magic symbols are provided by the linker. */
extern void (*__preinit_array_start []) (int, char **, char **)
attribute_hidden;
@@ -81,11 +81,10 @@ extern void _fini (void);
void
__libc_csu_init (int argc, char **argv, char **envp)
{
-#ifdef HAVE_INITFINI_ARRAY
/* For dynamically linked executables the preinit array is executed by
the dynamic linker (before initializing any shared object. */
-# ifndef LIBC_NONSHARED
+#ifndef LIBC_NONSHARED
/* For static executables, preinit happens rights before init. */
{
const size_t size = __preinit_array_end - __preinit_array_start;
@@ -93,19 +92,13 @@ __libc_csu_init (int argc, char **argv, char **envp)
for (i = 0; i < size; i++)
(*__preinit_array_start [i]) (argc, argv, envp);
}
-# endif
#endif
_init ();
-#ifdef HAVE_INITFINI_ARRAY
- {
- const size_t size = __init_array_end - __init_array_start;
- size_t i;
- for (i = 0; i < size; i++)
+ const size_t size = __init_array_end - __init_array_start;
+ for (size_t i = 0; i < size; i++)
(*__init_array_start [i]) (argc, argv, envp);
- }
-#endif
}
/* This function should not be used anymore. We run the executable's
@@ -115,11 +108,9 @@ void
__libc_csu_fini (void)
{
#ifndef LIBC_NONSHARED
-# ifdef HAVE_INITFINI_ARRAY
size_t i = __fini_array_end - __fini_array_start;
while (i-- > 0)
(*__fini_array_start [i]) ();
-# endif
_fini ();
#endif
diff --git a/csu/munch-tmpl.c b/csu/munch-tmpl.c
deleted file mode 100644
index f807cf9a3f..0000000000
--- a/csu/munch-tmpl.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 1991, 1995, 1997, 2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stdlib.h>
-
-
-EXTERNS
-
-void
-__libc_init (int argc, char **argv, char **envp)
-{
- CALLS
-
-#ifdef HAVE_INITFINI
- {
- /* These functions are defined in crti.o to run the .init and .fini
- sections, which are used for initializers and finalizers. */
- extern void _init (void), _fini (void);
- atexit (&_fini); /* Arrange for _fini to run at exit. */
- _init ();
- }
-#endif
-}
diff --git a/csu/munch.awk b/csu/munch.awk
deleted file mode 100644
index 9ebcff8ecf..0000000000
--- a/csu/munch.awk
+++ /dev/null
@@ -1,11 +0,0 @@
-BEGIN { special = 0 }
-
-/EXTERNS/ { ndirs = split(subdirs, dirs)
- for (i = 1; i <= ndirs; ++i)
- printf "extern void __init_%s (int argc, char **argv, char **envp);\n", dirs[i]
- special = 1 }
-/CALLS/ { ndirs = split(subdirs, dirs)
- for (i = 1; i <= ndirs; ++i) printf " __init_%s (argc, argv, envp);\n", dirs[i]
- special = 1 }
-
-{ if (special == 0) print $0; special = 0 }
diff --git a/debug/execinfo.h b/debug/execinfo.h
index fa9927c71a..c1614cc1f0 100644
--- a/debug/execinfo.h
+++ b/debug/execinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -35,8 +35,7 @@ extern char **backtrace_symbols (void *__const *__array, int __size)
/* This function is similar to backtrace_symbols() but it writes the result
- immediately to a file and can therefore also be used in situations where
- malloc() is not usable anymore. */
+ immediately to a file. */
extern void backtrace_symbols_fd (void *__const *__array, int __size, int __fd)
__THROW __nonnull ((1));
diff --git a/dlfcn/dlfcn.c b/dlfcn/dlfcn.c
index 8047150763..1ee225ba47 100644
--- a/dlfcn/dlfcn.c
+++ b/dlfcn/dlfcn.c
@@ -23,7 +23,7 @@
int __dlfcn_argc attribute_hidden;
char **__dlfcn_argv attribute_hidden;
-#ifdef HAVE_INITFINI_ARRAY
+
static void
init (int argc, char *argv[])
{
@@ -33,7 +33,7 @@ init (int argc, char *argv[])
static void (*const init_array []) (int argc, char *argv[])
__attribute__ ((section (".init_array"), aligned (sizeof (void *))))
- __attribute_used__ = { init };
-#else
-# error "Need linker with .init_array support."
-#endif
+ __attribute_used__ =
+{
+ init
+};
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
index 4ced40f75e..9b49e77d28 100644
--- a/elf/dl-conflict.c
+++ b/elf/dl-conflict.c
@@ -1,5 +1,5 @@
/* Resolve conflicts against already prelinked libraries.
- Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
@@ -34,8 +34,8 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
{
#if ! ELF_MACHINE_NO_RELA
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
- _dl_printf ("\nconflict processing: %s\n",
- l->l_name[0] ? l->l_name : rtld_progname);
+ _dl_debug_printf ("\nconflict processing: %s\n",
+ l->l_name[0] ? l->l_name : rtld_progname);
{
/* Do the conflict relocation of the object and library GOT and other
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 984f4a4ec6..930400c420 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -35,12 +35,6 @@
#include <dl-dst.h>
-#ifndef SHARED
-/* Giving this initialized value preallocates some surplus bytes in the
- static TLS area, see __libc_setup_tls (libc-tls.c). */
-size_t _dl_tls_static_size = 2048;
-#endif
-
extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
void (*dl_main) (const ElfW(Phdr) *phdr,
ElfW(Word) phnum,
diff --git a/elf/elf.h b/elf/elf.h
index 5f44f1b65a..c98bb5233d 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -2569,6 +2569,7 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_M32R_SDA16_RELA 42 /* 16 bit offset in SDA */
#define R_M32R_RELA_GNU_VTINHERIT 43
#define R_M32R_RELA_GNU_VTENTRY 44
+#define R_M32R_REL32 45 /* PC relative 32 bit. */
#define R_M32R_GOT24 48 /* 24 bit GOT entry */
#define R_M32R_26_PLTREL 49 /* 26 bit PC relative to PLT shifted */
diff --git a/elf/soinit.c b/elf/soinit.c
index 2015ea2d66..29e4707ceb 100644
--- a/elf/soinit.c
+++ b/elf/soinit.c
@@ -78,14 +78,8 @@ __libc_global_ctors (void)
/* This function becomes the DT_FINI termination function
for the C library. */
-#ifndef HAVE_INITFINI_ARRAY
-void _fini (void) __attribute__ ((section (".fini"))); /* Just for kicks. */
-void
-_fini (void)
-#else
void
__libc_fini (void)
-#endif
{
/* Call destructor functions. */
run_hooks (__DTOR_LIST__);
@@ -101,7 +95,6 @@ __libc_fini (void)
# endif
#endif
}
-#ifdef HAVE_INITFINI_ARRAY
+
void (*_fini_ptr) (void) __attribute__ ((section (".fini_array")))
= &__libc_fini;
-#endif
diff --git a/fedora/branch.mk b/fedora/branch.mk
index d0fabde313..274be40a4f 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -3,5 +3,5 @@ glibc-branch := fedora
glibc-base := HEAD
DIST_BRANCH := devel
COLLECTION := dist-fc4
-fedora-sync-date := 2005-10-20 06:51 UTC
-fedora-sync-tag := fedora-glibc-20051020T0651
+fedora-sync-date := 2005-11-15 08:09 UTC
+fedora-sync-tag := fedora-glibc-20051115T0809
diff --git a/hesiod/hesiod.c b/hesiod/hesiod.c
index b73aa3ce94..b3706b506b 100644
--- a/hesiod/hesiod.c
+++ b/hesiod/hesiod.c
@@ -487,12 +487,6 @@ __hesiod_res_set(void *context, struct __res_state *res,
if (ctx->res && ctx->free_res) {
res_nclose(ctx->res);
- if ((ctx->res->options & RES_INIT) && ctx->res->nscount > 0) {
- for (int ns = 0; ns < MAXNS; ns++) {
- free (ctx->res->_u._ext.nsaddrs[ns]);
- ctx->res->_u._ext.nsaddrs[ns] = NULL;
- }
- }
(*ctx->free_res)(ctx->res);
}
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
index e75fca81fb..0ca6af3580 100644
--- a/hurd/intr-msg.c
+++ b/hurd/intr-msg.c
@@ -1,5 +1,6 @@
/* Replacement for mach_msg used in interruptible Hurd RPCs.
- Copyright (C) 1995,96,97,98,99,2000,01,02 Free Software Foundation, Inc.
+ Copyright (C) 1995,96,97,98,99,2000,2001,2002,2005
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -201,9 +202,10 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
case MACH_MSG_TYPE_MOVE_SEND:
for (i = 0; i < number; i++)
__mach_port_deallocate (__mach_task_self (), *ports++);
- (ty->msgtl_header.msgt_longform
- ? ty->msgtl_name : ty->msgtl_header.msgt_name)
- = MACH_MSG_TYPE_COPY_SEND;
+ if (ty->msgtl_header.msgt_longform)
+ ty->msgtl_name = MACH_MSG_TYPE_COPY_SEND;
+ else
+ ty->msgtl_header.msgt_name = MACH_MSG_TYPE_COPY_SEND;
break;
case MACH_MSG_TYPE_COPY_SEND:
case MACH_MSG_TYPE_MOVE_RECEIVE:
@@ -223,29 +225,29 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
name = ty->msgtl_name;
size = ty->msgtl_size;
number = ty->msgtl_number;
- (char *) ty += sizeof (mach_msg_type_long_t);
+ ty = (void *) ty + sizeof (mach_msg_type_long_t);
}
else
{
name = ty->msgtl_header.msgt_name;
size = ty->msgtl_header.msgt_size;
number = ty->msgtl_header.msgt_number;
- (char *) ty += sizeof (mach_msg_type_t);
+ ty = (void *) ty + sizeof (mach_msg_type_t);
}
if (ty->msgtl_header.msgt_inline)
{
clean_ports ((void *) ty, 0);
/* calculate length of data in bytes, rounding up */
- (char *) ty += (((((number * size) + 7) >> 3)
- + sizeof (mach_msg_type_t) - 1)
- &~ (sizeof (mach_msg_type_t) - 1));
+ ty = (void *) ty + (((((number * size) + 7) >> 3)
+ + sizeof (mach_msg_type_t) - 1)
+ &~ (sizeof (mach_msg_type_t) - 1));
}
else
{
clean_ports (*(void **) ty,
ty->msgtl_header.msgt_deallocate);
- ++(void **) ty;
+ ty = (void *) ty + sizeof (void *);
}
}
#else /* Untyped Mach IPC flavor. */
diff --git a/iconvdata/ibm1364.h b/iconvdata/ibm1364.h
index f3bcdf706c..a2cdb8c639 100644
--- a/iconvdata/ibm1364.h
+++ b/iconvdata/ibm1364.h
@@ -8014,7 +8014,7 @@ static const char __ucs4_to_ibm1364sb[][1] =
"\x7c", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7",
"\xc8", "\xc9", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6",
"\xd7", "\xd8", "\xd9", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6",
- "\xe7", "\xe8", "\xe9", "\x70", "\x5b", "\x80", "\xb0", "\x6d",
+ "\xe7", "\xe8", "\xe9", "\x70", "\xb2", "\x80", "\xb0", "\x6d",
"\x79", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87",
"\x88", "\x89", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96",
"\x97", "\x98", "\x99", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6",
diff --git a/iconvdata/ibm1388.h b/iconvdata/ibm1388.h
index 6b28400ece..206e4eee6a 100644
--- a/iconvdata/ibm1388.h
+++ b/iconvdata/ibm1388.h
@@ -11316,11 +11316,11 @@ static const char __ucs4_to_ibm1388sb[][1] =
"\x7c", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7",
"\xc8", "\xc9", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6",
"\xd7", "\xd8", "\xd9", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6",
- "\xe7", "\xe8", "\xe9", "\xba", "\x5b", "\xbb", "\xb0", "\x6d",
+ "\xe7", "\xe8", "\xe9", "\xba", "\xb2", "\xbb", "\xb0", "\x6d",
"\x79", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87",
"\x88", "\x89", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96",
"\x97", "\x98", "\x99", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6",
- "\xa7", "\xa8", "\xa9", "\xc0", "\x4f", "\xd0", "\xa1", "\x07",
+ "\xa7", "\xa8", "\xa9", "\xc0", "\x4f", "\xd0", "\xa0", "\x07",
"\x20", "\x21", "\x22", "\x23", "\x24", "\x15", "\x06", "\x17",
"\x28", "\x29", "\x2a", "\x2b", "\x2c", "\x09", "\x0a", "\x1b",
"\x30", "\x31", "\x1a", "\x33", "\x34", "\x35", "\x36", "\x08",
diff --git a/iconvdata/testdata/IBM1364 b/iconvdata/testdata/IBM1364
index e9a93d126b..ad1feec0ef 100644
--- a/iconvdata/testdata/IBM1364
+++ b/iconvdata/testdata/IBM1364
Binary files differ
diff --git a/iconvdata/testdata/IBM1364..UTF8 b/iconvdata/testdata/IBM1364..UTF8
index 92ee11c555..1d748a01a6 100644
--- a/iconvdata/testdata/IBM1364..UTF8
+++ b/iconvdata/testdata/IBM1364..UTF8
Binary files differ
diff --git a/iconvdata/testdata/IBM1388 b/iconvdata/testdata/IBM1388
index 5340b79c65..618f2fb0c1 100644
--- a/iconvdata/testdata/IBM1388
+++ b/iconvdata/testdata/IBM1388
Binary files differ
diff --git a/iconvdata/testdata/IBM1388..UTF8 b/iconvdata/testdata/IBM1388..UTF8
index 3188740835..55b5fb97fb 100644
--- a/iconvdata/testdata/IBM1388..UTF8
+++ b/iconvdata/testdata/IBM1388..UTF8
Binary files differ
diff --git a/include/fcntl.h b/include/fcntl.h
index 7764f1cd62..6080faba3e 100644
--- a/include/fcntl.h
+++ b/include/fcntl.h
@@ -18,4 +18,8 @@ libc_hidden_proto (__open)
extern int __fcntl (int __fd, int __cmd, ...);
libc_hidden_proto (__fcntl)
+/* Helper functions for the various *at functions. For Linux. */
+extern void __atfct_seterrno (int errval, int fd, const char *buf)
+ attribute_hidden;
+
#endif
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 4fef305814..8ee940719e 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -31,8 +31,6 @@
* ASM_GLOBAL_DIRECTIVE with `.globl' or `.global'.
* ASM_TYPE_DIRECTIVE_PREFIX with `@' or `#' or whatever for .type,
or leave it undefined if there is no .type directive.
- * HAVE_GNU_LD if using GNU ld, with support for weak symbols in a.out,
- and for symbol set and warning messages extensions in a.out and ELF.
* HAVE_ELF if using ELF, which supports weak symbols using `.weak'.
* HAVE_ASM_WEAK_DIRECTIVE if we have weak symbols using `.weak'.
* HAVE_ASM_WEAKEXT_DIRECTIVE if we have weak symbols using `.weakext'.
@@ -56,7 +54,7 @@
#include <config.h>
/* The symbols in all the user (non-_) macros are C symbols.
- HAVE_GNU_LD without HAVE_ELF implies a.out. */
+ NO HAVE_ELF implies a.out. */
#if defined HAVE_ASM_WEAK_DIRECTIVE || defined HAVE_ASM_WEAKEXT_DIRECTIVE
# define HAVE_WEAK_SYMBOLS
@@ -220,55 +218,48 @@
/* When a reference to SYMBOL is encountered, the linker will emit a
warning message MSG. */
-#ifdef HAVE_GNU_LD
-# ifdef HAVE_ELF
+#ifdef HAVE_ELF
/* We want the .gnu.warning.SYMBOL section to be unallocated. */
-# ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
-# define __make_section_unallocated(section_string) \
+# ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
+# define __make_section_unallocated(section_string) \
asm (".section " section_string "\n\t.previous");
-# elif defined HAVE_ASM_POPSECTION_DIRECTIVE
-# define __make_section_unallocated(section_string) \
+# elif defined HAVE_ASM_POPSECTION_DIRECTIVE
+# define __make_section_unallocated(section_string) \
asm (".pushsection " section_string "\n\t.popsection");
-# else
-# define __make_section_unallocated(section_string)
-# endif
+# else
+# define __make_section_unallocated(section_string)
+# endif
/* Tacking on "\n\t#" to the section name makes gcc put it's bogus
section attributes on what looks like a comment to the assembler. */
-# ifdef HAVE_SECTION_QUOTES
-# define __sec_comment "\"\n\t#\""
-# else
-# define __sec_comment "\n\t#"
-# endif
-# define link_warning(symbol, msg) \
+# ifdef HAVE_SECTION_QUOTES
+# define __sec_comment "\"\n\t#\""
+# else
+# define __sec_comment "\n\t#"
+# endif
+# define link_warning(symbol, msg) \
__make_section_unallocated (".gnu.warning." #symbol) \
static const char __evoke_link_warning_##symbol[] \
__attribute__ ((used, section (".gnu.warning." #symbol __sec_comment))) \
= msg;
-# define libc_freeres_ptr(decl) \
+# define libc_freeres_ptr(decl) \
__make_section_unallocated ("__libc_freeres_ptrs, \"aw\", %nobits") \
decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
-# define __libc_freeres_fn_section \
+# define __libc_freeres_fn_section \
__attribute__ ((section ("__libc_freeres_fn")))
-# else /* Not ELF: a.out */
-# ifdef HAVE_XCOFF
+#else /* Not ELF: a.out */
+# ifdef HAVE_XCOFF
/* XCOFF does not support .stabs.
The native aix linker will remove the .stab and .stabstr sections
The gnu linker will have a fatal error if there is a relocation for
symbol in the .stab section. Silently disable this macro. */
-# define link_warning(symbol, msg)
-# else
-# define link_warning(symbol, msg) \
+# define link_warning(symbol, msg)
+# else
+# define link_warning(symbol, msg) \
asm (".stabs \"" msg "\",30,0,0,0\n\t" \
".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
-# endif /* XCOFF */
-# define libc_freeres_ptr(decl) decl
-# define __libc_freeres_fn_section
-# endif
-#else
-/* We will never be heard; they will all die horribly. */
-# define link_warning(symbol, msg)
+# endif /* XCOFF */
# define libc_freeres_ptr(decl) decl
# define __libc_freeres_fn_section
#endif
@@ -325,92 +316,79 @@ for linking")
*/
-#ifdef HAVE_GNU_LD
-
/* Symbol set support macros. */
-# ifdef HAVE_ELF
+#ifdef HAVE_ELF
/* Make SYMBOL, which is in the text segment, an element of SET. */
-# define text_set_element(set, symbol) _elf_set_element(set, symbol)
+# define text_set_element(set, symbol) _elf_set_element(set, symbol)
/* Make SYMBOL, which is in the data segment, an element of SET. */
-# define data_set_element(set, symbol) _elf_set_element(set, symbol)
+# define data_set_element(set, symbol) _elf_set_element(set, symbol)
/* Make SYMBOL, which is in the bss segment, an element of SET. */
-# define bss_set_element(set, symbol) _elf_set_element(set, symbol)
+# define bss_set_element(set, symbol) _elf_set_element(set, symbol)
/* These are all done the same way in ELF.
There is a new section created for each set. */
-# ifdef SHARED
+# ifdef SHARED
/* When building a shared library, make the set section writable,
because it will need to be relocated at run time anyway. */
-# define _elf_set_element(set, symbol) \
+# define _elf_set_element(set, symbol) \
static const void *__elf_set_##set##_element_##symbol##__ \
__attribute__ ((used, section (#set))) = &(symbol)
-# else
-# define _elf_set_element(set, symbol) \
+# else
+# define _elf_set_element(set, symbol) \
static const void *const __elf_set_##set##_element_##symbol##__ \
__attribute__ ((used, section (#set))) = &(symbol)
-# endif
+# endif
/* Define SET as a symbol set. This may be required (it is in a.out) to
be able to use the set's contents. */
-# define symbol_set_define(set) symbol_set_declare(set)
+# define symbol_set_define(set) symbol_set_declare(set)
/* Declare SET for use in this module, if defined in another module.
In a shared library, this is always local to that shared object.
For static linking, the set might be wholly absent and so we use
weak references. */
-# define symbol_set_declare(set) \
+# define symbol_set_declare(set) \
extern char const __start_##set[] __symbol_set_attribute; \
extern char const __stop_##set[] __symbol_set_attribute;
-# ifdef SHARED
-# define __symbol_set_attribute attribute_hidden
-# else
-# define __symbol_set_attribute __attribute__ ((weak))
-# endif
+# ifdef SHARED
+# define __symbol_set_attribute attribute_hidden
+# else
+# define __symbol_set_attribute __attribute__ ((weak))
+# endif
/* Return a pointer (void *const *) to the first element of SET. */
-# define symbol_set_first_element(set) ((void *const *) (&__start_##set))
+# define symbol_set_first_element(set) ((void *const *) (&__start_##set))
/* Return true iff PTR (a void *const *) has been incremented
past the last element in SET. */
-# define symbol_set_end_p(set, ptr) ((ptr) >= (void *const *) &__stop_##set)
+# define symbol_set_end_p(set, ptr) ((ptr) >= (void *const *) &__stop_##set)
-# else /* Not ELF: a.out. */
+#else /* Not ELF: a.out. */
-# ifdef HAVE_XCOFF
+# ifdef HAVE_XCOFF
/* XCOFF does not support .stabs.
The native aix linker will remove the .stab and .stabstr sections
The gnu linker will have a fatal error if there is a relocation for
symbol in the .stab section. Silently disable these macros. */
-# define text_set_element(set, symbol)
-# define data_set_element(set, symbol)
-# define bss_set_element(set, symbol)
-# else
-# define text_set_element(set, symbol) \
+# define text_set_element(set, symbol)
+# define data_set_element(set, symbol)
+# define bss_set_element(set, symbol)
+# else
+# define text_set_element(set, symbol) \
asm (".stabs \"" __SYMBOL_PREFIX #set "\",23,0,0," __SYMBOL_PREFIX #symbol)
-# define data_set_element(set, symbol) \
+# define data_set_element(set, symbol) \
asm (".stabs \"" __SYMBOL_PREFIX #set "\",25,0,0," __SYMBOL_PREFIX #symbol)
-# define bss_set_element(set, symbol) ?error Must use initialized data.
-# endif /* XCOFF */
-# define symbol_set_define(set) void *const (set)[1];
-# define symbol_set_declare(set) extern void *const (set)[1];
-
-# define symbol_set_first_element(set) &(set)[1]
-# define symbol_set_end_p(set, ptr) (*(ptr) == 0)
-
-# endif /* ELF. */
-#else
-/* We cannot do anything in generial. */
-# define text_set_element(set, symbol) asm ("")
-# define data_set_element(set, symbol) asm ("")
-# define bss_set_element(set, symbol) asm ("")
-# define symbol_set_define(set) void *const (set)[1];
+# define bss_set_element(set, symbol) ?error Must use initialized data.
+# endif /* XCOFF */
+# define symbol_set_define(set) void *const (set)[1];
# define symbol_set_declare(set) extern void *const (set)[1];
# define symbol_set_first_element(set) &(set)[1]
# define symbol_set_end_p(set, ptr) (*(ptr) == 0)
-#endif /* Have GNU ld. */
+
+#endif /* ELF. */
#if DO_VERSIONING
# define symbol_version(real, name, version) \
diff --git a/include/resolv.h b/include/resolv.h
index 9c24bd3bc7..958fb957c6 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -46,9 +46,11 @@ extern void res_send_setqhook (res_send_qhook __hook);
extern void res_send_setrhook (res_send_rhook __hook);
extern int res_ourserver_p (const res_state __statp,
const struct sockaddr_in6 *__inp);
+extern void __res_iclose(res_state statp, bool free_addr);
libc_hidden_proto (__res_ninit)
libc_hidden_proto (__res_maybe_init)
libc_hidden_proto (__res_nclose)
+libc_hidden_proto (__res_iclose)
libc_hidden_proto (__res_randomid)
libc_hidden_proto (__res_state)
diff --git a/include/string.h b/include/string.h
index 532d5ed333..c196007dcb 100644
--- a/include/string.h
+++ b/include/string.h
@@ -83,6 +83,7 @@ libc_hidden_proto (__strxfrm_l)
libc_hidden_proto (__strtok_r)
extern char *__strsep_g (char **__stringp, __const char *__delim);
libc_hidden_proto (__strsep_g)
+libc_hidden_proto (strnlen)
libc_hidden_builtin_proto (memchr)
libc_hidden_builtin_proto (memcpy)
@@ -96,7 +97,6 @@ libc_hidden_builtin_proto (strcmp)
libc_hidden_builtin_proto (strcpy)
libc_hidden_builtin_proto (strcspn)
libc_hidden_builtin_proto (strlen)
-libc_hidden_builtin_proto (strnlen)
libc_hidden_builtin_proto (strncmp)
libc_hidden_builtin_proto (strncpy)
libc_hidden_builtin_proto (strpbrk)
diff --git a/io/Makefile b/io/Makefile
index 906d1e3301..9339ffe699 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1992-2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 1992-2002, 2003, 2005 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -26,38 +26,43 @@ headers := sys/stat.h bits/stat.h sys/statfs.h bits/statfs.h sys/vfs.h \
poll.h sys/poll.h bits/poll.h \
utime.h ftw.h fts.h sys/sendfile.h
-routines := \
- utime \
- mkfifo \
- stat fstat lstat mknod stat64 fstat64 lstat64 \
- xstat fxstat lxstat xmknod xstat64 fxstat64 lxstat64 \
- statfs fstatfs statfs64 fstatfs64 \
- statvfs fstatvfs statvfs64 fstatvfs64 \
- umask chmod fchmod lchmod mkdir \
- open open64 close read write lseek lseek64 access euidaccess \
- fcntl flock lockf lockf64 \
- dup dup2 pipe \
- creat creat64 \
- chdir fchdir \
- getcwd getwd getdirname \
- chown fchown lchown \
- ttyname ttyname_r isatty \
- link symlink readlink \
- unlink rmdir \
- ftw ftw64 fts poll \
- posix_fadvise posix_fadvise64 \
- posix_fallocate posix_fallocate64 \
+routines := \
+ utime \
+ mkfifo \
+ stat fstat lstat mknod stat64 fstat64 lstat64 fstatat fstatat64 \
+ xstat fxstat lxstat xmknod xstat64 fxstat64 lxstat64 \
+ fxstatat fxstatat64 \
+ statfs fstatfs statfs64 fstatfs64 \
+ statvfs fstatvfs statvfs64 fstatvfs64 \
+ umask chmod fchmod lchmod mkdir \
+ open open64 openat openat64 close \
+ read write lseek lseek64 access euidaccess \
+ fcntl flock lockf lockf64 \
+ dup dup2 pipe \
+ creat creat64 \
+ chdir fchdir \
+ getcwd getwd getdirname \
+ chown fchown lchown fchownat \
+ ttyname ttyname_r isatty \
+ link symlink readlink \
+ unlink unlinkat rmdir \
+ ftw ftw64 fts poll \
+ posix_fadvise posix_fadvise64 \
+ posix_fallocate posix_fallocate64 \
sendfile sendfile64
# These routines will be omitted from the libc shared object.
# Instead the static object files will be included in a special archive
# linked against when the shared library will be used.
-static-only-routines = stat fstat lstat mknod stat64 fstat64 lstat64
+static-only-routines = stat fstat lstat mknod stat64 fstat64 lstat64 \
+ fstatat fstatat64
others := pwd
test-srcs := ftwtest
tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \
- tst-fcntl bug-ftw1 bug-ftw2 bug-ftw3 bug-ftw4 tst-statvfs
+ tst-fcntl bug-ftw1 bug-ftw2 bug-ftw3 bug-ftw4 tst-statvfs \
+ tst-openat tst-unlinkat tst-fstatat tst-futimesat \
+ tst-renameat tst-fchownat
distribute := ftwtest-sh
diff --git a/io/Versions b/io/Versions
index 5b311ee03b..65ee77182e 100644
--- a/io/Versions
+++ b/io/Versions
@@ -97,4 +97,10 @@ libc {
# n*
nftw; nftw64;
}
+ GLIBC_2.4 {
+ fchownat;
+ __fxstatat; __fxstatat64;
+ openat; openat64;
+ unlinkat;
+ }
}
diff --git a/io/fcntl.h b/io/fcntl.h
index ef9d5f9b81..8e13d33dcc 100644
--- a/io/fcntl.h
+++ b/io/fcntl.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,1992,1994-2001,2003,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1994-2001,2003,2004,2005
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -55,6 +56,15 @@ __BEGIN_DECLS
# define SEEK_END 2 /* Seek from end of file. */
#endif /* XPG */
+#ifdef __USE_GNU
+# define AT_FDCWD -100 /* Special value used to indicate
+ openat should use the current
+ working directory. */
+# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+#endif
+
/* Do the file control operation described by CMD on FD.
The remaining arguments are interpreted depending on CMD.
@@ -82,6 +92,32 @@ extern int __REDIRECT (open, (__const char *__file, int __oflag, ...), open64)
extern int open64 (__const char *__file, int __oflag, ...) __nonnull ((1));
#endif
+#ifdef __USE_GNU
+/* Similar to OPEN but a relative path name is interpreted relative to
+ the directory for which FD is a descriptor.
+
+ NOTE: some other OPENAT implementation support additional functionality
+ through this interface, especially using the O_XATTR flag. This is not
+ yet supported here.
+
+ This function is a cancellation point and therefore not marked with
+ __THROW. */
+# ifndef __USE_FILE_OFFSET64
+extern int openat (int __fd, __const char *__file, int __oflag, ...)
+ __nonnull ((2));
+# else
+# ifdef __REDIRECT
+extern int __REDIRECT (openat, (int __fd, __const char *__file, int __oflag,
+ ...), openat64) __nonnull ((2));
+# else
+# define openat openat64
+# endif
+# endif
+
+extern int openat64 (int __fd, __const char *__file, int __oflag, ...)
+ __nonnull ((2));
+#endif
+
/* Create and open FILE, with mode MODE. This takes an `int' MODE
argument because that is what `mode_t' will be widened to.
diff --git a/io/fstatat.c b/io/fstatat.c
new file mode 100644
index 0000000000..1ac80597a0
--- /dev/null
+++ b/io/fstatat.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sys/stat.h>
+
+/* This definition is only used if inlining fails for this function; see
+ the last page of <sys/stat.h>. The real work is done by the `x'
+ function which is passed a version number argument. We arrange in the
+ makefile that when not inlined this function is always statically
+ linked; that way a dynamically-linked executable always encodes the
+ version number corresponding to the data structures it uses, so the `x'
+ functions in the shared library can adapt without needing to recompile
+ all callers. */
+
+#undef fstatat
+int
+fstatat (int fd, const char *file, struct stat *buf, int flag)
+{
+ return __fxstatat (_STAT_VER, fd, file, buf, flag);
+}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstatat");
+#endif
diff --git a/io/fstatat64.c b/io/fstatat64.c
new file mode 100644
index 0000000000..a14b42d42e
--- /dev/null
+++ b/io/fstatat64.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sys/stat.h>
+
+/* This definition is only used if inlining fails for this function; see
+ the last page of <sys/stat.h>. The real work is done by the `x'
+ function which is passed a version number argument. We arrange in the
+ makefile that when not inlined this function is always statically
+ linked; that way a dynamically-linked executable always encodes the
+ version number corresponding to the data structures it uses, so the `x'
+ functions in the shared library can adapt without needing to recompile
+ all callers. */
+
+#undef fstatat64
+int
+fstatat64 (int fd, const char *file, struct stat64 *buf, int flag)
+{
+ return __fxstatat64 (_STAT_VER, fd, file, buf, flag);
+}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstatat64");
+#endif
diff --git a/io/sys/stat.h b/io/sys/stat.h
index 7075003922..0a82ef39e8 100644
--- a/io/sys/stat.h
+++ b/io/sys/stat.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,1992,1995-2002,2003,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1995-2004,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -228,6 +228,23 @@ extern int stat64 (__const char *__restrict __file,
extern int fstat64 (int __fd, struct stat64 *__buf) __THROW __nonnull ((2));
#endif
+#ifdef __USE_GNU
+/* Similar to stat, get the attributes for FILE and put them in BUF.
+ Relative path names are interpreted relative to FD unless FD is
+ AT_FDCWD. */
+# ifndef __USE_FILE_OFFSET64
+extern int fstatat (int __fd, const char *__file, struct stat *__buf,
+ int __flag) __THROW __nonnull ((2, 3));
+# else
+extern int __REDIRECT_NTH (fstatat, (int __fd, const char *__file,
+ struct stat *__buf, int __flag),
+ fstatat64) __THROW __nonnull ((2, 3));
+# endif
+
+extern int fstatat64 (int __fd, const char *__file, struct stat64 *__buf,
+ int __flag) __THROW __nonnull ((2, 3));
+#endif
+
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
# ifndef __USE_FILE_OFFSET64
/* Get file attributes about FILE and put them in BUF.
@@ -327,6 +344,9 @@ extern int __xstat (int __ver, __const char *__filename,
struct stat *__stat_buf) __THROW __nonnull ((2, 3));
extern int __lxstat (int __ver, __const char *__filename,
struct stat *__stat_buf) __THROW __nonnull ((2, 3));
+extern int __fxstatat (int __ver, int __fildes, __const char *__filename,
+ struct stat *__stat_buf, int __flag)
+ __THROW __nonnull ((3, 4));
#else
# ifdef __REDIRECT_NTH
extern int __REDIRECT_NTH (__fxstat, (int __ver, int __fildes,
@@ -338,6 +358,10 @@ extern int __REDIRECT_NTH (__xstat, (int __ver, __const char *__filename,
extern int __REDIRECT_NTH (__lxstat, (int __ver, __const char *__filename,
struct stat *__stat_buf), __lxstat64)
__nonnull ((2, 3));
+extern int __REDIRECT_NTH (__fxstatat, (int __ver, int __fildes,
+ __const char *__filename,
+ struct stat *__stat_buf, int __flag),
+ __fxstatat64) __nonnull ((3, 4));
# else
# define __fxstat __fxstat64
@@ -353,6 +377,9 @@ extern int __xstat64 (int __ver, __const char *__filename,
struct stat64 *__stat_buf) __THROW __nonnull ((2, 3));
extern int __lxstat64 (int __ver, __const char *__filename,
struct stat64 *__stat_buf) __THROW __nonnull ((2, 3));
+extern int __fxstatat64 (int __ver, int __fildes, __const char *__filename,
+ struct stat64 *__stat_buf, int __flag)
+ __THROW __nonnull ((3, 4));
#endif
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
__dev_t *__dev) __THROW __nonnull ((2, 4));
@@ -380,6 +407,15 @@ __NTH (fstat (int __fd, struct stat *__statbuf))
return __fxstat (_STAT_VER, __fd, __statbuf);
}
+# ifdef __USE_GNU
+extern __inline__ int
+__NTH (fstatat (int __fd, __const char *__filename, struct stat *__statbuf,
+ int __flag))
+{
+ return __fxstatat (_STAT_VER, __fd, __filename, __statbuf, __flag);
+}
+# endif
+
# if defined __USE_MISC || defined __USE_BSD
extern __inline__ int
__NTH (mknod (__const char *__path, __mode_t __mode, __dev_t __dev))
@@ -412,6 +448,15 @@ __NTH (fstat64 (int __fd, struct stat64 *__statbuf))
}
# endif
+# ifdef __USE_GNU
+extern __inline__ int
+__NTH (fstatat64 (int __fd, __const char *__filename, struct stat64 *__statbuf,
+ int __flag))
+{
+ return __fxstatat64 (_STAT_VER, __fd, __filename, __statbuf, __flag);
+}
+# endif
+
#endif
__END_DECLS
diff --git a/io/tst-fchownat.c b/io/tst-fchownat.c
new file mode 100644
index 0000000000..0cbf78b2b0
--- /dev/null
+++ b/io/tst-fchownat.c
@@ -0,0 +1,145 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+#if _POSIX_CHOWN_RESTRICTED > 0
+ uid_t uid = getuid ();
+ if (uid != 0)
+ {
+ puts ("need root privileges");
+ exit (0);
+ }
+#endif
+
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-fchownat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ puts ("file created");
+
+ struct stat64 st1;
+ if (fstat64 (fd, &st1) != 0)
+ {
+ puts ("fstat64 failed");
+ return 1;
+ }
+
+ close (fd);
+
+ if (fchownat (dir_fd, "some-file", st1.st_uid + 1, st1.st_gid + 1, 0) != 0)
+ {
+ puts ("fchownat failed");
+ return 1;
+ }
+
+ struct stat64 st2;
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) != 0)
+ {
+ puts ("fstatat64 failed");
+ return 1;
+ }
+
+ if (st1.st_uid + 1 != st2.st_uid || st1.st_gid + 1 != st2.st_gid)
+ {
+ puts ("owner change failed");
+ return 1;
+ }
+
+ if (unlinkat (dir_fd, "some-file", 0) != 0)
+ {
+ puts ("unlinkat failed");
+ return 1;
+ }
+
+ close (dir_fd);
+
+ return 0;
+}
diff --git a/io/tst-fstatat.c b/io/tst-fstatat.c
new file mode 100644
index 0000000000..6ddf30d87b
--- /dev/null
+++ b/io/tst-fstatat.c
@@ -0,0 +1,143 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-fstatat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ puts ("file created");
+
+ struct stat64 st1;
+ if (fstat64 (fd, &st1) != 0)
+ {
+ puts ("fstat64 failed");
+ return 1;
+ }
+
+ close (fd);
+
+ struct stat64 st2;
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) != 0)
+ {
+ puts ("fstatat64 failed");
+ return 1;
+ }
+
+ if (st1.st_dev != st2.st_dev
+ || st1.st_ino != st2.st_ino
+ || st1.st_size != st2.st_size)
+ {
+ puts ("stat results do not match");
+ return 1;
+ }
+
+ if (unlinkat (dir_fd, "some-file", 0) != 0)
+ {
+ puts ("unlinkat failed");
+ return 1;
+ }
+
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) == 0)
+ {
+ puts ("second fstatat64 succeeded");
+ return 1;
+ }
+ if (errno != ENOENT)
+ {
+ puts ("second fstatat64 did not fail with ENOENT");
+ return 1;
+ }
+
+ close (dir_fd);
+
+ return 0;
+}
diff --git a/io/tst-futimesat.c b/io/tst-futimesat.c
new file mode 100644
index 0000000000..c1e8d93f41
--- /dev/null
+++ b/io/tst-futimesat.c
@@ -0,0 +1,147 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-futimesat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ puts ("file created");
+
+ struct stat64 st1;
+ if (fstat64 (fd, &st1) != 0)
+ {
+ puts ("fstat64 failed");
+ return 1;
+ }
+
+ close (fd);
+
+ struct timeval tv[2];
+ tv[0].tv_sec = st1.st_atime + 1;
+ tv[0].tv_usec = 0;
+ tv[1].tv_sec = st1.st_mtime + 1;
+ tv[1].tv_usec = 0;
+ if (futimesat (dir_fd, "some-file", tv) != 0)
+ {
+ puts ("futimesat failed");
+ return 1;
+ }
+
+ struct stat64 st2;
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) != 0)
+ {
+ puts ("fstatat64 failed");
+ return 1;
+ }
+
+ if (st2.st_mtime != tv[1].tv_sec
+#ifdef _STATBUF_ST_NSEC
+ || st2.st_mtim.tv_nsec != 0
+#endif
+ )
+ {
+ puts ("stat shows different mtime");
+ return 1;
+ }
+
+
+ if (unlinkat (dir_fd, "some-file", 0) != 0)
+ {
+ puts ("unlinkat failed");
+ return 1;
+ }
+
+ close (dir_fd);
+
+ return 0;
+}
diff --git a/io/tst-openat.c b/io/tst-openat.c
new file mode 100644
index 0000000000..d10b654fa9
--- /dev/null
+++ b/io/tst-openat.c
@@ -0,0 +1,169 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-openat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ close (fd);
+ puts ("file created");
+
+ /* fdopendir takes over the descriptor, make a copy. */
+ dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("2nd lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ bool seen_file = false;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ if (strcmp (d->d_name, "some-file") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+
+ seen_file = true;
+ }
+ closedir (dir);
+
+ if (!seen_file)
+ {
+ puts ("file not created in correct directory");
+ return 1;
+ }
+
+ int cwdfd = open (".", O_RDONLY | O_DIRECTORY);
+ if (cwdfd == -1)
+ {
+ puts ("cannot get descriptor for cwd");
+ return 1;
+ }
+
+ if (fchdir (dir_fd) != 0)
+ {
+ puts ("1st fchdir failed");
+ return 1;
+ }
+
+ if (unlink ("some-file") != 0)
+ {
+ puts ("unlink failed");
+ return 1;
+ }
+
+ if (fchdir (cwdfd) != 0)
+ {
+ puts ("2nd fchdir failed");
+ return 1;
+ }
+
+ close (dir_fd);
+ close (cwdfd);
+
+ return 0;
+}
diff --git a/io/tst-renameat.c b/io/tst-renameat.c
new file mode 100644
index 0000000000..fb494594f5
--- /dev/null
+++ b/io/tst-renameat.c
@@ -0,0 +1,149 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-renameat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ puts ("file created");
+
+ struct stat64 st1;
+ if (fstat64 (fd, &st1) != 0)
+ {
+ puts ("fstat64 failed");
+ return 1;
+ }
+
+ close (fd);
+
+ if (renameat (dir_fd, "some-file", dir_fd, "another-file") != 0)
+ {
+ puts ("renameat failed");
+ return 1;
+ }
+
+ struct stat64 st2;
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) == 0)
+ {
+ puts ("fstatat64 succeeded");
+ return 1;
+ }
+ if (errno != ENOENT)
+ {
+ puts ("fstatat64 did not fail with ENOENT");
+ return 1;
+ }
+
+ if (fstatat64 (dir_fd, "another-file", &st2, 0) != 0)
+ {
+ puts ("2nd fstatat64 failed");
+ return 1;
+ }
+
+ if (st1.st_dev != st2.st_dev
+ || st1.st_ino != st2.st_ino
+ || st1.st_size != st2.st_size)
+ {
+ puts ("stat results do not match");
+ return 1;
+ }
+
+ if (unlinkat (dir_fd, "another-file", 0) != 0)
+ {
+ puts ("unlinkat failed");
+ return 1;
+ }
+
+ close (dir_fd);
+
+ return 0;
+}
diff --git a/io/tst-unlinkat.c b/io/tst-unlinkat.c
new file mode 100644
index 0000000000..c25443c27f
--- /dev/null
+++ b/io/tst-unlinkat.c
@@ -0,0 +1,178 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-unlinkat.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ char *dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ puts ("cannot create temporary directory");
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
+ if (dir_fd == -1)
+ {
+ puts ("cannot open directory");
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ /* fdopendir takes over the descriptor, make a copy. */
+ int dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("1st lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ DIR *dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("fdopendir failed");
+ return 1;
+ }
+ struct dirent64 *d;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ closedir (dir);
+
+ /* Try to create a file. */
+ int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
+ if (fd == -1)
+ {
+ if (errno == ENOSYS)
+ {
+ puts ("*at functions not supported");
+ return 0;
+ }
+
+ puts ("file creation failed");
+ return 1;
+ }
+ write (fd, "hello", 5);
+ close (fd);
+ puts ("file created");
+
+ /* fdopendir takes over the descriptor, make a copy. */
+ dupfd = dup (dir_fd);
+ if (dupfd == -1)
+ {
+ puts ("2nd dup failed");
+ return 1;
+ }
+ if (lseek (dupfd, 0, SEEK_SET) != 0)
+ {
+ puts ("2nd lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ dir = fdopendir (dupfd);
+ if (dir == NULL)
+ {
+ puts ("2nd fdopendir failed");
+ return 1;
+ }
+ bool seen_file = false;
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ if (strcmp (d->d_name, "some-file") != 0)
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+
+ seen_file = true;
+ }
+ closedir (dir);
+
+ if (!seen_file)
+ {
+ puts ("file not created in correct directory");
+ return 1;
+ }
+
+ /* Remove the file now. */
+ if (unlinkat (dir_fd, "some-file", 0) != 0)
+ {
+ puts ("unlinkat failed");
+ return 1;
+ }
+
+ /* We won't need dir_fd anymore after this, so use it. */
+ if (lseek (dir_fd, 0, SEEK_SET) != 0)
+ {
+ puts ("3rd lseek failed");
+ return 1;
+ }
+
+ /* The directory should be empty safe the . and .. files. */
+ dir = fdopendir (dir_fd);
+ if (dir == NULL)
+ {
+ puts ("3rd fdopendir failed");
+ return 1;
+ }
+ while ((d = readdir64 (dir)) != NULL)
+ if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
+ {
+ if (strcmp (d->d_name, "some-file") == 0)
+ {
+ puts ("some-file not removed");
+ return 1;
+ }
+ else
+ {
+ printf ("temp directory contains file \"%s\"\n", d->d_name);
+ return 1;
+ }
+ }
+ closedir (dir);
+
+ return 0;
+}
diff --git a/libio/stdio.h b/libio/stdio.h
index 4c1fe287e3..0076028324 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -156,6 +156,11 @@ extern int remove (__const char *__filename) __THROW;
extern int rename (__const char *__old, __const char *__new) __THROW;
__END_NAMESPACE_STD
+#ifdef __USE_GNU
+/* Rename file OLD relative to OLDFD to NEW relative to NEWFD. */
+extern int renameat (int __oldfd, __const char *__old, int __newfd,
+ __const char *__new) __THROW;
+#endif
__BEGIN_NAMESPACE_STD
/* Create a temporary file and open it read/write.
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 2a284e2e7b..8127bb6933 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-11 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #1294]
+ * locales/pt_BR: Set p_cs_precedes and n_cs_precedes to 1.
+
+2005-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * SUPPORTED (SUPPORTED-LOCALES): Fix typo in si_LK line.
+
2005-10-15 Ulrich Drepper <drepper@redhat.com>
[BZ #119]
diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED
index 233b2fa892..593a775419 100644
--- a/localedata/SUPPORTED
+++ b/localedata/SUPPORTED
@@ -291,7 +291,7 @@ ru_UA.UTF-8/UTF-8 \
ru_UA/KOI8-U \
rw_RW/UTF-8 \
se_NO/UTF-8 \
-si_LK/ITF-8 \
+si_LK/UTF-8 \
sid_ET/UTF-8 \
sk_SK.UTF-8/UTF-8 \
sk_SK/ISO-8859-2 \
diff --git a/localedata/locales/pt_BR b/localedata/locales/pt_BR
index 3b55671cbd..0d34dde076 100644
--- a/localedata/locales/pt_BR
+++ b/localedata/locales/pt_BR
@@ -65,9 +65,9 @@ positive_sign ""
negative_sign "<U002D>"
int_frac_digits 2
frac_digits 2
-p_cs_precedes 0
+p_cs_precedes 1
p_sep_by_space 1
-n_cs_precedes 0
+n_cs_precedes 1
n_sep_by_space 1
p_sign_posn 1
n_sign_posn 1
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 4ea35254bb..f9aa5b1226 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -3268,19 +3268,31 @@ munmap_chunk(p) mchunkptr p;
#endif
{
INTERNAL_SIZE_T size = chunksize(p);
- int ret;
assert (chunk_is_mmapped(p));
#if 0
assert(! ((char*)p >= mp_.sbrk_base && (char*)p < mp_.sbrk_base + mp_.sbrked_mem));
assert((mp_.n_mmaps > 0));
#endif
- assert(((p->prev_size + size) & (mp_.pagesize-1)) == 0);
+
+ uintptr_t block = (uintptr_t) p - p->prev_size;
+ size_t total_size = p->prev_size + size;
+ /* Unfortunately we have to do the compilers job by hand here. Normally
+ we would test BLOCK and TOTAL-SIZE separately for compliance with the
+ page size. But gcc does not recognize the optimization possibility
+ (in the moment at least) so we combine the two values into one before
+ the bit test. */
+ if (__builtin_expect (((block | total_size) & (mp_.pagesize - 1)) != 0, 0))
+ {
+ malloc_printerr (check_action, "munmap_chunk(): invalid pointer",
+ chunk2mem (p));
+ return;
+ }
mp_.n_mmaps--;
- mp_.mmapped_mem -= (size + p->prev_size);
+ mp_.mmapped_mem -= total_size;
- ret = munmap((char *)p - p->prev_size, size + p->prev_size);
+ int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
/* munmap returns non-zero on failure */
assert(ret == 0);
diff --git a/misc/Makefile b/misc/Makefile
index 7c0b64818d..5199b6b653 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -47,7 +47,7 @@ routines := brk sbrk sstk ioctl \
gtty stty \
ptrace \
fstab mntent mntent_r \
- utimes lutimes futimes \
+ utimes lutimes futimes futimesat \
truncate ftruncate truncate64 ftruncate64 \
chflags fchflags \
insremque getttyent getusershell getpass ttyslot \
diff --git a/misc/Versions b/misc/Versions
index 4c3aafad6e..fdf2d9d2af 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -131,6 +131,7 @@ libc {
remap_file_pages;
}
GLIBC_2.4 {
+ futimesat;
__syslog_chk; __vsyslog_chk;
}
}
diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c
index 398f0b6dd9..b03c12ce0b 100644
--- a/misc/hsearch_r.c
+++ b/misc/hsearch_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1995,1996,1997,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1993.
@@ -206,7 +206,7 @@ hsearch_r (item, action, retval, htab)
{
/* If table is full and another entry should be entered return
with error. */
- if (action == ENTER && htab->filled == htab->size)
+ if (htab->filled == htab->size)
{
__set_errno (ENOMEM);
*retval = NULL;
diff --git a/nis/nss_nis/nis-publickey.c b/nis/nss_nis/nis-publickey.c
index 6e92112d11..5aa41b8c17 100644
--- a/nis/nss_nis/nis-publickey.c
+++ b/nis/nss_nis/nis-publickey.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2001,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999,2001,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -120,7 +120,7 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
++p;
strncpy (buf, p, 2 * (HEXKEYBYTES + 1));
- buf[2 * (HEXKEYBYTES + 1)] = '\0';
+ buf[2 * HEXKEYBYTES + 1] = '\0';
if (!xdecrypt (buf, passwd))
return NSS_STATUS_SUCCESS;
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 02da41dd82..25feaaf6e5 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,17 @@
+2005-11-06 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/configure: Removed.
+
+2005-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Remove trace of
+ optional init_array/fini_array support.
+
+2005-10-24 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Remove unnecessary
+ versioned_symbol use.
+
2005-10-16 Roland McGrath <roland@redhat.com>
* init.c (__pthread_initialize_minimal_internal): Even when using a
@@ -323,6 +337,7 @@
2005-02-14 Alan Modra <amodra@bigpond.net.au>
+ [BZ #721]
* sysdeps/powerpc/tcb-offsets.sym (thread_offsetof): Redefine to suit
gcc4.
diff --git a/nptl/sysdeps/unix/sysv/linux/configure b/nptl/sysdeps/unix/sysv/linux/configure
deleted file mode 100644
index 229414dd74..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/configure
+++ /dev/null
@@ -1,3 +0,0 @@
-# Local configure fragment for sysdeps/unix/sysv/linux.
-
-DEFINES="$DEFINES -D_LIBC_REENTRANT"
diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c b/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
index b7d4e57945..b6d2cec0d0 100644
--- a/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
+++ b/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
@@ -1,5 +1,5 @@
/* Special .init and .fini section support for ia64. NPTL version.
- Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it
@@ -38,7 +38,6 @@
#include <stddef.h>
-#ifdef HAVE_INITFINI_ARRAY
__asm__ ("\n\
#include \"defs.h\"\n\
@@ -49,95 +48,3 @@ __asm__ ("\n\
.xdata8 \".init_array\",@fptr(__pthread_initialize_minimal_internal)\n\
/*@_init_PROLOG_ENDS*/\n\
");
-
-#else
-
-__asm__ ("\n\
-\n\
-#include \"defs.h\"\n\
-\n\
-/*@HEADER_ENDS*/\n\
-\n\
-/*@_init_PROLOG_BEGINS*/\n\
- .section .init\n\
- .align 16\n\
- .global _init#\n\
- .proc _init#\n\
-_init:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- alloc r34 = ar.pfs, 0, 3, 0, 0\n\
- .vframe r32\n\
- mov r32 = r12\n\
- .save rp, r33\n\
- mov r33 = b0\n\
- .body\n\
- adds r12 = -16, r12\n\
- ;;\n\
- st8 [r12] = gp, -16\n\
- br.call.sptk.many b0 = __pthread_initialize_minimal_internal# ;;\n\
- ;;\n\
- adds r12 = 16, r12\n\
- ;;\n\
- ld8 gp = [r12]\n\
- ;;\n\
- .endp _init#\n\
-\n\
-/*@_init_PROLOG_ENDS*/\n\
-\n\
-/*@_init_EPILOG_BEGINS*/\n\
- .section .init\n\
- .proc _init#\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- .vframe r32\n\
- .save rp, r33\n\
- .body\n\
- mov r12 = r32\n\
- mov ar.pfs = r34\n\
- mov b0 = r33\n\
- br.ret.sptk.many b0\n\
- .endp _init#\n\
-/*@_init_EPILOG_ENDS*/\n\
-\n\
-/*@_fini_PROLOG_BEGINS*/\n\
- .section .fini\n\
- .align 16\n\
- .global _fini#\n\
- .proc _fini#\n\
-_fini:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- alloc r34 = ar.pfs, 0, 3, 0, 0\n\
- .vframe r32\n\
- mov r32 = r12\n\
- .save rp, r33\n\
- mov r33 = b0\n\
- .body\n\
- adds r12 = -16, r12\n\
- ;;\n\
- .endp _fini#\n\
-\n\
-/*@_fini_PROLOG_ENDS*/\n\
-\n\
-/*@_fini_EPILOG_BEGINS*/\n\
- .section .fini\n\
- .proc _fini#\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- .vframe r32\n\
- .save rp, r33\n\
- .body\n\
- mov r12 = r32\n\
- mov ar.pfs = r34\n\
- mov b0 = r33\n\
- br.ret.sptk.many b0\n\
- .endp _fini#\n\
-\n\
-/*@_fini_EPILOG_ENDS*/\n\
-\n\
-/*@TRAILER_BEGINS*/\n\
- .weak __gmon_start__#\n\
-");
-
-#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
index 31271bb94c..6b77dfc0d8 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -56,4 +56,3 @@ sem_trywait:
orl $-1, %eax
retq
.size sem_trywait,.-sem_trywait
- versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)
diff --git a/nscd/connections.c b/nscd/connections.c
index 900dfb1a4c..376693ee71 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -1656,7 +1656,7 @@ main_loop_epoll (int efd)
/* Remove the descriptor from the epoll descriptor. */
(void) epoll_ctl (efd, EPOLL_CTL_DEL, revs[cnt].data.fd, NULL);
- /* Get a worked to handle the request. */
+ /* Get a worker to handle the request. */
fd_ready (revs[cnt].data.fd);
/* Reset the time. */
diff --git a/posix/execl.c b/posix/execl.c
index 12b59f9de3..7f822d0142 100644
--- a/posix/execl.c
+++ b/posix/execl.c
@@ -24,9 +24,6 @@
#include <stackinfo.h>
-#ifndef HAVE_GNU_LD
-# define __environ environ
-#endif
/* Execute PATH with all arguments after PATH until
a NULL pointer and environment from `environ'. */
diff --git a/posix/execv.c b/posix/execv.c
index a3c51c7be4..cb372abe37 100644
--- a/posix/execv.c
+++ b/posix/execv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -18,9 +18,6 @@
#include <unistd.h>
-#ifndef HAVE_GNU_LD
-# define __environ environ
-#endif
/* Execute PATH with arguments ARGV and environment from `environ'. */
int
diff --git a/posix/unistd.h b/posix/unistd.h
index b0fba33417..86e0e9e659 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -431,6 +431,14 @@ extern int lchown (__const char *__file, __uid_t __owner, __gid_t __group)
#endif /* Use BSD || X/Open Unix. */
+#ifdef __USE_GNU
+/* Change the owner and group of FILE relative to the directory FD is open
+ on. */
+extern int fchownat (int __fd, __const char *__file, __uid_t __owner,
+ __gid_t __group, int __flag)
+ __THROW __nonnull ((2)) __wur;
+#endif /* Use GNU. */
+
/* Change the process's working directory to PATH. */
extern int chdir (__const char *__path) __THROW __nonnull ((1)) __wur;
@@ -749,6 +757,12 @@ extern int readlink (__const char *__restrict __path, char *__restrict __buf,
/* Remove the link NAME. */
extern int unlink (__const char *__name) __THROW __nonnull ((1));
+#ifdef __USE_GNU
+/* Remove the link NAME relative to FD. */
+extern int unlinkat (int __fd, __const char *__name, int __flag)
+ __THROW __nonnull ((2));
+#endif
+
/* Remove the directory PATH. */
extern int rmdir (__const char *__path) __THROW __nonnull ((1));
diff --git a/resolv/Versions b/resolv/Versions
index 2a67677d8e..7016365be5 100644
--- a/resolv/Versions
+++ b/resolv/Versions
@@ -39,7 +39,7 @@ libc {
h_errno; __resp;
%endif
- __res_maybe_init;
+ __res_maybe_init; __res_iclose;
}
}
diff --git a/resolv/res_data.c b/resolv/res_data.c
index adadcdcd7a..1beea1dc4f 100644
--- a/resolv/res_data.c
+++ b/resolv/res_data.c
@@ -246,7 +246,9 @@ res_close(void) {
if ((_res.options & RES_INIT) == 0)
return;
#endif
- res_nclose(&_res);
+ /* We don't free the name server addresses because we never
+ did it and it would be done implicitly on shutdown. */
+ __res_iclose(&_res, false);
}
#ifdef BIND_UPDATE
diff --git a/resolv/res_init.c b/resolv/res_init.c
index 731c784e17..f881060d58 100644
--- a/resolv/res_init.c
+++ b/resolv/res_init.c
@@ -555,7 +555,7 @@ libc_hidden_def (__res_randomid)
* This routine is not expected to be user visible.
*/
void
-res_nclose(res_state statp) {
+__res_iclose(res_state statp, bool free_addr) {
int ns;
if (statp->_vcsock >= 0) {
@@ -568,13 +568,25 @@ res_nclose(res_state statp) {
#else
for (ns = 0; ns < statp->_u._ext.nscount; ns++)
#endif
- if (statp->_u._ext.nsaddrs[ns]
- && statp->_u._ext.nssocks[ns] != -1) {
- close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);
- statp->_u._ext.nssocks[ns] = -1;
+ if (statp->_u._ext.nsaddrs[ns]) {
+ if (statp->_u._ext.nssocks[ns] != -1) {
+ close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);
+ statp->_u._ext.nssocks[ns] = -1;
+ }
+ if (free_addr) {
+ free (statp->_u._ext.nsaddrs[ns]);
+ statp->_u._ext.nsaddrs[ns] = NULL;
+ }
}
statp->_u._ext.nsinit = 0;
}
+libc_hidden_def (__res_iclose)
+
+void
+res_nclose(res_state statp)
+{
+ __res_iclose (statp, true);
+}
#ifdef _LIBC
libc_hidden_def (__res_nclose)
#endif
@@ -589,14 +601,7 @@ res_thread_freeres (void)
/* Never called res_ninit. */
return;
- __res_nclose (&_res); /* Close any VC sockets. */
-
- for (int ns = 0; ns < MAXNS; ns++)
- if (_res._u._ext.nsaddrs[ns] != NULL)
- {
- free (_res._u._ext.nsaddrs[ns]);
- _res._u._ext.nsaddrs[ns] = NULL;
- }
+ __res_iclose (&_res, true); /* Close any VC sockets. */
/* Make sure we do a full re-initialization the next time. */
_res.options = 0;
diff --git a/resolv/res_libc.c b/resolv/res_libc.c
index 76abca8442..834773c32f 100644
--- a/resolv/res_libc.c
+++ b/resolv/res_libc.c
@@ -70,14 +70,8 @@ res_init(void) {
_res.retry = 4;
if (!(_res.options & RES_INIT))
_res.options = RES_DEFAULT;
- else if (_res.nscount > 0) {
- __res_nclose (&_res); /* Close any VC sockets. */
-
- for (int ns = 0; ns < MAXNS; ns++) {
- free (_res._u._ext.nsaddrs[ns]);
- _res._u._ext.nsaddrs[ns] = NULL;
- }
- }
+ else if (_res.nscount > 0)
+ __res_iclose (&_res, true); /* Close any VC sockets. */
/*
* This one used to initialize implicitly to zero, so unless the app
@@ -103,11 +97,7 @@ __res_maybe_init (res_state resp, int preinit)
if (resp->options & RES_INIT) {
if (__res_initstamp != resp->_u._ext.initstamp) {
if (resp->nscount > 0) {
- __res_nclose (resp);
- for (int ns = 0; ns < MAXNS; ns++) {
- free (resp->_u._ext.nsaddrs[ns]);
- resp->_u._ext.nsaddrs[ns] = NULL;
- }
+ __res_iclose (resp, true);
return __res_vinit (resp, 1);
}
}
diff --git a/resolv/res_send.c b/resolv/res_send.c
index e62cde2360..ff7be11509 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -381,7 +381,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
}
}
if (needclose)
- res_nclose(statp);
+ __res_iclose(statp, false);
}
/*
@@ -488,7 +488,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
done = 1;
break;
case res_nextns:
- res_nclose(statp);
+ __res_iclose(statp, false);
goto next_ns;
case res_done:
return (resplen);
@@ -553,7 +553,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
*/
if ((v_circuit && (statp->options & RES_USEVC) == 0) ||
(statp->options & RES_STAYOPEN) == 0) {
- res_nclose(statp);
+ __res_iclose(statp, false);
}
if (statp->rhook) {
int done = 0, loops = 0;
@@ -570,7 +570,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
done = 1;
break;
case res_nextns:
- res_nclose(statp);
+ __res_iclose(statp, false);
goto next_ns;
case res_modified:
/* give the hook another try */
@@ -589,7 +589,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
next_ns: ;
} /*foreach ns*/
} /*foreach retry*/
- res_nclose(statp);
+ __res_iclose(statp, false);
if (!v_circuit) {
if (!gotsomewhere)
__set_errno (ECONNREFUSED); /* no nameservers found */
@@ -637,14 +637,14 @@ send_vc(res_state statp,
if (getpeername(statp->_vcsock,
(struct sockaddr *)&peer, &size) < 0 ||
!sock_eq(&peer, nsap)) {
- res_nclose(statp);
+ __res_iclose(statp, false);
statp->_flags &= ~RES_F_VC;
}
}
if (statp->_vcsock < 0 || (statp->_flags & RES_F_VC) == 0) {
if (statp->_vcsock >= 0)
- res_nclose(statp);
+ __res_iclose(statp, false);
statp->_vcsock = socket(nsap->sin6_family, SOCK_STREAM, 0);
if (statp->_vcsock < 0) {
@@ -660,7 +660,7 @@ send_vc(res_state statp,
*terrno = errno;
Aerror(statp, stderr, "connect/vc", errno,
(struct sockaddr *) nsap);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
statp->_flags |= RES_F_VC;
@@ -676,7 +676,7 @@ send_vc(res_state statp,
!= (INT16SZ + buflen)) {
*terrno = errno;
Perror(statp, stderr, "write failed", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
/*
@@ -694,7 +694,7 @@ send_vc(res_state statp,
if (n <= 0) {
*terrno = errno;
Perror(statp, stderr, "read failed", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
/*
* A long running process might get its TCP
* connection reset if the remote server was
@@ -706,10 +706,8 @@ send_vc(res_state statp,
*/
if (*terrno == ECONNRESET && !connreset) {
connreset = 1;
- res_nclose(statp);
goto same_ns;
}
- res_nclose(statp);
return (0);
}
resplen = ns_get16(ans);
@@ -718,7 +716,7 @@ send_vc(res_state statp,
ans = malloc (MAXPACKET);
if (ans == NULL) {
*terrno = ENOMEM;
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
anssiz = MAXPACKET;
@@ -743,7 +741,7 @@ send_vc(res_state statp,
Dprint(statp->options & RES_DEBUG,
(stdout, ";; undersized: %d\n", len));
*terrno = EMSGSIZE;
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
cp = ans;
@@ -754,7 +752,7 @@ send_vc(res_state statp,
if (n <= 0) {
*terrno = errno;
Perror(statp, stderr, "read(vc)", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
if (truncating) {
@@ -847,7 +845,7 @@ send_dg(res_state statp,
sizeof *nsap) < 0) {
Aerror(statp, stderr, "connect(dg)", errno,
(struct sockaddr *) nsap);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
/* Make socket non-blocking. */
@@ -879,7 +877,7 @@ send_dg(res_state statp,
evNowTime(&now);
if (evCmpTime(finish, now) <= 0) {
Perror(statp, stderr, "select", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
evSubTime(&timeout, &finish, &now);
@@ -910,7 +908,7 @@ send_dg(res_state statp,
}
}
Perror(statp, stderr, "poll", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
__set_errno (0);
@@ -919,7 +917,7 @@ send_dg(res_state statp,
if (errno == EINTR || errno == EAGAIN)
goto recompute_resend;
Perror(statp, stderr, "send", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
pfd[0].events = POLLIN;
@@ -950,7 +948,7 @@ send_dg(res_state statp,
goto wait;
}
Perror(statp, stderr, "recvfrom", errno);
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
*gotsomewhere = 1;
@@ -962,7 +960,7 @@ send_dg(res_state statp,
(stdout, ";; undersized: %d\n",
resplen));
*terrno = EMSGSIZE;
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
if (hp->id != anhp->id) {
@@ -1011,7 +1009,7 @@ send_dg(res_state statp,
(stdout, "server rejected query:\n"),
ans, (resplen > anssiz) ? anssiz : resplen);
next_ns:
- res_nclose(statp);
+ __res_iclose(statp, false);
/* don't retry if called from dig */
if (!statp->pfcode)
return (0);
@@ -1031,7 +1029,7 @@ send_dg(res_state statp,
Dprint(statp->options & RES_DEBUG,
(stdout, ";; truncated answer\n"));
*v_circuit = 1;
- res_nclose(statp);
+ __res_iclose(statp, false);
return (1);
}
/*
@@ -1041,7 +1039,7 @@ send_dg(res_state statp,
return (resplen);
} else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
/* Something went wrong. We can stop trying. */
- res_nclose(statp);
+ __res_iclose(statp, false);
return (0);
}
else {
diff --git a/rt/mqueue.h b/rt/mqueue.h
index 42313b192b..1ccad5bbad 100644
--- a/rt/mqueue.h
+++ b/rt/mqueue.h
@@ -1,6 +1,5 @@
-/* Copyright (C) 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -57,8 +56,8 @@ extern int mq_setattr (mqd_t __mqdes,
/* Remove message queue named NAME. */
extern int mq_unlink (const char *__name) __THROW;
-/* Register notification upon message arrival to an empty message queue
- MQDES. */
+/* Register notification issued upon message arrival to an empty
+ message queue MQDES. */
extern int mq_notify (mqd_t __mqdes, const struct sigevent *__notification)
__THROW;
@@ -86,6 +85,6 @@ extern int mq_timedsend (mqd_t __mqdes, const char *__msg_ptr,
const struct timespec *__abs_timeout);
#endif
-__END_DECLS
+__END_DECLS
#endif /* mqueue.h */
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 119323617c..a2cfbe720c 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -33,7 +33,7 @@ routines := \
perror psignal \
tmpfile tmpfile64 tmpnam tmpnam_r tempnam tempname \
getline getw putw \
- remove rename \
+ remove rename renameat \
flockfile ftrylockfile funlockfile
install-others = $(inst_includedir)/bits/stdio_lim.h
diff --git a/stdio-common/Versions b/stdio-common/Versions
index 1dbce1a124..2f64429346 100644
--- a/stdio-common/Versions
+++ b/stdio-common/Versions
@@ -37,7 +37,7 @@ libc {
tempnam; tmpfile; tmpnam; tmpnam_r;
# v*
- vfprintf; vfscanf; vprintf;
+ vfprintf; vfscanf; vprintf;
}
GLIBC_2.1 {
# p*
@@ -46,6 +46,9 @@ libc {
# t*
tmpfile; tmpfile64;
}
+ GLIBC_2.4 {
+ renameat;
+ }
GLIBC_PRIVATE {
# global variables
_itoa_lower_digits;
diff --git a/stdio-common/psignal.c b/stdio-common/psignal.c
index be95095350..98049a5871 100644
--- a/stdio-common/psignal.c
+++ b/stdio-common/psignal.c
@@ -24,10 +24,6 @@
#include <wchar.h>
-#ifndef HAVE_GNU_LD
-#define _sys_siglist sys_siglist
-#endif
-
/* Defined in sys_siglist.c. */
extern const char *const _sys_siglist[];
extern const char *const _sys_siglist_internal[] attribute_hidden;
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 832a6ed547..83da710a2a 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -257,7 +257,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
#define NOT_IN_JUMP_RANGE(Ch) ((Ch) < L_(' ') || (Ch) > L_('z'))
#define CHAR_CLASS(Ch) (jump_table[(INT_T) (Ch) - L_(' ')])
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
+#ifdef SHARED
/* 'int' is enough and it saves some space on 64 bit systems. */
# define JUMP_TABLE_TYPE const int
# define JUMP(ChExpr, table) \
@@ -1283,7 +1283,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* Process whole format string. */
do
{
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
+#ifdef SHARED
# define REF(Name) &&do_##Name - &&do_form_unknown
#else
# define REF(Name) &&do_##Name
@@ -1726,7 +1726,7 @@ do_positional:
for (; (size_t) nspecs_done < nspecs; ++nspecs_done)
{
#undef REF
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
+#ifdef SHARED
# define REF(Name) &&do2_##Name - &&do_form_unknown
#else
# define REF(Name) &&do2_##Name
diff --git a/stdlib/exit.c b/stdlib/exit.c
index ac247a1233..e5e25960b1 100644
--- a/stdlib/exit.c
+++ b/stdlib/exit.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,95,96,97,99,2001,02 Free Software Foundation, Inc.
+/* Copyright (C) 1991,95,96,97,99,2001,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -21,10 +21,8 @@
#include <unistd.h>
#include "exit.h"
-#ifdef HAVE_GNU_LD
#include "set-hooks.h"
DEFINE_HOOK (__libc_atexit, (void))
-#endif
/* Call all functions registered with `atexit' and `on_exit',
@@ -70,14 +68,7 @@ exit (int status)
free (old);
}
-#ifdef HAVE_GNU_LD
RUN_HOOK (__libc_atexit, ());
-#else
- {
- extern void _cleanup (void);
- _cleanup ();
- }
-#endif
_exit (status);
}
diff --git a/string/strsignal.c b/string/strsignal.c
index 8ff01a4731..8c5ed1e621 100644
--- a/string/strsignal.c
+++ b/string/strsignal.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1994-2000, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1994-2002, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,10 +24,6 @@
#include <bits/libc-lock.h>
-#ifndef HAVE_GNU_LD
-#define _sys_siglist sys_siglist
-#endif
-
/* Defined in siglist.c. */
extern const char *const _sys_siglist[];
extern const char *const _sys_siglist_internal[] attribute_hidden;
diff --git a/string/tester.c b/string/tester.c
index 5f0a851104..f95270efb4 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -1,5 +1,5 @@
/* Tester for string functions.
- Copyright (C) 1995-2000, 2001, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1995-2001, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -34,10 +34,6 @@
#include <strings.h>
#include <fcntl.h>
-#ifndef HAVE_GNU_LD
-#define _sys_nerr sys_nerr
-#define _sys_errlist sys_errlist
-#endif
#define STREQ(a, b) (strcmp((a), (b)) == 0)
diff --git a/sunrpc/svc.c b/sunrpc/svc.c
index 6caf8412d5..1e358e247c 100644
--- a/sunrpc/svc.c
+++ b/sunrpc/svc.c
@@ -372,7 +372,7 @@ svc_getreqset (fd_set *readfds)
setsize = FD_SETSIZE;
maskp = readfds->fds_bits;
for (sock = 0; sock < setsize; sock += NFDBITS)
- for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
+ for (mask = *maskp++; (bit = ffsl (mask)); mask ^= (1L << (bit - 1)))
INTUSE(svc_getreq_common) (sock + bit - 1);
}
INTDEF (svc_getreqset)
@@ -380,22 +380,24 @@ INTDEF (svc_getreqset)
void
svc_getreq_poll (struct pollfd *pfdp, int pollretval)
{
- register int i;
- register int fds_found;
+ if (pollretval == 0)
+ return;
- for (i = fds_found = 0; i < svc_max_pollfd && fds_found < pollretval; ++i)
+ register int fds_found;
+ for (int i = fds_found = 0; i < svc_max_pollfd; ++i)
{
register struct pollfd *p = &pfdp[i];
if (p->fd != -1 && p->revents)
{
/* fd has input waiting */
- ++fds_found;
-
if (p->revents & POLLNVAL)
xprt_unregister (xports[p->fd]);
else
INTUSE(svc_getreq_common) (p->fd);
+
+ if (++fds_found >= pollretval)
+ break;
}
}
}
diff --git a/sysdeps/generic/check_fds.c b/sysdeps/generic/check_fds.c
index 5ae3feee3e..10ba3da395 100644
--- a/sysdeps/generic/check_fds.c
+++ b/sysdeps/generic/check_fds.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,12 +44,26 @@ check_one_fd (int fd, int mode)
if (__builtin_expect (__libc_fcntl (fd, F_GETFD), 0) == -1
&& errno == EBADF)
{
- struct stat64 st;
+ const char *name;
+ dev_t dev;
+
+ /* For writable descriptors we use /dev/full. */
+ if ((mode & O_ACCMODE) == O_WRONLY)
+ {
+ name = _PATH_DEV "full";
+ dev = makedev (DEV_FULL_MAJOR, DEV_FULL_MINOR);
+ }
+ else
+ {
+ name = _PATH_DEVNULL;
+ dev = makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR);
+ }
/* Something is wrong with this descriptor, it's probably not
opened. Open /dev/null so that the SUID program we are
about to start does not accidently use this descriptor. */
- int nullfd = open_not_cancel (_PATH_DEVNULL, mode, 0);
+ int nullfd = open_not_cancel (name, mode, 0);
+
/* We are very paranoid here. With all means we try to ensure
that we are actually opening the /dev/null device and nothing
else.
@@ -57,13 +71,11 @@ check_one_fd (int fd, int mode)
Note that the following code assumes that STDIN_FILENO,
STDOUT_FILENO, STDERR_FILENO are the three lowest file
decsriptor numbers, in this order. */
+ struct stat64 st;
if (__builtin_expect (nullfd != fd, 0)
|| __builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) != 0
|| __builtin_expect (S_ISCHR (st.st_mode), 1) == 0
-#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
- || st.st_rdev != makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR)
-#endif
- )
+ || st.st_rdev != dev)
/* We cannot even give an error message here since it would
run into the same problems. */
while (1)
@@ -84,7 +96,7 @@ __libc_check_standard_fds (void)
# define O_NOFOLLOW 0
#endif
/* Check all three standard file descriptors. */
- check_one_fd (STDIN_FILENO, O_RDONLY | O_NOFOLLOW);
- check_one_fd (STDOUT_FILENO, O_RDWR | O_NOFOLLOW);
- check_one_fd (STDERR_FILENO, O_RDWR | O_NOFOLLOW);
+ check_one_fd (STDIN_FILENO, O_WRONLY | O_NOFOLLOW);
+ check_one_fd (STDOUT_FILENO, O_RDONLY | O_NOFOLLOW);
+ check_one_fd (STDERR_FILENO, O_RDONLY | O_NOFOLLOW);
}
diff --git a/sysdeps/generic/errlist.c b/sysdeps/generic/errlist.c
index 6b459ee40a..6a834fc329 100644
--- a/sysdeps/generic/errlist.c
+++ b/sysdeps/generic/errlist.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1994, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1994, 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -18,10 +18,6 @@
#include <stddef.h>
-#ifndef HAVE_GNU_LD
-#define _sys_errlist sys_errlist
-#define _sys_nerr sys_nerr
-#endif
const char *const _sys_errlist[] =
{
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c b/sysdeps/generic/fchownat.c
index 934c4c8cf8..f6921c9012 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
+++ b/sysdeps/generic/fchownat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -17,34 +17,35 @@
02111-1307 USA. */
#include <errno.h>
-#include <termios.h>
-#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/types.h>
-/* Set the state of FD to *TERMIOS_P. */
+/* Change the owner and group of FILE. */
int
-tcsetattr (fd, optional_actions, termios_p)
+fchownat (fd, file, owner, group, flag)
int fd;
- int optional_actions;
- const struct termios *termios_p;
+ const char *file;
+ uid_t owner;
+ gid_t group;
+ int flag;
{
- unsigned long cmd;
-
- switch (optional_actions)
+ if (file == NULL || (flag & ~AT_SYMLINK_NOFOLLOW) != 0)
{
- case TCSANOW:
- cmd = TCSETS;
- break;
- case TCSADRAIN:
- cmd = TCSETSW;
- break;
- case TCSAFLUSH:
- cmd = TCSETSF;
- break;
- default:
__set_errno (EINVAL);
return -1;
}
- return __ioctl (fd, cmd, termios_p);
+ if (fd < 0 && fd != AT_FDCWD)
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
}
-libc_hidden_def (tcsetattr)
+stub_warning (fchownat)
+
+#include <stub-tag.h>
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcflush.c b/sysdeps/generic/futimesat.c
index 9e78aadd07..33d170862a 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcflush.c
+++ b/sysdeps/generic/futimesat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -17,14 +17,36 @@
02111-1307 USA. */
#include <errno.h>
-#include <termios.h>
-#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <sys/time.h>
-/* Flush pending data on FD. */
+
+/* Change the access time of FILE relative to FD to TVP[0] and
+ the modification time of FILE to TVP[1]. */
int
-tcflush (fd, queue_selector)
+futimesat (fd, file, tvp)
int fd;
- int queue_selector;
+ const char *file;
+ const struct timeval tvp[2];
{
- return __ioctl (fd, TCFLSH, queue_selector);
+ if (fd < 0 && fd != AT_FDCWD)
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+
+ if (file == NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
}
+
+weak_alias (__utimes, utimes)
+
+stub_warning (utimes)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/fxstatat.c b/sysdeps/generic/fxstatat.c
new file mode 100644
index 0000000000..62f7fe3efb
--- /dev/null
+++ b/sysdeps/generic/fxstatat.c
@@ -0,0 +1,49 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+/* Get information about the file descriptor FD in BUF. */
+int
+__fxstatat (int vers, int fd, const char *filename, struct stat *buf, int flag)
+{
+ if (vers != _STAT_VER)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (fd < 0 && fd != AT_FDCWD)
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+ if (buf == NULL || (flag & ~AT_SYMLINK_NOFOLLOW) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (fstatat)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/fxstatat64.c b/sysdeps/generic/fxstatat64.c
new file mode 100644
index 0000000000..ba95b73e81
--- /dev/null
+++ b/sysdeps/generic/fxstatat64.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+/* Get information about the file descriptor FD in BUF. */
+int
+__fxstatat64 (int vers, int fd, const char *filename, struct stat64 *buf,
+ int flag)
+{
+ if (vers != _STAT_VER)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (fd < 0 && fd != AT_FDCWD)
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+ if (buf == NULL || (flag & ~AT_SYMLINK_NOFOLLOW) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (fstatat64)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/getenv.c b/sysdeps/generic/getenv.c
index d659f66022..6cdfe2b266 100644
--- a/sysdeps/generic/getenv.c
+++ b/sysdeps/generic/getenv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,94,96,98,99,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,94,96,98,99,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -23,9 +23,6 @@
#include <string.h>
#include <unistd.h>
-#ifndef HAVE_GNU_LD
-#define __environ environ
-#endif
/* Return the value of the environment variable NAME. This implementation
is tuned a bit in that it assumes no environment variable has an empty
diff --git a/sysdeps/generic/getgroups.c b/sysdeps/generic/getgroups.c
index d9970f0e6d..d5868cc1b8 100644
--- a/sysdeps/generic/getgroups.c
+++ b/sysdeps/generic/getgroups.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1995,1996,1997,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -40,7 +40,7 @@ __getgroups (size, list)
return -1;
}
-#if defined (HAVE_GNU_LD) && !(defined (NGROUPS_MAX) && NGROUPS_MAX == 0)
+#if !(defined (NGROUPS_MAX) && NGROUPS_MAX == 0)
stub_warning (getgroups);
#endif
diff --git a/sysdeps/generic/init-posix.c b/sysdeps/generic/init-posix.c
index ae9e1075d1..0c2b717e6d 100644
--- a/sysdeps/generic/init-posix.c
+++ b/sysdeps/generic/init-posix.c
@@ -1,27 +1 @@
-/* Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef HAVE_GNU_LD
-
-void
-__init_posix (void)
-{
- return;
-}
-
-#endif
+/* Nothing to do. */
diff --git a/sysdeps/generic/libc-tls.c b/sysdeps/generic/libc-tls.c
index bfb6de0f73..3544e396da 100644
--- a/sysdeps/generic/libc-tls.c
+++ b/sysdeps/generic/libc-tls.c
@@ -60,8 +60,9 @@ bool _dl_tls_dtv_gaps;
struct dtv_slotinfo_list *_dl_tls_dtv_slotinfo_list;
/* Number of modules in the static TLS block. */
size_t _dl_tls_static_nelem;
-/* Size of the static TLS block. */
-size_t _dl_tls_static_size;
+/* Size of the static TLS block. Giving this initialized value
+ preallocates some surplus bytes in the static TLS area. */
+size_t _dl_tls_static_size = 2048;
/* Size actually allocated in the static TLS block. */
size_t _dl_tls_static_used;
/* Alignment requirement of the static TLS block. */
diff --git a/sysdeps/generic/openat.c b/sysdeps/generic/openat.c
new file mode 100644
index 0000000000..f3f699ca23
--- /dev/null
+++ b/sysdeps/generic/openat.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+/* Open FILE with access OFLAG. Interpret relative paths relative to
+ the directory associated with FD. If OFLAG includes O_CREAT, a
+ third argument is the file protection. */
+int
+openat (fd, file, oflag)
+ int fd;
+ const char *file;
+ int oflag;
+{
+ int mode;
+
+ if (file == NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ /* Check FD is associated with a directory. */
+ struct stat64 st;
+ if (__fxstat64 (_STAT_VER, fd, &st) != 0)
+ return -1;
+
+ if (!S_ISDIR (st.st_mode))
+ {
+ __set_errno (ENOTDIR);
+ return -1;
+ }
+ }
+
+ if (oflag & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, oflag);
+ mode = va_arg (arg, int);
+ va_end (arg);
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (openat)
+
+#include <stub-tag.h>
diff --git a/sysdeps/generic/openat64.c b/sysdeps/generic/openat64.c
new file mode 100644
index 0000000000..87952d38d6
--- /dev/null
+++ b/sysdeps/generic/openat64.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+/* Open FILE with access OFLAG. Interpret relative paths relative to
+ the directory associated with FD. If OFLAG includes O_CREAT, a
+ third argument is the file protection. */
+int
+openat64 (fd, file, oflag)
+ int fd;
+ const char *file;
+ int oflag;
+{
+ int mode;
+
+ if (file == NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ /* Check FD is associated with a directory. */
+ struct stat64 st;
+ if (__fxstat64 (_STAT_VER, fd, &st) != 0)
+ return -1;
+
+ if (!S_ISDIR (st.st_mode))
+ {
+ __set_errno (ENOTDIR);
+ return -1;
+ }
+ }
+
+ if (oflag & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, oflag);
+ mode = va_arg (arg, int);
+ va_end (arg);
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (openat64)
+
+#include <stub-tag.h>
diff --git a/sysdeps/generic/renameat.c b/sysdeps/generic/renameat.c
new file mode 100644
index 0000000000..e8629098df
--- /dev/null
+++ b/sysdeps/generic/renameat.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+
+/* Rename the file OLD relative to OLDFD to NEW relative to NEWFD. */
+int
+renameat (oldfd, old, newfd, new)
+ int oldfd;
+ const char *old;
+ int newfd;
+ const char *new;
+{
+ if ((oldfd < 0 & oldfd !_ AT_FDCWD) || (newfd < 0 && newfd != AT_FDCWD))
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+
+ if (old == NULL || new == NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
+}
+
+
+stub_warning (renameat)
+#include <stub-tag.h>
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcgetattr.c b/sysdeps/generic/unlinkat.c
index ab74fddf24..f9a08b9903 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcgetattr.c
+++ b/sysdeps/generic/unlinkat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -17,17 +17,33 @@
02111-1307 USA. */
#include <errno.h>
+#include <fcntl.h>
#include <stddef.h>
-#include <termios.h>
-#include <sys/ioctl.h>
+#include <unistd.h>
-/* Put the state of FD into *TERMIOS_P. */
+
+/* Remove the link named NAME. */
int
-__tcgetattr (fd, termios_p)
+unlinkat (fd, name, flag)
int fd;
- struct termios *termios_p;
+ const char *name;
+ int flag;
{
- return __ioctl (fd, TCGETS, termios_p);
+ if (name == NULL || (flag & AT_REMOVEDIR) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (fd < 0 && fd != AT_FDCWD)
+ {
+ __set_errno (EBADF);
+ return -1;
+ }
+
+ __set_errno (ENOSYS);
+ return -1;
}
+stub_warning (unlinkat)
-weak_alias (__tcgetattr, tcgetattr)
+#include <stub-tag.h>
diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure
index ecba16645b..d1d4dc15a7 100755
--- a/sysdeps/i386/configure
+++ b/sysdeps/i386/configure
@@ -52,6 +52,3 @@ if test $libc_cv_cpp_asm_debuginfo = yes; then
_ACEOF
fi
-
-# Tell top-level configure to try -mtune=i386.
-libc_mtune_example=i386
diff --git a/sysdeps/i386/configure.in b/sysdeps/i386/configure.in
index 93b62b671c..028e1ae8e1 100644
--- a/sysdeps/i386/configure.in
+++ b/sysdeps/i386/configure.in
@@ -33,6 +33,3 @@ rm -f conftest*])AC_SUBST(libc_cv_cpp_asm_debuginfo)
if test $libc_cv_cpp_asm_debuginfo = yes; then
AC_DEFINE(HAVE_CPP_ASM_DEBUGINFO)
fi
-
-# Tell top-level configure to try -mtune=i386.
-libc_mtune_example=i386
diff --git a/sysdeps/ia64/elf/initfini.c b/sysdeps/ia64/elf/initfini.c
index 3aa44de8f1..d0a65ece80 100644
--- a/sysdeps/ia64/elf/initfini.c
+++ b/sysdeps/ia64/elf/initfini.c
@@ -1,5 +1,5 @@
/* Special .init and .fini section support for ia64.
- Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -51,7 +51,6 @@ __asm__ ("\n\n"
"\n"
"/*@_init_PROLOG_BEGINS*/\n");
-#ifdef HAVE_INITFINI_ARRAY
/* If we have working .init_array support, we want to keep the .init
section empty (apart from the mandatory prologue/epilogue. This
@@ -75,7 +74,6 @@ gmon_initializer (void)
__asm__ (".section .init_array, \"aw\"\n"
"\tdata8 @fptr(gmon_initializer)\n");
-#endif
__asm__ (".section .init\n"
" .global _init#\n"
@@ -90,27 +88,7 @@ __asm__ (".section .init\n"
" mov r33 = b0\n"
" .body\n"
" adds r12 = -16, r12\n"
-#ifdef HAVE_INITFINI_ARRAY
" ;;\n" /* see gmon_initializer() above */
-#else
-" .weak __gmon_start__#\n"
-" addl r14 = @ltoff(@fptr(__gmon_start__#)), gp\n"
-" ;;\n"
-" ld8 r15 = [r14]\n"
-" ;;\n"
-" cmp.eq p6, p7 = 0, r15\n"
-" (p6) br.cond.dptk .L5\n"
-"\n"
-"/* we could use r35 to save gp, but we use the stack since that's what\n"
-" * all the other init routines will do --davidm 00/04/05 */\n"
-" st8 [r12] = gp, -16\n"
-" br.call.sptk.many b0 = __gmon_start__# ;;\n"
-" adds r12 = 16, r12\n"
-" ;;\n"
-" ld8 gp = [r12]\n"
-" ;;\n"
-".L5:\n"
-#endif
" .endp _init#\n"
"\n"
"/*@_init_PROLOG_ENDS*/\n"
diff --git a/sysdeps/ia64/fpu/libm-symbols.h b/sysdeps/ia64/fpu/libm-symbols.h
index 3d0eb37d2a..5b5e4b7d7b 100644
--- a/sysdeps/ia64/fpu/libm-symbols.h
+++ b/sysdeps/ia64/fpu/libm-symbols.h
@@ -39,13 +39,13 @@
#define WEAK_LIBM_ENTRY(name) \
.align 32; \
- LOCAL_LIBM_ENTRY(name); \
+ LOCAL_LIBM_ENTRY(__##name); \
.global __##name; \
__##name:
#define WEAK_LIBM_END(name) \
weak_alias (__##name, name); \
.hidden __##name; \
- LOCAL_LIBM_END(name); \
+ LOCAL_LIBM_END(__##name); \
ASM_SIZE_DIRECTIVE(__##name); \
ASM_TYPE_DIRECTIVE(__##name, @function)
diff --git a/sysdeps/mach/hurd/bits/stat.h b/sysdeps/mach/hurd/bits/stat.h
index 172bc5ea8e..c3f96660cc 100644
--- a/sysdeps/mach/hurd/bits/stat.h
+++ b/sysdeps/mach/hurd/bits/stat.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 93, 94, 96, 97, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,96,97,99,2000,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -182,8 +182,11 @@ struct stat64
/* All the bits relevant to translators */
#define S_ITRANS 000070000000
+/* Definitely no mmaps to this. */
+#define S_IMMAP0 000100000000
+
/* ALL the unused bits. */
-#define S_ISPARE (~(S_IFMT|S_ITRANS|S_INOCACHE| \
+#define S_ISPARE (~(S_IFMT|S_ITRANS|S_INOCACHE|S_IMMAP0| \
S_IUSEUNK|S_IUNKNOWN|07777))
#endif
diff --git a/sysdeps/mach/hurd/getpeername.c b/sysdeps/mach/hurd/getpeername.c
index 39071c1da4..325b6fd75d 100644
--- a/sysdeps/mach/hurd/getpeername.c
+++ b/sysdeps/mach/hurd/getpeername.c
@@ -55,11 +55,14 @@ __getpeername (int fd, __SOCKADDR_ARG addrarg, socklen_t *len)
}
const sa_family_t family = type;
- if (*len < (char *) (&addr->sa_family + 1) - (char *) addr)
- memcpy (&addr->sa_family, &family,
- *len - offsetof (struct sockaddr, sa_family));
- else
- addr->sa_family = family;
+ if (*len > offsetof (struct sockaddr, sa_family))
+ {
+ if (*len < (char *) (&addr->sa_family + 1) - (char *) addr)
+ memcpy (&addr->sa_family, &family,
+ *len - offsetof (struct sockaddr, sa_family));
+ else
+ addr->sa_family = family;
+ }
return 0;
}
diff --git a/sysdeps/mach/hurd/ioctl.c b/sysdeps/mach/hurd/ioctl.c
index 3d590d5845..6a540241a4 100644
--- a/sysdeps/mach/hurd/ioctl.c
+++ b/sysdeps/mach/hurd/ioctl.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992,93,94,95,96,97,99,2000,02 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,96,97,99,2000,2002,2005
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -136,9 +137,11 @@ __ioctl (int fd, unsigned long int request, ...)
Rather than pointing to the value, ARG is the value itself. */
#ifdef MACH_MSG_TYPE_BIT
*t++ = io2mach_type (1, _IOTS (integer_t));
- *((integer_t *) t)++ = (integer_t) arg;
+ *(integer_t *) t = (integer_t) arg;
+ t = (void *) t + sizeof (integer_t);
#else
- *((integer_t *) p)++ = (integer_t) arg;
+ *(integer_t *) p = (integer_t) arg;
+ p = (void *) p + sizeof (integer_t);
#endif
}
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 934aae009c..81a56a0794 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -568,12 +568,14 @@ gaih_inet (const char *name, const struct gaih_service *service,
if (at->family == AF_UNSPEC)
{
- char *namebuf = strdupa (name);
- char *scope_delim;
+ char *namebuf = (char *) name;
+ char *scope_delim = strchr (name, SCOPE_DELIMITER);
- scope_delim = strchr (namebuf, SCOPE_DELIMITER);
- if (scope_delim != NULL)
- *scope_delim = '\0';
+ if (__builtin_expect (scope_delim != NULL, 0))
+ {
+ namebuf = alloca (scope_delim - name + 1);
+ *((char *) __mempcpy (namebuf, name, scope_delim - name)) = '\0';
+ }
if (inet_pton (AF_INET6, namebuf, at->addr) > 0)
{
@@ -629,7 +631,10 @@ gaih_inet (const char *name, const struct gaih_service *service,
/* If we do not have to look for IPv4 and IPv6 together, use
the simple, old functions. */
- if (req->ai_family == AF_INET || req->ai_family == AF_INET6)
+ if (req->ai_family == AF_INET
+ || (req->ai_family == AF_INET6
+ && ((req->ai_flags & AI_V4MAPPED) == 0
+ || (req->ai_flags & AI_ALL) == 0)))
{
int family = req->ai_family;
size_t tmpbuflen = 512;
@@ -888,8 +893,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
AF_INET6. Try to find a useful one for both. */
if (inet6_status == NSS_STATUS_TRYAGAIN)
status = NSS_STATUS_TRYAGAIN;
- else if (status == NSS_STATUS_UNAVAIL &&
- inet6_status != NSS_STATUS_UNAVAIL)
+ else if (status == NSS_STATUS_UNAVAIL
+ && inet6_status != NSS_STATUS_UNAVAIL)
status = inet6_status;
}
@@ -1039,9 +1044,9 @@ gaih_inet (const char *name, const struct gaih_service *service,
}
}
- if (at2->family == AF_INET6)
+ family = at2->family;
+ if (family == AF_INET6)
{
- family = AF_INET6;
socklen = sizeof (struct sockaddr_in6);
/* If we looked up IPv4 mapped address discard them here if
@@ -1053,10 +1058,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
goto ignore;
}
else
- {
- family = AF_INET;
- socklen = sizeof (struct sockaddr_in);
- }
+ socklen = sizeof (struct sockaddr_in);
for (st2 = st; st2 != NULL; st2 = st2->next)
{
diff --git a/sysdeps/posix/gettimeofday.c b/sysdeps/posix/gettimeofday.c
index 28f75b0bcc..bda40f48ec 100644
--- a/sysdeps/posix/gettimeofday.c
+++ b/sysdeps/posix/gettimeofday.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 94, 95, 96, 97, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1994-1997,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,12 +20,6 @@
#include <time.h>
#include <sys/time.h>
-#ifndef HAVE_GNU_LD
-#define __daylight daylight
-#define __timezone timezone
-#define __tzname tzname
-#endif
-
#undef __gettimeofday
/* Get the current time of day and timezone information,
diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c
index 8548313314..f63dde4dae 100644
--- a/sysdeps/posix/system.c
+++ b/sysdeps/posix/system.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2000, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2000, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -27,10 +27,6 @@
#include <sysdep-cancel.h>
-#ifndef HAVE_GNU_LD
-#define __environ environ
-#endif
-
#define SHELL_PATH "/bin/sh" /* Path of the shell. */
#define SHELL_NAME "sh" /* Name to give it. */
diff --git a/sysdeps/powerpc/powerpc64/Makefile b/sysdeps/powerpc/powerpc64/Makefile
index cf29148ff3..cf7c4337e0 100644
--- a/sysdeps/powerpc/powerpc64/Makefile
+++ b/sysdeps/powerpc/powerpc64/Makefile
@@ -11,6 +11,8 @@ pic-ccflag = -fpic
endif
ifeq ($(subdir),csu)
+sysdep_routines += hp-timing
+elide-routines.os += hp-timing
ifneq ($(elf),no)
# The initfini generation code doesn't work in the presence of -fPIC, so
# we use -fpic instead which is much better.
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcflow.c b/sysdeps/powerpc/powerpc64/hp-timing.c
index 6fcc606f61..4e54e66e5e 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcflow.c
+++ b/sysdeps/powerpc/powerpc64/hp-timing.c
@@ -1,5 +1,8 @@
-/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
+/* Support for high precision, low overhead timing functions.
+ powerpc64 version.
+ Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -16,15 +19,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <errno.h>
-#include <termios.h>
-#include <sys/ioctl.h>
+#include <hp-timing.h>
-/* Suspend or restart transmission on FD. */
-int
-tcflow (fd, action)
- int fd;
- int action;
-{
- return __ioctl (fd, TCXONC, action);
-}
+/* We have to define the variable for the overhead. */
+hp_timing_t _dl_hp_timing_overhead;
diff --git a/sysdeps/powerpc/powerpc64/hp-timing.h b/sysdeps/powerpc/powerpc64/hp-timing.h
new file mode 100644
index 0000000000..b58cca9003
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/hp-timing.h
@@ -0,0 +1,136 @@
+/* High precision, low overhead timing functions. powerpc64 version.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _HP_TIMING_H
+#define _HP_TIMING_H 1
+
+#include <string.h>
+#include <sys/param.h>
+#include <stdio-common/_itoa.h>
+#include <atomic.h>
+
+/* The macros defined here use the powerpc 64-bit time base register.
+ The time base is nominally clocked at 1/8th the CPU clock, but this
+ can vary.
+
+ The list of macros we need includes the following:
+
+ - HP_TIMING_AVAIL: test for availability.
+
+ - HP_TIMING_INLINE: this macro is non-zero if the functionality is not
+ implemented using function calls but instead uses some inlined code
+ which might simply consist of a few assembler instructions. We have to
+ know this since we might want to use the macros here in places where we
+ cannot make function calls.
+
+ - hp_timing_t: This is the type for variables used to store the time
+ values.
+
+ - HP_TIMING_ZERO: clear `hp_timing_t' object.
+
+ - HP_TIMING_NOW: place timestamp for current time in variable given as
+ parameter.
+
+ - HP_TIMING_DIFF_INIT: do whatever is necessary to be able to use the
+ HP_TIMING_DIFF macro.
+
+ - HP_TIMING_DIFF: compute difference between two times and store it
+ in a third. Source and destination might overlap.
+
+ - HP_TIMING_ACCUM: add time difference to another variable. This might
+ be a bit more complicated to implement for some platforms as the
+ operation should be thread-safe and 64bit arithmetic on 32bit platforms
+ is not.
+
+ - HP_TIMING_ACCUM_NT: this is the variant for situations where we know
+ there are no threads involved.
+
+ - HP_TIMING_PRINT: write decimal representation of the timing value into
+ the given string. This operation need not be inline even though
+ HP_TIMING_INLINE is specified.
+
+*/
+
+/* We always assume having the timestamp register. */
+#define HP_TIMING_AVAIL (1)
+
+/* We indeed have inlined functions. */
+#define HP_TIMING_INLINE (1)
+
+/* We use 64bit values for the times. */
+typedef unsigned long long int hp_timing_t;
+
+/* Set timestamp value to zero. */
+#define HP_TIMING_ZERO(Var) (Var) = (0)
+
+/* That's quite simple. Use the `mftb' instruction. Note that the value
+ might not be 100% accurate since there might be some more instructions
+ running in this moment. This could be changed by using a barrier like
+ 'lwsync' right before the `mftb' instruciton. But we are not interested
+ in accurate clock cycles here so we don't do this. */
+#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mftb %0" : "=r" (Var))
+
+/* Use two 'mftb' instructions in a row to find out how long it takes.
+ On current POWER4, POWER5, and 970 processors mftb take ~10 cycles. */
+#define HP_TIMING_DIFF_INIT() \
+ do { \
+ if (GLRO(dl_hp_timing_overhead) == 0) \
+ { \
+ int __cnt = 5; \
+ GLRO(dl_hp_timing_overhead) = ~0ull; \
+ do \
+ { \
+ hp_timing_t __t1, __t2; \
+ HP_TIMING_NOW (__t1); \
+ HP_TIMING_NOW (__t2); \
+ if (__t2 - __t1 < GLRO(dl_hp_timing_overhead)) \
+ GLRO(dl_hp_timing_overhead) = __t2 - __t1; \
+ } \
+ while (--__cnt > 0); \
+ } \
+ } while (0)
+
+/* It's simple arithmetic in 64-bit. */
+#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
+
+/* We need to insure that this add is atomic in threaded environments. We use
+ __arch_atomic_exchange_and_add_64 from atomic.h to get thread safety. */
+#define HP_TIMING_ACCUM(Sum, Diff) \
+ do { \
+ hp_timing_t __diff = (Diff) - GLRO(dl_hp_timing_overhead); \
+ __arch_atomic_exchange_and_add_64 (&(Sum), __diff); \
+ } while (0)
+
+/* No threads, no extra work. */
+#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
+
+/* Print the time value. */
+#define HP_TIMING_PRINT(Buf, Len, Val) \
+ do { \
+ char __buf[20]; \
+ char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
+ size_t __len = (Len); \
+ char *__dest = (Buf); \
+ while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
+ *__dest++ = *__cp++; \
+ memcpy (__dest, " ticks", MIN (__len, sizeof (" ticks"))); \
+ } while (0)
+
+#endif /* hp-timing.h */
diff --git a/sysdeps/pthread/configure b/sysdeps/pthread/configure
index 229414dd74..e39d31138d 100644
--- a/sysdeps/pthread/configure
+++ b/sysdeps/pthread/configure
@@ -1,3 +1,3 @@
-# Local configure fragment for sysdeps/unix/sysv/linux.
+# Local configure fragment for sysdeps/pthread.
DEFINES="$DEFINES -D_LIBC_REENTRANT"
diff --git a/sysdeps/unix/bsd/init-posix.c b/sysdeps/unix/bsd/init-posix.c
index 06f727684f..b5ea8846f7 100644
--- a/sysdeps/unix/bsd/init-posix.c
+++ b/sysdeps/unix/bsd/init-posix.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 94, 95, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 94, 95, 97, 98, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -30,6 +30,4 @@ __init_posix (void)
_posix_start_time = time ((time_t *) NULL);
}
-#ifdef HAVE_GNU_LD
text_set_element(__libc_subinit, __init_posix);
-#endif
diff --git a/sysdeps/unix/bsd/sun/Dist b/sysdeps/unix/bsd/sun/Dist
deleted file mode 100644
index ccd3a610ee..0000000000
--- a/sysdeps/unix/bsd/sun/Dist
+++ /dev/null
@@ -1 +0,0 @@
-m68k/dl-brk.S
diff --git a/sysdeps/unix/bsd/sun/bits/signum.h b/sysdeps/unix/bsd/sun/bits/signum.h
deleted file mode 100644
index c13e7cd742..0000000000
--- a/sysdeps/unix/bsd/sun/bits/signum.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Signal number definitions. SunOS version.
- Copyright (C) 1994, 1996 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifdef _SIGNAL_H
-
-/* This file defines the fake signal functions and signal
- number constants for SunOS 3 and 4 Unix systems. */
-
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-
-/* Signals. */
-#define SIGHUP 1 /* Hangup (POSIX). */
-#define SIGINT 2 /* Interrupt (ANSI). */
-#define SIGQUIT 3 /* Quit (POSIX). */
-#define SIGILL 4 /* Illegal instruction (ANSI). */
-#define SIGABRT SIGIOT /* Abort (ANSI). */
-#define SIGTRAP 5 /* Trace trap (POSIX). */
-#define SIGIOT 6 /* IOT trap (4.2 BSD). */
-#define SIGEMT 7 /* EMT trap (4.2 BSD). */
-#define SIGFPE 8 /* Floating-point exception (ANSI). */
-#define SIGKILL 9 /* Kill, unblockable (POSIX). */
-#define SIGBUS 10 /* Bus error (4.2 BSD). */
-#define SIGSEGV 11 /* Segmentation violation (ANSI). */
-#define SIGSYS 12 /* Bad argument to system call (4.2 BSD). */
-#define SIGPIPE 13 /* Broken pipe (POSIX). */
-#define SIGALRM 14 /* Alarm clock (POSIX). */
-#define SIGTERM 15 /* Termination (ANSI). */
-#define SIGURG 16 /* Urgent condition on socket (4.2 BSD). */
-#define SIGSTOP 17 /* Stop, unblockable (POSIX). */
-#define SIGTSTP 18 /* Keyboard stop (POSIX). */
-#define SIGCONT 19 /* Continue (POSIX). */
-#define SIGCHLD 20 /* Child status has changed (POSIX). */
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGTTIN 21 /* Background read from tty (POSIX). */
-#define SIGTTOU 22 /* Background write to tty (POSIX). */
-#define SIGIO 23 /* I/O now possible (4.2 BSD). */
-#define SIGPOLL SIGIO /* Same as SIGIO? (SVID). */
-#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
-#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
-#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
-#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
-#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
-#define SIGLOST 29 /* Resource lost (Sun). */
-#define SIGUSR1 30 /* User-defined signal 1 (POSIX). */
-#define SIGUSR2 31 /* User-defined signal 2 (POSIX). */
-
-#endif /* <signal.h> included. */
-
-#define _NSIG 32 /* Biggest signal number + 1. */
diff --git a/sysdeps/unix/bsd/sun/m68k/Dist b/sysdeps/unix/bsd/sun/m68k/Dist
deleted file mode 100644
index cd893ff463..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/Dist
+++ /dev/null
@@ -1 +0,0 @@
-sigtramp.c
diff --git a/sysdeps/unix/bsd/sun/m68k/Makefile b/sysdeps/unix/bsd/sun/m68k/Makefile
deleted file mode 100644
index ac4121dc2c..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),signal)
-sysdep_routines := $(sysdep_routines) sigtramp
-endif
diff --git a/sysdeps/unix/bsd/sun/m68k/bits/sigcontext.h b/sysdeps/unix/bsd/sun/m68k/bits/sigcontext.h
deleted file mode 100644
index 99a0506a8d..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/bits/sigcontext.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Structure describing state saved while handling a signal. Sun 3 version.
- Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _SIGNAL_H
-# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
-#endif
-
-struct sigcontext
- {
- int sc_onstack;
- __sigset_t sc_mask;
-
- int sc_sp, sc_pc, sc_ps;
- };
diff --git a/sysdeps/unix/bsd/sun/m68k/brk.S b/sysdeps/unix/bsd/sun/m68k/brk.S
deleted file mode 100644
index 07af96d23c..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/brk.S
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#ifndef SYS_brk
-#define SYS_brk 17
-#endif
-
-#ifndef HAVE_GNU_LD
-#define __end _end
-#endif
-
-.data
-.globl ___curbrk
-___curbrk:
- .long __end
-
-.text
-ENTRY (__brk)
- movel #__end, d0
- cmpl sp@(4), d0
- ble 0f
- movel d0, sp@(4)
-0: pea SYS_brk
- trap #0
- bcs 1f
- movel sp@(4), ___curbrk
- clrl d0
- rts
-1:
- jmp syscall_error
-
-weak_alias (__brk, brk)
diff --git a/sysdeps/unix/bsd/sun/m68k/dl-brk.S b/sysdeps/unix/bsd/sun/m68k/dl-brk.S
deleted file mode 100644
index eeb96544e3..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/dl-brk.S
+++ /dev/null
@@ -1 +0,0 @@
-#include <brk.S>
diff --git a/sysdeps/unix/bsd/sun/m68k/sethostid.S b/sysdeps/unix/bsd/sun/m68k/sethostid.S
deleted file mode 100644
index 73ee79682e..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/sethostid.S
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#ifdef SYS_sethostid
-
-SYSCALL (sethostid, 1)
- ret
-
-#else
-
-#include <bits/errno.h>
-
-.globl _sethostid
-.even
-_sethostid:
- movel #ENOSYS, _errno
- moveq #-1, d0
- rts
-
-#ifdef HAVE_GNU_LD
-
-.stabs "warning: sethostid is not implemented and will always fail",30,0,0,0
-.stabs "_sethostid",1,0,0,0
-
-#endif
-
-#endif
diff --git a/sysdeps/unix/bsd/sun/m68k/sigtramp.c b/sysdeps/unix/bsd/sun/m68k/sigtramp.c
deleted file mode 100644
index 5a3ca3cf10..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/sigtramp.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Copyright (C) 1993, 1996, 1997, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef __GNUC__
- #error This file uses GNU C extensions; you must compile with GCC.
-#endif
-
-/* Get the definition of `struct sigcontext'. */
-#define KERNEL
-#define sigvec sun_sigvec
-#define sigstack sun_sigstack
-#define sigcontext sun_sigcontext
-#include "/usr/include/sys/signal.h"
-#undef sigvec
-#undef sigstack
-#undef sigcontext
-#undef NSIG
-#undef SIGABRT
-#undef SIGCLD
-#undef SV_ONSTACK
-#undef SV_RESETHAND
-#undef SV_INTERRUPT
-#undef SA_ONSTACK
-#undef SA_NOCLDSTOP
-#undef SIG_ERR
-#undef SIG_DFL
-#undef SIG_IGN
-#undef sigmask
-#undef SIG_BLOCK
-#undef SIG_UNBLOCK
-#undef SIG_SETMASK
-
-#include <signal.h>
-#include <stddef.h>
-#include <errno.h>
-
-/* Defined in __sigvec.S. */
-extern int __raw_sigvec (int sig, const struct sigvec *vec,
- struct sigvec *ovec);
-
-/* User-specified signal handlers. */
-#define mytramp 1
-#ifdef mytramp
-static __sighandler_t handlers[NSIG];
-#else
-#define handlers _sigfunc
-extern __sighandler_t _sigfunc[];
-#endif
-
-#if mytramp
-
-/* Handler for all signals that are handled by a user-specified function.
- Saves and restores the general regs %g2-%g7, the %y register, and
- all the FPU regs (including %fsr), around calling the user's handler. */
-static void
-trampoline (sig, code, context, addr)
- int sig;
- int code;
- struct sigcontext *context;
- void *addr;
-{
- int save[4];
-
- /* Save the call-clobbered registers. */
- asm volatile ("movem%.l d0-d1/a0-a1, %0" : : "m" (save[0]));
-
- /* XXX should save/restore FP regs */
-
- /* Call the user's handler. */
- (*((void (*) (int sig, int code, struct sigcontext *context,
- PTR addr)) handlers[sig]))
- (sig, code, context, addr);
-
- /* Restore the call-clobbered registers. */
- asm volatile ("movem%.l %0, d0-d1/a0-a1" : : "g" (save[0]) :
- "d0", "d1", "a0", "a1");
-
- __sigreturn (context);
-}
-
-#endif
-
-int
-__sigvec (sig, vec, ovec)
- int sig;
- const struct sigvec *vec;
- struct sigvec *ovec;
-{
-#ifndef mytramp
- extern void _sigtramp (int);
-#define trampoline _sigtramp
-#endif
- struct sigvec myvec;
- int mask;
- __sighandler_t ohandler;
-
- if (sig <= 0 || sig >= NSIG)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- mask = __sigblock(sigmask(sig));
-
- ohandler = handlers[sig];
-
- if (vec != NULL &&
- vec->sv_handler != SIG_IGN && vec->sv_handler != SIG_DFL)
- {
- handlers[sig] = vec->sv_handler;
- myvec = *vec;
- myvec.sv_handler = trampoline;
- vec = &myvec;
- }
-
- if (__raw_sigvec(sig, vec, ovec) < 0)
- {
- int save = errno;
- (void) __sigsetmask(mask);
- errno = save;
- return -1;
- }
-
- if (ovec != NULL && ovec->sv_handler == trampoline)
- ovec->sv_handler = ohandler;
-
- (void) __sigsetmask(mask);
-
- return 0;
-}
diff --git a/sysdeps/unix/bsd/sun/m68k/syscall.S b/sysdeps/unix/bsd/sun/m68k/syscall.S
deleted file mode 100644
index 1d4d5be42f..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/syscall.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-ENTRY (syscall)
- movel sp@, d0 /* Save return address in D0. */
- movel sp@(4), sp@ /* Put syscall number at top of stack. */
- movel d0, sp@(4) /* Put return address under it. */
- trap #0 /* Do syscall; pops number from stack. */
- jcs error
- ret
-error: jmp syscall_error
diff --git a/sysdeps/unix/bsd/sun/m68k/sysdep.h b/sysdeps/unix/bsd/sun/m68k/sysdep.h
deleted file mode 100644
index e51ab0a8e4..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/sysdep.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdeps/unix/sysdep.h>
-
-#ifdef __ASSEMBLER__
-
-#define POUND #
-
-#ifdef __STDC__
-#define ENTRY(name) \
- .globl _##name; \
- .even; \
- _##name##:
-#else
-#define ENTRY(name) \
- .globl _/**/name; \
- .even; \
- _/**/name/**/:
-#endif
-
-#ifdef __STDC__
-#define PSEUDO(name, syscall_name, args) \
- .even; \
- .globl syscall_error; \
- error: jmp syscall_error; \
- ENTRY (name) \
- pea SYS_##syscall_name; \
- trap POUND 0; \
- bcs error
-#else
-#define PSEUDO(name, syscall_name, args) \
- .even; \
- .globl syscall_error; \
- error: jmp syscall_error; \
- ENTRY (name) \
- pea SYS_/**/syscall_name; \
- trap POUND 0; \
- bcs error
-#endif
-
-#define ret rts
-#define r0 d0
-#define r1 d1
-#define MOVE(x,y) movel x , y
-
-#endif /* __ASSEMBLER__ */
diff --git a/sysdeps/unix/bsd/sun/m68k/vfork.S b/sysdeps/unix/bsd/sun/m68k/vfork.S
deleted file mode 100644
index cf9e2e9e1a..0000000000
--- a/sysdeps/unix/bsd/sun/m68k/vfork.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 97, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#ifndef SYS_vfork
-#define SYS_vfork 66
-#endif
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-.globl ___vfork
-___vfork:
- /* Pop the return PC value into A0. */
- movel sp@+, a0
-
- /* Push the syscall number and trap into the kernel. */
- movel #SYS_vfork, sp@-
- trap #0
- bcs error /* Branch forward if it failed. */
-
- /* It succeeded. See which fork we're in. D1 is now 0 for the
- parent and 1 for the child. Decrement it to make it -1 (all
- bits set) for the parent, and 0 (no bits set) for the child.
- Then AND it with D0, so the parent gets D0&-1==R0, and the child
- gets D0&0==0. */
- subql #1, d1
- andl d1, d0
-
- /* Jump to the return PC. */
- jmp a0@
-
-error:
- movel d0, _errno
- moveq #-1, d0
- jmp a0@
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/sysdeps/unix/bsd/sun/sethostid.c b/sysdeps/unix/bsd/sun/sethostid.c
deleted file mode 100644
index aeb2940f42..0000000000
--- a/sysdeps/unix/bsd/sun/sethostid.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/generic/sethostid.c>
diff --git a/sysdeps/unix/bsd/sun/sigreturn.S b/sysdeps/unix/bsd/sun/sigreturn.S
deleted file mode 100644
index a3ea8e3fae..0000000000
--- a/sysdeps/unix/bsd/sun/sigreturn.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#ifndef SYS_sigreturn
-#define SYS_sigreturn 139
-#endif
-
-SYSCALL__ (sigreturn, 1)
- /* Does not return. */
-
-weak_alias (__sigreturn, sigreturn)
diff --git a/sysdeps/unix/bsd/sun/sparc/Dist b/sysdeps/unix/bsd/sun/sparc/Dist
deleted file mode 100644
index cd893ff463..0000000000
--- a/sysdeps/unix/bsd/sun/sparc/Dist
+++ /dev/null
@@ -1 +0,0 @@
-sigtramp.c
diff --git a/sysdeps/unix/bsd/sun/sparc/Makefile b/sysdeps/unix/bsd/sun/sparc/Makefile
deleted file mode 100644
index 59d10dbdbf..0000000000
--- a/sysdeps/unix/bsd/sun/sparc/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# Basically `-e start' is magical to the Sun linker. You would think that
-# having start.o first would be enough, but you would be wrong.
-LDFLAGS := $(LDFLAGS) -Xlinker -e -Xlinker start
-
-ifeq ($(subdir),signal)
-sysdep_routines := $(sysdep_routines) sigtramp
-endif
diff --git a/sysdeps/unix/bsd/sun/sparc/bits/sigcontext.h b/sysdeps/unix/bsd/sun/sparc/bits/sigcontext.h
deleted file mode 100644
index 7c4bca6049..0000000000
--- a/sysdeps/unix/bsd/sun/sparc/bits/sigcontext.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Structure describing state saved while handling a signal. Sparc version.
- Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _SIGNAL_H
-# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
-#endif
-
-struct sigcontext
- {
- int sc_onstack;
- __sigset_t sc_mask;
-
-#define SPARC_MAXREGWINDOW 31 /* Maximum usable register windows. */
- int sc_sp, sc_pc, sc_npc, sc_psr, sc_g1, sc_o0;
- int sc_wbcnt; /* Number of outstanding windows. */
- __ptr_t sc_spbuf[SPARC_MAXREGWINDOW]; /* SP's for each window. */
- int sc_wbuf[SPARC_MAXREGWINDOW][16]; /* Saved register windows. */
- };
diff --git a/sysdeps/unix/bsd/sun/sparc/sethostid.S b/sysdeps/unix/bsd/sun/sparc/sethostid.S
deleted file mode 100644
index d07fd3800c..0000000000
--- a/sysdeps/unix/bsd/sun/sparc/sethostid.S
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#ifdef SYS_sethostid
-
-SYSCALL (sethostid, 1)
- ret
-
-#else
-
-/* <bits/errno.h> only defines E* #ifdef _ERRNO_H. */
-#define _ERRNO_H
-#include <bits/errno.h>
-
-ENTRY (sethostid)
- mov ENOSYS, %o0
- sethi %hi(_errno), %g1
- st %o0, [%g1 + %lo(_errno)]
- retl
- sub %g0, 1, %o0
-
-#ifdef HAVE_GNU_LD
-
-.stabs "warning: sethostid is not implemented and will always fail",30,0,0,0
-.stabs "_sethostid",1,0,0,0
-
-#endif
-
-#endif
diff --git a/sysdeps/unix/bsd/sun/sparc/sigtramp.c b/sysdeps/unix/bsd/sun/sparc/sigtramp.c
deleted file mode 100644
index e11f7e51d3..0000000000
--- a/sysdeps/unix/bsd/sun/sparc/sigtramp.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/* Copyright (C) 1991,1992,1994,1996,1997,2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef __GNUC__
- #error This file uses GNU C extensions; you must compile with GCC.
-#endif
-
-/* Get the definition of `struct sigcontext'. */
-#define KERNEL
-#define sigvec sun_sigvec
-#define sigstack sun_sigstack
-#define sigcontext sun_sigcontext
-#include "/usr/include/sys/signal.h"
-#undef sigvec
-#undef sigstack
-#undef sigcontext
-#undef NSIG
-#undef SIGABRT
-#undef SIGCLD
-#undef SV_ONSTACK
-#undef SV_RESETHAND
-#undef SV_INTERRUPT
-#undef SA_ONSTACK
-#undef SA_NOCLDSTOP
-#undef SIG_ERR
-#undef SIG_DFL
-#undef SIG_IGN
-#undef sigmask
-#undef SIG_BLOCK
-#undef SIG_UNBLOCK
-#undef SIG_SETMASK
-
-#include <signal.h>
-#include <stddef.h>
-#include <errno.h>
-
-/* Defined in __sigvec.S. */
-extern int __raw_sigvec (int sig, CONST struct sigvec *vec,
- struct sigvec *ovec);
-
-/* User-specified signal handlers. */
-#define mytramp 1
-#ifdef mytramp
-static __sighandler_t handlers[NSIG];
-#else
-#define handlers _sigfunc
-extern __sighandler_t _sigfunc[];
-#endif
-
-#if mytramp
-
-/* Handler for all signals that are handled by a user-specified function.
- Saves and restores the general regs %g2-%g7, the %y register, and
- all the FPU regs (including %fsr), around calling the user's handler. */
-static void
-trampoline (sig)
- int sig;
-{
- /* We use `double' and `long long int' so `std' (store doubleword) insns,
- which might be faster than single-word stores, will be generated. */
- register double f0 asm("%f0");
- register double f2 asm("%f2");
- register double f4 asm("%f4");
- register double f6 asm("%f6");
- register double f8 asm("%f8");
- register double f10 asm("%f10");
- register double f12 asm("%f12");
- register double f14 asm("%f14");
- register double f16 asm("%f16");
- register double f18 asm("%f18");
- register double f20 asm("%f20");
- register double f22 asm("%f22");
- register double f24 asm("%f24");
- register double f26 asm("%f26");
- register double f28 asm("%f28");
- register double f30 asm("%f30");
- register long long int g2 asm("%g2");
- register long long int g4 asm("%g4");
- register long long int g6 asm("%g6");
- register int *fp asm("%fp");
-
- int code;
- register struct sigcontext *context asm("%i0"); /* See end of fn. */
- void *addr;
- int y;
- double fpsave[16];
- int fsr;
- int savefpu;
- long long int glsave[3];
-
- /* SIG isn't really passed as an arg.
- The args to the signal handler are at fp[16..19]. */
- sig = fp[16];
- code = fp[17];
- context = (struct sigcontext *) fp[18];
- addr = (PTR) fp[19];
-
- /* Save the Y register. */
- asm("rd %%y, %0" : "=r" (y));
-
- /* Save the FPU regs if the FPU enable bit is set in the PSR,
- and the signal isn't an FP exception. */
- savefpu = (context->sc_psr & 0x1000) && sig != SIGFPE;
- if (savefpu)
- {
- fpsave[0] = f0;
- fpsave[1] = f2;
- fpsave[2] = f4;
- fpsave[3] = f6;
- fpsave[4] = f8;
- fpsave[5] = f10;
- fpsave[6] = f12;
- fpsave[7] = f14;
- fpsave[8] = f16;
- fpsave[9] = f18;
- fpsave[10] = f20;
- fpsave[11] = f22;
- fpsave[12] = f24;
- fpsave[13] = f26;
- fpsave[14] = f28;
- fpsave[15] = f30;
-
- /* Force it into a stack slot so the asm won't barf. Sigh. */
- (void) &fsr;
- asm("st %%fsr, %0" : "=m" (fsr));
- }
-
- /* Save the global registers (except for %g1, which is a scratch reg). */
- glsave[0] = g2;
- glsave[1] = g4;
- glsave[2] = g6;
-
- /* Call the user's handler. */
- (*((void (*) (int sig, int code, struct sigcontext *context,
- void *addr)) handlers[sig]))
- (sig, code, context, addr);
-
- /* Restore the Y register. */
- asm("mov %0, %%y" : : "r" (y));
-
- if (savefpu)
- {
- /* Restore the FPU regs. */
- f0 = fpsave[0];
- f2 = fpsave[1];
- f4 = fpsave[2];
- f6 = fpsave[3];
- f8 = fpsave[4];
- f10 = fpsave[5];
- f12 = fpsave[6];
- f14 = fpsave[7];
- f16 = fpsave[8];
- f18 = fpsave[9];
- f20 = fpsave[10];
- f22 = fpsave[11];
- f24 = fpsave[12];
- f26 = fpsave[13];
- f28 = fpsave[14];
- f30 = fpsave[15];
-
- asm("ld %0, %%fsr" : : "m" (fsr));
- }
-
- /* Restore the globals. */
- g2 = glsave[0];
- g4 = glsave[1];
- g6 = glsave[2];
-
- /* Unwind a frame, and do a "sigcleanup" system call.
- The system call apparently does a return.
- I don't know what it's for. Ask Sun. */
- asm("restore %%g0, 139, %%g1\n"
- "ta 0\n"
- "! this should be i0: %0" /* Useless insn that will never be executed, */
- /* here to make the compiler happy. */
- : /* No outputs. */ :
- /* CONTEXT is bound to %i0. We reference it as an input here to make
- sure the compiler considers it live at this point, and preserves
- the value in that register. The restore makes %i0 become %o0, the
- argument to the system call. */
- "r" (context));
-}
-#endif
-
-int
-__sigvec (sig, vec, ovec)
- int sig;
- const struct sigvec *vec;
- struct sigvec *ovec;
-{
-#ifndef mytramp
- extern void _sigtramp (int);
-#define trampoline _sigtramp
-#endif
- struct sigvec myvec;
- int mask;
- __sighandler_t ohandler;
-
- if (sig <= 0 || sig >= NSIG)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- mask = __sigblock (sigmask(sig));
-
- ohandler = handlers[sig];
-
- if (vec != NULL &&
- vec->sv_handler != SIG_IGN && vec->sv_handler != SIG_DFL)
- {
- handlers[sig] = vec->sv_handler;
- myvec = *vec;
- myvec.sv_handler = trampoline;
- vec = &myvec;
- }
-
- if (__raw_sigvec(sig, vec, ovec) < 0)
- {
- int save = errno;
- (void) __sigsetmask(mask);
- errno = save;
- return -1;
- }
-
- if (ovec != NULL && ovec->sv_handler == trampoline)
- ovec->sv_handler = ohandler;
-
- (void) __sigsetmask (mask);
-
- return 0;
-}
diff --git a/sysdeps/unix/bsd/sun/sunos4/.cvsignore b/sysdeps/unix/bsd/sun/sunos4/.cvsignore
deleted file mode 100644
index 1f69fd919a..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.gz *.Z *.tar *.tgz
-=*
-TODO COPYING* AUTHORS copyr-* copying.*
-glibc-*
diff --git a/sysdeps/unix/bsd/sun/sunos4/Implies b/sysdeps/unix/bsd/sun/sunos4/Implies
deleted file mode 100644
index c99e256ac1..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/Implies
+++ /dev/null
@@ -1,2 +0,0 @@
-# SunOS 4 has the canonical set of <sys/mman.h> system calls.
-unix/mman
diff --git a/sysdeps/unix/bsd/sun/sunos4/Makefile b/sysdeps/unix/bsd/sun/sunos4/Makefile
deleted file mode 100644
index d17654a30f..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(subdir),posix)
-sysdep_routines := $(sysdep_routines) sys_wait4
-endif
-
-ifeq ($(subdir),misc)
-sysdep_routines := $(sysdep_routines) sys_mmap
-endif
diff --git a/sysdeps/unix/bsd/sun/sunos4/bits/fcntl.h b/sysdeps/unix/bsd/sun/sunos4/bits/fcntl.h
deleted file mode 100644
index a30b352592..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/bits/fcntl.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* O_*, F_*, FD_* bit values for SunOS 4.
- Copyright (C) 1991, 1992, 1997, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _FCNTL_H
-#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
-#endif
-
-
-/* File access modes for `open' and `fcntl'. */
-#define O_RDONLY 0 /* Open read-only. */
-#define O_WRONLY 1 /* Open write-only. */
-#define O_RDWR 2 /* Open read/write. */
-
-
-/* Bits OR'd into the second argument to open. */
-#define O_CREAT 0x0200 /* Create file if it doesn't exist. */
-#define O_EXCL 0x0800 /* Fail if file already exists. */
-#define O_TRUNC 0x0400 /* Truncate file to zero length. */
-#define O_NOCTTY 0x8000 /* Don't assign a controlling terminal. */
-#if defined __USE_BSD || defined __USE_SVID
-#define O_ASYNC 0x0040 /* Send SIGIO to owner when data is ready. */
-#define O_FSYNC 0x2000 /* Synchronous writes. */
-#define O_SYNC O_FSYNC
-#endif
-
-/* File status flags for `open' and `fcntl'. */
-#define O_APPEND 0x0008 /* Writes append to the file. */
-#define O_NONBLOCK 0x4000 /* Non-blocking I/O. */
-
-/* Sun defines O_NDELAY one way for BSD behavior and another for System V
- behavior. In the GNU C library, you get the BSD behavior unless you
- define _USG_SOURCE without also defining _BSD_SOURCE or _GNU_SOURCE. */
-#ifdef __USE_BSD
-#define O_NDELAY 0x0004
-#endif
-#if !defined (O_NDELAY) && defined (__USE_SVID)
-#define O_NDELAY 0x1000
-#endif
-
-#ifdef __USE_BSD
-/* Bits in the file status flags returned by F_GETFL.
- These are all the O_* flags, plus FREAD and FWRITE, which are
- independent bits set by which of O_RDONLY, O_WRONLY, and O_RDWR, was
- given to `open'. */
-#define FREAD 1
-#define FWRITE 2
-
-/* Traditional Unix names the O_* bits. */
-#define FASYNC O_ASYNC
-#define FCREAT O_CREAT
-#define FEXCL O_EXCL
-#define FTRUNC O_TRUNC
-#define FNOCTTY O_NOCTTY
-#define FFSYNC O_FSYNC
-#define FSYNC O_SYNC
-#define FAPPEND O_APPEND
-#define FNONBLOCK O_NONBLOCK
-#define FNONBIO O_NONBLOCK
-#define FNDELAY 0x0004 /* BSD O_NDELAY. */
-#define FNBIO 0x1000 /* System V O_NDELAY. */
-#endif
-
-/* Mask for file access modes. This is system-dependent in case
- some system ever wants to define some other flavor of access. */
-#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
-
-/* Values for the second argument to `fcntl'. */
-#define F_DUPFD 0 /* Duplicate file descriptor. */
-#define F_GETFD 1 /* Get file descriptor flags. */
-#define F_SETFD 2 /* Set file descriptor flags. */
-#define F_GETFL 3 /* Get file status flags. */
-#define F_SETFL 4 /* Set file status flags. */
-#if defined __USE_BSD || defined __USE_UNIX98
-#define F_GETOWN 5 /* Get owner (receiver of SIGIO). */
-#define F_SETOWN 6 /* Set owner (receiver of SIGIO). */
-#endif
-#define F_GETLK 7 /* Get record locking info. */
-#define F_SETLK 8 /* Set record locking info (non-blocking). */
-#define F_SETLKW 9 /* Set record locking info (blocking). */
-#ifdef __USE_BSD
-#define F_RGETLK 10 /* Get remote record locking info. */
-#define F_RSETLK 11 /* Set remote locking info (non-blocking). */
-#define F_CNVT 12 /* Convert a fhandle to an open fd. */
-#define F_RSETLKW 13 /* Set remote locking info (blocking). */
-#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
- {
- short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
- short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
- __off_t l_start; /* Offset where the lock begins. */
- __off_t l_len; /* Size of the locked area; zero means until EOF. */
- short int l_pid; /* Process holding the lock. */
- short int l_xxx; /* Reserved for future use. */
- };
-
-#ifdef __USE_BSD
-/* The structure describing a remote advisory lock. This is the type of the
- third arg to `fcntl' for the F_RGETLK, F_RSETLK, and F_RSETLKW requests. */
-struct eflock
- {
- short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
- short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
- __off_t l_start; /* Offset where the lock begins. */
- __off_t l_len; /* Size of the locked area; zero means until EOF. */
- short int l_pid; /* Process holding the lock. */
- short int l_xxx; /* Reserved for future use. */
- long int l_rpid; /* Remote process ID wanting this lock. */
- long int l_rsys; /* Remote system ID wanting this lock. */
- };
-
-#endif
-
-
-/* Values for the `l_type' field of a `struct flock'. */
-#define F_RDLCK 1 /* Read lock. */
-#define F_WRLCK 2 /* Write lock. */
-#define F_UNLCK 3 /* Remove lock. */
diff --git a/sysdeps/unix/bsd/sun/sunos4/bits/mman.h b/sysdeps/unix/bsd/sun/sunos4/bits/mman.h
deleted file mode 100644
index fdef46522a..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/bits/mman.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Definitions for BSD-style memory management. SunOS 4 version.
- Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _BITS_MMAN_H
-#define _BITS_MMAN_H 1
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_NONE 0x00 /* No access. */
-#define PROT_READ 0x01 /* Pages can be read. */
-#define PROT_WRITE 0x02 /* Pages can be written. */
-#define PROT_EXEC 0x04 /* Pages can be executed. */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes private; copy pages on write. */
-#ifdef __USE_BSD
-# define MAP_TYPE 0x0f /* Mask for sharing type. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Map address must be exactly as requested. */
-/* The following three flags are not actually implemented in SunOS 4.1. */
-#ifdef __USE_BSD
-# define MAP_RENAME 0x20 /* Rename private pages to file. */
-# define MAP_NORESERVE 0x40 /* Don't reserve needed swap area. */
-# define MAP_INHERIT 0x80 /* Region is retained after exec. */
-#endif
-
-/* This is an internal flag that is always set in `mmap' system calls. In
- older versions of SunOS 4 `mmap' did not return the actual mapping
- address, but always returned zero. This flag says to return the
- address; the `mmap' C library function always sets it. */
-#define _MAP_NEW 0x80000000
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
-
-/* Flags to `msync'. */
-#define MS_ASYNC 0x1 /* Return immediately, don't fsync. */
-#define MS_INVALIDATE 0x2 /* Invalidate caches. */
-
-#endif /* bits/mman.h */
diff --git a/sysdeps/unix/bsd/sun/sunos4/bits/resource.h b/sysdeps/unix/bsd/sun/sunos4/bits/resource.h
deleted file mode 100644
index 2f0d2dc73f..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/bits/resource.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Bit values for resource limits. SunOS 4 version.
- Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _SYS_RESOURCE_H
-# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
-#endif
-
-/* These are the values for 4.4 BSD and GNU. Earlier BSD systems have a
- subset of these kinds of resource limit. In systems where `getrlimit'
- and `setrlimit' are not system calls, these are the values used by the C
- library to emulate them. */
-
-#include <bits/types.h>
-
-/* Kinds of resource limit. */
-enum __rlimit_resource
- {
- /* Per-process CPU limit, in seconds. */
- RLIMIT_CPU,
-#define RLIMIT_CPU RLIMIT_CPU
- /* Largest file that can be created, in bytes. */
- RLIMIT_FSIZE,
-#define RLIMIT_FSIZE RLIMIT_FSIZE
- /* Maximum size of data segment, in bytes. */
- RLIMIT_DATA,
-#define RLIMIT_DATA RLIMIT_DATA
- /* Maximum size of stack segment, in bytes. */
- RLIMIT_STACK,
-#define RLIMIT_STACK RLIMIT_STACK
- /* Largest core file that can be created, in bytes. */
- RLIMIT_CORE,
-#define RLIMIT_CORE RLIMIT_CORE
- /* Largest resident set size, in bytes.
- This affects swapping; processes that are exceeding their
- resident set size will be more likely to have physical memory
- taken from them. */
- RLIMIT_RSS,
-#define RLIMIT_RSS RLIMIT_RSS
- /* Number of open files. */
- RLIMIT_NOFILE,
- RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */
-#define RLIMIT_NOFILE RLIMIT_NOFILE
-#define RLIMIT_OFILE RLIMIT_OFILE
-
- RLIM_NLIMITS
- };
-
-/* Value to indicate that there is no limit. */
-#ifndef __USE_FILE_OFFSET64
-# define RLIM_INFINITY 0x7fffffff
-#else
-# define RLIM_INFINITY 0x7fffffffffffffffLL
-#endif
-
-#ifdef __USE_LARGEFILE64
-# define RLIM64_INFINITY 0x7fffffffffffffffLL
-#endif
-
-
-/* Type to represent quantities in resource limits. */
-#ifndef __USE_FILE_OFFSET64
-typedef __rlim_t rlim_t;
-#else
-typedef __rlim64_t rlim_t;
-#endif
-
-struct rlimit
- {
- /* The current (soft) limit. */
- rlim_t rlim_cur;
- /* The hard limit. */
- rlim_t rlim_max;
- };
-
-#ifdef __USE_LARGEFILE64
-typedef __rlim64_t rlim64_t;
-
-struct rlimit64
- {
- /* The current (soft) limit. */
- rlim64_t rlim_cur;
- /* The hard limit. */
- rlim64_t rlim_max;
- };
-#endif
-
-/* Whose usage statistics do you want? */
-enum __rusage_who
-/* The macro definitions are necessary because some programs want
- to test for operating system features with #ifdef RUSAGE_SELF.
- In ISO C the reflexive definition is a no-op. */
- {
- /* The calling process. */
- RUSAGE_SELF = 0,
-#define RUSAGE_SELF RUSAGE_SELF
- /* All of its terminated child processes. */
- RUSAGE_CHILDREN = -1
-#define RUSAGE_CHILDREN RUSAGE_CHILDREN
- };
-
-#define __need_timeval
-#include <bits/time.h> /* For `struct timeval'. */
-
-/* Structure which says how much of each resource has been used. */
-struct rusage
- {
- /* Total amount of user time used. */
- struct timeval ru_utime;
- /* Total amount of system time used. */
- struct timeval ru_stime;
- /* Maximum resident set size (in kilobytes). */
- long int ru_maxrss;
- /* Amount of sharing of text segment memory
- with other processes (kilobyte-seconds). */
- long int ru_ixrss;
- /* Amount of data segment memory used (kilobyte-seconds). */
- long int ru_idrss;
- /* Amount of stack memory used (kilobyte-seconds). */
- long int ru_isrss;
- /* Number of soft page faults (i.e. those serviced by reclaiming
- a page from the list of pages awaiting reallocation. */
- long int ru_minflt;
- /* Number of hard page faults (i.e. those that required I/O). */
- long int ru_majflt;
- /* Number of times a process was swapped out of physical memory. */
- long int ru_nswap;
- /* Number of input operations via the file system. Note: This
- and `ru_oublock' do not include operations with the cache. */
- long int ru_inblock;
- /* Number of output operations via the file system. */
- long int ru_oublock;
- /* Number of IPC messages sent. */
- long int ru_msgsnd;
- /* Number of IPC messages received. */
- long int ru_msgrcv;
- /* Number of signals delivered. */
- long int ru_nsignals;
- /* Number of voluntary context switches, i.e. because the process
- gave up the process before it had to (usually to wait for some
- resource to be available). */
- long int ru_nvcsw;
- /* Number of involuntary context switches, i.e. a higher priority process
- became runnable or the current process used up its time slice. */
- long int ru_nivcsw;
- };
-
-/* Priority limits. */
-#define PRIO_MIN -20 /* Minimum priority a process can have. */
-#define PRIO_MAX 20 /* Maximum priority a process can have. */
-
-/* The type of the WHICH argument to `getpriority' and `setpriority',
- indicating what flavor of entity the WHO argument specifies. */
-enum __priority_which
- {
- PRIO_PROCESS = 0, /* WHO is a process ID. */
- PRIO_PGRP = 1, /* WHO is a process group ID. */
- PRIO_USER = 2 /* WHO is a user ID. */
- };
diff --git a/sysdeps/unix/bsd/sun/sunos4/bits/termios.h b/sysdeps/unix/bsd/sun/sunos4/bits/termios.h
deleted file mode 100644
index 97612c8f0b..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/bits/termios.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/* termios type and macro definitions. SunOS 4 version.
- Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TERMIOS_H
-# error "Never include <bits/termios.h> directly; use <termios.h> instead."
-#endif
-
-/* Type of terminal control flag masks. */
-typedef unsigned long int tcflag_t;
-
-/* Type of control characters. */
-typedef unsigned char cc_t;
-
-/* Type of baud rate specifiers. */
-typedef unsigned int speed_t;
-
-/* Terminal control structure. */
-struct termios
-{
- /* Input modes. */
- tcflag_t c_iflag;
-#define IGNBRK 0x0001 /* Ignore break condition. */
-#define BRKINT 0x0002 /* Signal interrupt on break. */
-#define IGNPAR 0x0004 /* Ignore characters with parity errors. */
-#define PARMRK 0x0008 /* Mark parity and framing errors. */
-#define INPCK 0x0010 /* Enable input parity check. */
-#define ISTRIP 0x0020 /* Strip 8th bit off characters. */
-#define INLCR 0x0040 /* Map NL to CR on input. */
-#define IGNCR 0x0080 /* Ignore CR. */
-#define ICRNL 0x0100 /* Map CR to NL on input. */
-#ifdef __USE_BSD
-# define IUCLC 0x0200 /* Map upper case to lower case on input. */
-#endif
-#define IXON 0x0400 /* Enable start/stop output control. */
-#define IXOFF 0x1000 /* Enable start/stop input control. */
-#ifdef __USE_BSD
-# define IXANY 0x0800 /* Any character will restart after stop. */
-# define IMAXBEL 0x2000 /* Ring bell when input queue is full. */
-#endif
-
- /* Output modes. */
- tcflag_t c_oflag;
-#define OPOST 0x0001 /* Perform output processing. */
-#ifdef __USE_BSD
-# define OLCUC 0x00000002 /* Map lower case to upper case on output. */
-# define ONLCR 0x00000004 /* Map NL to CR-NL on output. */
-# define OCRNL 0x00000008
-# define ONOCR 0x00000010
-# define ONLRET 0x00000020
-# define OFILL 0x00000040
-# define OFDEL 0x00000080
-# define NLDLY 0x00000100
-# define NL0 0
-# define NL1 0x00000100
-# define CRDLY 0x00000600
-# define CR0 0
-# define CR1 0x00000200
-# define CR2 0x00000400
-# define CR3 0x00000600
-# define TABDLY 0x00001800
-# define TAB0 0
-# define TAB1 0x00000800
-# define TAB2 0x00001000
-# define XTABS 0x00001800
-# define TAB3 XTABS
-# define BSDLY 0x00002000
-# define BS0 0
-# define BS1 0x00002000
-# define VTDLY 0x00004000
-# define VT0 0
-# define VT1 0x00004000
-# define FFDLY 0x00008000
-# define FF0 0
-# define FF1 0x00008000
-# define PAGEOUT 0x00010000
-# define WRAP 0x00020000
-#endif
-
- /* Control modes. */
- tcflag_t c_cflag;
-#define CSIZE (CS5|CS6|CS7|CS8) /* Number of bits per byte (mask). */
-#define CS5 0 /* 5 bits per byte. */
-#define CS6 0x00000010 /* 6 bits per byte. */
-#define CS7 0x00000020 /* 7 bits per byte. */
-#define CS8 0x00000030 /* 8 bits per byte. */
-#define CSTOPB 0x00000040 /* Two stop bits instead of one. */
-#define CREAD 0x00000080 /* Enable receiver. */
-#define PARENB 0x00000100 /* Parity enable. */
-#define PARODD 0x00000200 /* Odd parity instead of even. */
-#define HUPCL 0x00000400 /* Hang up on last close. */
-#define CLOCAL 0x00000800 /* Ignore modem status lines. */
-#ifdef __USE_BSD
-# define LOBLK 0x00001000
-# define CRTSCTS 0x80000000
-# define CIBAUD 0x000f0000 /* Mask for input speed from c_cflag. */
-# define CBAUD 0x0000000f /* Mask for output speed from c_cflag. */
-# define IBSHIFT 16 /* Bits to shift for input speed. */
-#endif
-
- /* Input and output baud rates. These are encoded in c_cflag. */
-#define B0 0
-#define B50 1
-#define B75 2
-#define B110 3
-#define B134 4
-#define B150 5
-#define B200 6
-#define B300 7
-#define B600 8
-#define B1200 9
-#define B1800 10
-#define B2400 11
-#define B4800 12
-#define B9600 13
-#define B19200 14
-#define B38400 15
-#ifdef __USE_BSD
-# define EXTA 14
-# define EXTB 15
-#endif
-
- /* Local modes. */
- tcflag_t c_lflag;
-#ifdef __USE_BSD
-# define ECHOKE 0x00000800 /* Visual erase for KILL. */
-#endif
-#define ECHOE 0x00000010 /* Visual erase for ERASE. */
-#define ECHOK 0x00000020 /* Echo NL after KILL. */
-#define ECHO 0x00000008 /* Enable echo. */
-#define ECHONL 0x00000040 /* Echo NL even if ECHO is off. */
-#ifdef __USE_BSD
-# define ECHOPRT 0x00000400 /* Hardcopy visual erase. */
-# define ECHOCTL 0x00000200 /* Echo control characters as ^X. */
-#endif
-#define ISIG 0x00000001 /* Enable signals. */
-#define ICANON 0x00000002 /* Do erase and kill processing. */
-#define IEXTEN 0x00008000 /* Enable DISCARD and LNEXT. */
-#define TOSTOP 0x00000100 /* Send SIGTTOU for background output. */
-#ifdef __USE_BSD
-# define PENDIN 0x00004000 /* Retype pending input (state). */
-#endif
-#define NOFLSH 0x00000080 /* Disable flush after interrupt. */
-
- char c_line; /* Line discipline (?) */
-
- /* Control characters. */
-#define VEOF 4 /* End-of-file character [ICANON]. */
-#define VEOL 5 /* End-of-line character [ICANON]. */
-#ifdef __USE_BSD
-# define VEOL2 6 /* Second EOL character [ICANON]. */
-# define VSWTCH 7 /* ??? */
-#endif
-#define VERASE 2 /* Erase character [ICANON]. */
-#ifdef __USE_BSD
-# define VWERASE 14 /* Word-erase character [ICANON]. */
-#endif
-#define VKILL 3 /* Kill-line character [ICANON]. */
-#ifdef __USE_BSD
-# define VREPRINT 12 /* Reprint-line character [ICANON]. */
-#endif
-#define VINTR 0 /* Interrupt character [ISIG]. */
-#define VQUIT 1 /* Quit character [ISIG]. */
-#define VSUSP 10 /* Suspend character [ISIG]. */
-#ifdef __USE_BSD
-# define VDSUSP 11 /* Delayed suspend character [ISIG]. */
-#endif
-#define VSTART 8 /* Start (X-ON) character [IXON, IXOFF]. */
-#define VSTOP 9 /* Stop (X-OFF) character [IXON, IXOFF]. */
-#ifdef __USE_BSD
-# define VLNEXT 15 /* Literal-next character [IEXTEN]. */
-# define VDISCARD 13 /* Discard character [IEXTEN]. */
-#endif
-#define VMIN VEOF /* Minimum number of bytes read at once [!ICANON]. */
-#define VTIME VEOL /* Time-out value (tenths of a second) [!ICANON]. */
-#define NCCS 17
- cc_t c_cc[NCCS];
-};
-
-#define _IOT_termios /* Hurd ioctl type field. */ \
- _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2)
-
-/* Values for the OPTIONAL_ACTIONS argument to `tcsetattr'. */
-#define TCSANOW 0 /* Change immediately. */
-#define TCSADRAIN 1 /* Change when pending output is written. */
-#define TCSAFLUSH 2 /* Flush pending input before changing. */
-
-/* Values for the QUEUE_SELECTOR argument to `tcflush'. */
-#define TCIFLUSH 0 /* Discard data received but not yet read. */
-#define TCOFLUSH 1 /* Discard data written but not yet sent. */
-#define TCIOFLUSH 2 /* Discard all pending data. */
-
-/* Values for the ACTION argument to `tcflow'. */
-#define TCOOFF 0 /* Suspend output. */
-#define TCOON 1 /* Restart suspended output. */
-#define TCIOFF 2 /* Send a STOP character. */
-#define TCION 3 /* Send a START character. */
diff --git a/sysdeps/unix/bsd/sun/sunos4/bits/utsname.h b/sysdeps/unix/bsd/sun/sunos4/bits/utsname.h
deleted file mode 100644
index a0246c2a36..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/bits/utsname.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright (C) 1997, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _SYS_UTSNAME_H
-# error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead."
-#endif
-
-#define _UTSNAME_LENGTH 9
-#define _UTSNAME_NODENAME_LENGTH 65
diff --git a/sysdeps/unix/bsd/sun/sunos4/mmap.c b/sysdeps/unix/bsd/sun/sunos4/mmap.c
deleted file mode 100644
index c513ae27eb..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/mmap.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <errno.h>
-
-/* Map addresses starting near ADDR and extending for LEN bytes. from
- OFFSET into the file FD describes according to PROT and FLAGS. If ADDR
- is nonzero, it is the desired mapping address. If the MAP_FIXED bit is
- set in FLAGS, the mapping will be at ADDR exactly (which must be
- page-aligned); otherwise the system chooses a convenient nearby address.
- The return value is the actual mapping address chosen or MAP_FAILED
- for errors (in which case `errno' is set). A successful `mmap' call
- deallocates any previous mapping for the affected region. */
-
-extern __ptr_t __mmap_syscall (__ptr_t addr, size_t len,
- int prot, int flags, int fd, off_t offset);
-
-
-__ptr_t
-__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
-{
- return __mmap_syscall (addr, len, prot, flags | _MAP_NEW, fd, offset);
-}
-
-weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/bsd/sun/sunos4/speed.c b/sysdeps/unix/bsd/sun/sunos4/speed.c
deleted file mode 100644
index 262d70fdfb..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/speed.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* `struct termios' speed frobnication functions. SunOS 4 version.
- Copyright (C) 1991,1992,1993,1996,1997,2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-#include <errno.h>
-#include <termios.h>
-
-static const speed_t speeds[] =
- {
- 0,
- 50,
- 75,
- 110,
- 134,
- 150,
- 200,
- 300,
- 600,
- 1200,
- 1800,
- 2400,
- 4800,
- 9600,
- 19200,
- 38400,
- };
-
-
-/* Return the output baud rate stored in *TERMIOS_P. */
-speed_t
-cfgetospeed (termios_p)
- const struct termios *termios_p;
-{
- return termios_p->c_cflag & CBAUD;
-}
-
-/* Return the input baud rate stored in *TERMIOS_P. */
-speed_t
-cfgetispeed (termios_p)
- const struct termios *termios_p;
-{
- return (termios_p->c_cflag & CIBAUD) >> IBSHIFT;
-}
-
-/* Set the output baud rate stored in *TERMIOS_P to SPEED. */
-int
-cfsetospeed (termios_p, speed)
- struct termios *termios_p;
- speed_t speed;
-{
- register unsigned int i;
-
- if (termios_p == NULL)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- /* This allows either B1200 or 1200 to work. XXX
- Do we really want to try to support this, given that
- fetching the speed must return one or the other? */
-
- for (i = 0; i < sizeof (speeds) / sizeof (speeds[0]); ++i)
- if (i == speed || speeds[i] == speed)
- {
- termios_p->c_cflag &= ~CBAUD;
- termios_p->c_cflag |= i;
- return 0;
- }
-
- __set_errno (EINVAL);
- return -1;
-}
-libc_hidden_def (cfsetospeed)
-
-/* Set the input baud rate stored in *TERMIOS_P to SPEED. */
-int
-cfsetispeed (termios_p, speed)
- struct termios *termios_p;
- speed_t speed;
-{
- register unsigned int i;
-
- if (termios_p == NULL)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- /* See comment in cfsetospeed (above). */
- for (i = 0; i < sizeof (speeds) / sizeof (speeds[0]); ++i)
- if (i == speed || speeds[i] == speed)
- {
- termios_p->c_cflag &= ~CIBAUD;
- termios_p->c_cflag |= i << IBSHIFT;
- return 0;
- }
-
- __set_errno (EINVAL);
- return -1;
-}
-libc_hidden_def (cfsetispeed)
diff --git a/sysdeps/unix/bsd/sun/sunos4/sys/ttydefaults.h b/sysdeps/unix/bsd/sun/sunos4/sys/ttydefaults.h
deleted file mode 100644
index d18433c6fe..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/sys/ttydefaults.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*-
- * Copyright (c) 1982, 1986, 1993
- * The Regents of the University of California. All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ttydefaults.h 8.4 (Berkeley) 1/21/94
- */
-
-/*
- * System wide defaults for terminal state. SunOS 4 version.
- */
-#ifndef _SYS_TTYDEFAULTS_H_
-#define _SYS_TTYDEFAULTS_H_
-
-/*
- * Defaults on "first" open.
- */
-#define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
-#define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
-#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
-#define TTYDEF_CFLAG (CREAD | CS7 | PARENB | HUPCL)
-#define TTYDEF_SPEED (B9600)
-
-/*
- * Control Character Defaults
- */
-#define CTRL(x) (x&037)
-#define CEOF CTRL('d')
-#ifdef _POSIX_VDISABLE
-# define CEOL _POSIX_VDISABLE
-#else
-# define CEOL ((unsigned char)'\377') /* XXX avoid _POSIX_VDISABLE */
-#endif
-#define CERASE 0177
-#define CINTR CTRL('c')
-#ifdef _POSIX_VDISABLE
-# define CSTATUS _POSIX_VDISABLE
-#else
-# define CSTATUS ((unsigned char)'\377') /* XXX avoid _POSIX_VDISABLE */
-#endif
-#define CKILL CTRL('u')
-#define CMIN 1
-#define CQUIT 034 /* FS, ^\ */
-#define CSUSP CTRL('z')
-#define CTIME 0
-#define CDSUSP CTRL('y')
-#define CSTART CTRL('q')
-#define CSTOP CTRL('s')
-#define CLNEXT CTRL('v')
-#define CDISCARD CTRL('o')
-#define CWERASE CTRL('w')
-#define CREPRINT CTRL('r')
-#define CEOT CEOF
-/* compat */
-#define CBRK CEOL
-#define CRPRNT CREPRINT
-#define CFLUSH CDISCARD
-
-/* PROTECTED INCLUSION ENDS HERE */
-#endif /* !_SYS_TTYDEFAULTS_H_ */
-
-/*
- * #define TTYDEFCHARS to include an array of default control characters.
- */
-#ifdef TTYDEFCHARS
-cc_t ttydefchars[NCCS] = {
- CEOF, CEOL, CEOL, CERASE, CWERASE, CKILL, CREPRINT,
- _POSIX_VDISABLE, CINTR, CQUIT, CSUSP, CDSUSP, CSTART, CSTOP, CLNEXT,
- CDISCARD, CMIN, CTIME, CSTATUS, _POSIX_VDISABLE
-};
-#undef TTYDEFCHARS
-#endif
diff --git a/sysdeps/unix/bsd/sun/sunos4/syscalls.list b/sysdeps/unix/bsd/sun/sunos4/syscalls.list
deleted file mode 100644
index 59992eed53..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/syscalls.list
+++ /dev/null
@@ -1,6 +0,0 @@
-# File name Caller Syscall name # args Strong name Weak names
-
-msync - msync 3 msync
-poll - poll 3 poll
-sys_mmap mmap mmap 5 __mmap_syscall
-sys_wait4 wait4 wait4 4 __wait4_syscall
diff --git a/sysdeps/unix/bsd/sun/sunos4/system.c b/sysdeps/unix/bsd/sun/sunos4/system.c
deleted file mode 100644
index 2c8e634bc8..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/system.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SunOS 4 does have `waitpid'. Avoid unix/system.c, which says we don't. */
-#include <sysdeps/posix/system.c>
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcsendbrk.c b/sysdeps/unix/bsd/sun/sunos4/tcsendbrk.c
deleted file mode 100644
index db5ea8c831..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/tcsendbrk.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <sys/termio.h> /* Sun header file. */
-
-/* Send zero bits on FD. */
-int
-tcsendbreak (fd, duration)
- int fd;
- int duration;
-{
- /* According to SunOS 4.1's termios(4), you can't specify a duration. */
- return __ioctl (fd, TCSBRK, 0);
-}
diff --git a/sysdeps/unix/bsd/sun/sunos4/wait.c b/sysdeps/unix/bsd/sun/sunos4/wait.c
deleted file mode 100644
index 79d54580fd..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/wait.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/bsd/bsd4.4/wait.c>
diff --git a/sysdeps/unix/bsd/sun/sunos4/wait3.c b/sysdeps/unix/bsd/sun/sunos4/wait3.c
deleted file mode 100644
index 0b3bdee771..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/wait3.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/bsd/bsd4.4/wait3.c>
diff --git a/sysdeps/unix/bsd/sun/sunos4/wait4.c b/sysdeps/unix/bsd/sun/sunos4/wait4.c
deleted file mode 100644
index 097c15e7d9..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/wait4.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This implements wait4 with the 4.4 BSD semantics (also those documented in
- SunOS 4.1) on top of SunOS's wait4 system call, which has semantics
- different from those documented. Go Sun!
- Copyright (C) 1991,1992,1993,1995,1997,2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-extern pid_t __wait4_syscall (pid_t pid, __WAIT_STATUS_DEFN stat_loc,
- int options, struct rusage *usage);
-
-pid_t
-__wait4 (pid, stat_loc, options, usage)
- pid_t pid;
- __WAIT_STATUS_DEFN stat_loc;
- int options;
- struct rusage *usage;
-{
- switch (pid)
- {
- case WAIT_ANY:
- pid = 0;
- break;
-
- case WAIT_MYPGRP:
- pid = - getpgrp ();
- break;
- }
-
- return __wait4_syscall (pid, stat_loc, options, usage);
-}
-
-weak_alias (__wait4, wait4)
diff --git a/sysdeps/unix/bsd/sun/sunos4/waitpid.c b/sysdeps/unix/bsd/sun/sunos4/waitpid.c
deleted file mode 100644
index 8378982ac7..0000000000
--- a/sysdeps/unix/bsd/sun/sunos4/waitpid.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/bsd/bsd4.4/waitpid.c>
diff --git a/sysdeps/unix/bsd/sun/syscalls.list b/sysdeps/unix/bsd/sun/syscalls.list
deleted file mode 100644
index 079aa9157a..0000000000
--- a/sysdeps/unix/bsd/sun/syscalls.list
+++ /dev/null
@@ -1,3 +0,0 @@
-# File name Caller Syscall name # args Strong name Weak names
-
-sigvec - sigvec 3 __raw_sigvec
diff --git a/sysdeps/unix/bsd/ulimit.c b/sysdeps/unix/bsd/ulimit.c
index 91d77e926a..963d156e2c 100644
--- a/sysdeps/unix/bsd/ulimit.c
+++ b/sysdeps/unix/bsd/ulimit.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 94, 96, 97, 98, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1994-1998,2001,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -23,9 +23,6 @@
#include <unistd.h>
#include <sys/resource.h>
-#ifndef HAVE_GNU_LD
-#define _etext etext
-#endif
extern int _etext;
diff --git a/sysdeps/unix/i386/brk.S b/sysdeps/unix/i386/brk.S
index a7604d7e7a..d8dd96b4ce 100644
--- a/sysdeps/unix/i386/brk.S
+++ b/sysdeps/unix/i386/brk.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,93,95,97,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,95,97,2002,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -25,11 +25,7 @@
.data
.globl C_SYMBOL_NAME(__curbrk)
C_LABEL(__curbrk)
-#ifdef HAVE_GNU_LD
.long C_SYMBOL_NAME(_end)
-#else
- .long C_SYMBOL_NAME(end)
-#endif
.text
SYSCALL__ (brk, 1)
diff --git a/sysdeps/unix/sh/sysdep.S b/sysdeps/unix/sh/sysdep.S
index 074b74333c..6e4798e45a 100644
--- a/sysdeps/unix/sh/sysdep.S
+++ b/sysdeps/unix/sh/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -98,5 +98,3 @@ skip:
#endif
#endif
END(__syscall_error)
-
-weak_alias (__syscall_error, syscall_error)
diff --git a/sysdeps/unix/sparc/brk.S b/sysdeps/unix/sparc/brk.S
index 2a16463b0f..29255fc68e 100644
--- a/sysdeps/unix/sparc/brk.S
+++ b/sysdeps/unix/sparc/brk.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -29,11 +29,7 @@
.data
.global C_SYMBOL_NAME(__curbrk)
C_LABEL(__curbrk)
-#ifdef HAVE_GNU_LD
.long C_SYMBOL_NAME(_end)
-#else
- .long C_SYMBOL_NAME(end)
-#endif
.text
ENTRY (__brk)
diff --git a/sysdeps/unix/sysv/linux/alpha/fxstatat.c b/sysdeps/unix/sysv/linux/alpha/fxstatat.c
new file mode 100644
index 0000000000..65b7ad97a3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/fxstatat.c
@@ -0,0 +1,100 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define __fxstatat64 __fxstatat64_disable
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <xstatconv.h>
+
+#undef __fxstatat64
+
+
+/* Get information about the file NAME in BUF. */
+int
+__fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ INTERNAL_SYSCALL_DECL (err);
+ int result, errno_out;
+ struct kernel_stat kst;
+
+ if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64)
+ {
+ if (flags & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat64, err, 2, file, st);
+ else
+ result = INTERNAL_SYSCALL (stat64, err, 2, file, st);
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
+ if (errno_out != ENOSYS)
+ goto fail;
+ __libc_missing_axp_stat64 = 1;
+ }
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, file, &kst);
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, file, &kst);
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return __xstat_conv (vers, &kst, st);
+ errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
+
+ fail:
+ __atfct_seterrno (errno_out, fd, buf);
+
+ return -1;
+}
+hidden_def (__xstat)
+weak_alias (__xstat, _xstat);
+strong_alias (__xstat, __xstat64);
+hidden_ver (__xstat, __xstat64)
diff --git a/sysdeps/unix/sysv/linux/device-nrs.h b/sysdeps/unix/sysv/linux/device-nrs.h
index 6b6578ec5f..b30c1dbede 100644
--- a/sysdeps/unix/sysv/linux/device-nrs.h
+++ b/sysdeps/unix/sysv/linux/device-nrs.h
@@ -1,5 +1,5 @@
/* Device numbers of devices used in the implementation. Linux version.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,6 +26,10 @@
#define DEV_NULL_MAJOR 1
#define DEV_NULL_MINOR 3
+/* /dev/full is (1,7). */
+#define DEV_FULL_MAJOR 1
+#define DEV_FULL_MINOR 7
+
/* Pseudo tty slaves. For Linux we use the Unix98 ttys. We could
also include the old BSD-style tty buts they should not be used and
the extra test would only slow down correctly set up systems. If a
diff --git a/sysdeps/unix/sysv/linux/fchownat.c b/sysdeps/unix/sysv/linux/fchownat.c
new file mode 100644
index 0000000000..d3cb992a09
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/fchownat.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+/* Change the owner and group of FILE. */
+int
+fchownat (fd, file, owner, group, flag)
+ int fd;
+ const char *file;
+ uid_t owner;
+ gid_t group;
+ int flag;
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown, err, 3, file, owner, group);
+ else
+ result = INTERNAL_SYSCALL (chown, err, 3, file, owner, group);
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/futimesat.c b/sysdeps/unix/sysv/linux/futimesat.c
new file mode 100644
index 0000000000..2fdedb0ff4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/futimesat.c
@@ -0,0 +1,97 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <utime.h>
+#include <sys/time.h>
+#include <sysdep.h>
+#include "kernel-features.h"
+
+
+/* Change the access time of FILE relative to FD to TVP[0] and
+ the modification time of FILE to TVP[1]. */
+int
+futimesat (fd, file, tvp)
+ int fd;
+ const char *file;
+ const struct timeval tvp[2];
+{
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#ifdef __NR_utimes
+ result = INTERNAL_SYSCALL (utimes, err, 2, file, tvp);
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+
+# ifndef __ASSUME_UTIMES
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+# endif
+#endif
+
+ /* The utimes() syscall does not exist or is not available in the
+ used kernel. Use utime(). For this we have to convert to the
+ data format utime() expects. */
+#ifndef __ASSUME_UTIMES
+ struct utimbuf tmp;
+ struct utimbuf *times;
+
+ if (tvp != NULL)
+ {
+ times = &tmp;
+ tmp.actime = tvp[0].tv_sec + tvp[0].tv_usec / 1000000;
+ tmp.modtime = tvp[1].tv_sec + tvp[1].tv_usec / 1000000;
+ }
+ else
+ times = NULL;
+
+ result = INTERNAL_SYSCALL (utime, err, 2, file, times);
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+
+ fail:
+#endif
+
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+
+ return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/fxstatat.c b/sysdeps/unix/sysv/linux/fxstatat.c
new file mode 100644
index 0000000000..9bc3dbc459
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/fxstatat.c
@@ -0,0 +1,106 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Ho hum, if fxstatat == fxstatat64 we must get rid of the prototype or gcc
+ will complain since they don't strictly match. */
+#define __fxstatat64 __fxstatat64_disable
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+#include <xstatconv.h>
+
+/* Get information about the file NAME in BUF. */
+int
+__fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+ if (vers == _STAT_VER_KERNEL)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, CHECK_STRING (file),
+ CHECK_1 ((struct kernel_stat *) st));
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, CHECK_STRING (file),
+ CHECK_1 ((struct kernel_stat *) st));
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ }
+
+#ifdef STAT_IS_KERNEL_STAT
+ __set_errno (EINVAL);
+ return -1;
+#else
+ struct kernel_stat kst;
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return __xstat_conv (vers, &kst, st);
+#endif
+
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+
+ return -1;
+}
+#ifdef XSTAT_IS_XSTAT64
+# undef __fxstatat64
+strong_alias (__fxstatat, __fxstatat64);
+#endif
diff --git a/sysdeps/unix/sysv/linux/fxstatat64.c b/sysdeps/unix/sysv/linux/fxstatat64.c
new file mode 100644
index 0000000000..8c41db710c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/fxstatat64.c
@@ -0,0 +1,135 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+#include "kernel-features.h"
+
+#if __ASSUME_STAT64_SYSCALL == 0
+# include <xstatconv.h>
+#endif
+
+#ifdef __NR_stat64
+# if __ASSUME_STAT64_SYSCALL == 0
+/* The variable is shared between all wrappers around *stat64 calls.
+ This is the definition. */
+extern int __have_no_stat64;
+# endif
+#endif
+
+/* Get information about the file NAME in BUF. */
+
+int
+__fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#if __ASSUME_STAT64_SYSCALL > 0
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat64, err, 2, CHECK_STRING (file),
+ CHECK_1 (st));
+ else
+ result = INTERNAL_SYSCALL (stat64, err, 2, CHECK_STRING (file),
+ CHECK_1 (st));
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ {
+# if defined _HAVE_STAT64___ST_INO && __ASSUME_ST_INO_64_BIT == 0
+ if (st->__st_ino != (__ino_t) st->st_ino)
+ st->st_ino = st->__st_ino;
+# endif
+ return result;
+ }
+#else
+ struct kernel_stat kst;
+# if defined __NR_stat64
+ if (! __have_no_stat64)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat64, err, 2, CHECK_STRING (file),
+ CHECK_1 (st));
+ else
+ result = INTERNAL_SYSCALL (stat64, err, 2, CHECK_STRING (file),
+ CHECK_1 (st));
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ {
+# if defined _HAVE_STAT64___ST_INO && __ASSUME_ST_INO_64_BIT == 0
+ if (st->__st_ino != (__ino_t) st->st_ino)
+ st->st_ino = st->__st_ino;
+# endif
+ return result;
+ }
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __have_no_stat64 = 1;
+ }
+# endif
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return __xstat64_conv (vers, &kst, st);
+
+ fail:
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+
+ return -1;
+#endif
+}
diff --git a/sysdeps/unix/sysv/linux/i386/fchownat.c b/sysdeps/unix/sysv/linux/i386/fchownat.c
new file mode 100644
index 0000000000..331623f73d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fchownat.c
@@ -0,0 +1,177 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <shlib-compat.h>
+#include <bp-checks.h>
+
+#include <linux/posix_types.h>
+#include "kernel-features.h"
+
+/*
+ In Linux 2.1.x the chown functions have been changed. A new function lchown
+ was introduced. The new chown now follows symlinks - the old chown and the
+ new lchown do not follow symlinks.
+ The new lchown function has the same number as the old chown had and the
+ new chown has a new number. When compiling with headers from Linux > 2.1.8x
+ it's impossible to run this libc with older kernels. In these cases libc
+ has therefore to route calls to chown to the old chown function.
+*/
+
+extern int __chown_is_lchown (const char *__file, uid_t __owner,
+ gid_t __group);
+extern int __real_chown (const char *__file, uid_t __owner, gid_t __group);
+
+
+#if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0
+/* Running under Linux > 2.1.80. */
+
+# ifdef __NR_chown32
+# if __ASSUME_32BITUIDS == 0
+/* This variable is shared with all files that need to check for 32bit
+ uids. */
+extern int __libc_missing_32bit_uids;
+# endif
+# endif /* __NR_chown32 */
+#endif
+
+
+int
+fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0
+# if __ASSUME_LCHOWN_SYSCALL == 0
+ static int __libc_old_chown;
+
+# ifdef __NR_chown32
+ if (__libc_missing_32bit_uids <= 0)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file),
+ owner, group);
+ else
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file),
+ owner, group);
+
+ if (!INTERNAL_SYSCALL_ERROR_P (result, err))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_missing_32bit_uids = 1;
+ }
+# endif /* __NR_chown32 */
+
+ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
+ || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (!__libc_old_chown && (flag & AT_SYMLINK_NOFOLLOW) == 0)
+ {
+ result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner,
+ group);
+
+ if (!INTERNAL_SYSCALL_ERROR_P (result, err))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_old_chown = 1;
+ }
+
+ result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner,
+ group);
+# elif __ASSUME_32BITUIDS
+ /* This implies __ASSUME_LCHOWN_SYSCALL. */
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
+ group);
+# else
+ /* !__ASSUME_32BITUIDS && ASSUME_LCHOWN_SYSCALL */
+# ifdef __NR_chown32
+ if (__libc_missing_32bit_uids <= 0)
+ {
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
+ group);
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_missing_32bit_uids = 1;
+ }
+# endif /* __NR_chown32 */
+ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
+ || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group);
+# endif
+#else
+ result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group);
+#endif
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+ fail:
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/i386/fxstatat.c b/sysdeps/unix/sysv/linux/i386/fxstatat.c
new file mode 100644
index 0000000000..2fc89e69c4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fxstatat.c
@@ -0,0 +1,148 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Ho hum, if fxstatat == fxstatat64 we must get rid of the prototype or gcc
+ will complain since they don't strictly match. */
+#define __fxstatat64 __fxstatat64_disable
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+#include "kernel-features.h"
+
+#include <xstatconv.h>
+
+#ifdef __NR_stat64
+# if __ASSUME_STAT64_SYSCALL == 0
+/* The variable is shared between all wrappers around *stat64 calls. */
+extern int __have_no_stat64;
+# endif
+#endif
+
+
+/* Get information about the file NAME relative to FD in ST. */
+int
+__fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+#if __ASSUME_STAT64_SYSCALL == 0
+ struct kernel_stat kst;
+#endif
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+ if (vers == _STAT_VER_KERNEL)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, CHECK_STRING (file),
+ CHECK_1 ((struct kernel_stat *) st));
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, CHECK_STRING (file),
+ CHECK_1 ((struct kernel_stat *) st));
+ goto out;
+ }
+
+#if __ASSUME_STAT64_SYSCALL > 0
+ struct stat64 st64;
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat64, err, 2, CHECK_STRING (file),
+ __ptrvalue (&st64));
+ else
+ result = INTERNAL_SYSCALL (stat64, err, 2, CHECK_STRING (file),
+ __ptrvalue (&st64));
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return __xstat32_conv (vers, &st64, st);
+#else
+# if defined __NR_stat64
+ /* To support 32 bit UIDs, we have to use stat64. The normal stat
+ call only returns 16 bit UIDs. */
+ if (! __have_no_stat64)
+ {
+ struct stat64 st64;
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat64, err, 2, CHECK_STRING (file),
+ __ptrvalue (&st64));
+ else
+ result = INTERNAL_SYSCALL (stat64, err, 2, CHECK_STRING (file),
+ __ptrvalue (&st64));
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ result = __xstat32_conv (vers, &st64, st);
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)
+ || INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto out;
+
+ __have_no_stat64 = 1;
+ }
+# endif
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lstat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+ else
+ result = INTERNAL_SYSCALL (stat, err, 2, CHECK_STRING (file),
+ __ptrvalue (&kst));
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return __xstat_conv (vers, &kst, st);
+#endif /* __ASSUME_STAT64_SYSCALL */
+
+ out:
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+
+ return result;
+}
+#ifdef XSTAT_IS_XSTAT64
+# undef __fxstatat64
+strong_alias (__fxstatat, __fxstatat64);
+#endif
diff --git a/sysdeps/unix/sysv/linux/m68k/fchownat.c b/sysdeps/unix/sysv/linux/m68k/fchownat.c
new file mode 100644
index 0000000000..71df4feda7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/fchownat.c
@@ -0,0 +1,121 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+#include <linux/posix_types.h>
+#include "kernel-features.h"
+
+#ifdef __NR_chown32
+# if __ASSUME_32BITUIDS == 0
+/* This variable is shared with all files that need to check for 32bit
+ uids. */
+extern int __libc_missing_32bit_uids;
+# endif
+#endif /* __NR_chown32 */
+
+int
+fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#if __ASSUME_32BITUIDS > 0
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file), owner,
+ group);
+ else
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
+ group);
+#else
+# ifdef __NR_chown32
+ if (__libc_missing_32bit_uids <= 0)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file),
+ owner, group);
+ else
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
+ group);
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_missing_32bit_uids = 1;
+ }
+# endif /* __NR_chown32 */
+
+ if (((owner + 1) > (gid_t) ((__kernel_uid_t) -1U))
+ || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner,
+ group);
+ else
+ result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner,
+ group);
+#endif
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+ fail:
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/m68k/fxstatat.c b/sysdeps/unix/sysv/linux/m68k/fxstatat.c
new file mode 100644
index 0000000000..0f8b3135d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
new file mode 100644
index 0000000000..d5d976cbc4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/openat.c
@@ -0,0 +1,117 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sysdep-cancel.h>
+
+
+#ifndef OPENAT
+# define OPENAT openat
+# define MORE_OFLAGS 0
+
+
+void
+attribute_hidden
+__atfct_seterrno (int errval, int fd, const char *buf)
+{
+ if (buf != NULL && errval == ENOTDIR)
+ {
+ /* This can mean either the file descriptor is invalid or
+ /proc is not mounted. */
+ struct stat64 st;
+ if (__fxstat64 (_STAT_VER, fd, &st) != 0)
+ /* errno is already set correctly. */
+ return;
+
+ /* If /proc is not mounted there is nothing we can do. */
+ if (S_ISDIR (st.st_mode)
+ && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
+ || !S_ISDIR (st.st_mode)))
+ errval = ENOSYS;
+ }
+
+ __set_errno (errval);
+}
+#endif
+
+/* Open FILE with access OFLAG. Interpret relative paths relative to
+ the directory associated with FD. If OFLAG includes O_CREAT, a
+ third argument is the file protection. */
+int
+OPENAT (fd, file, oflag)
+ int fd;
+ const char *file;
+ int oflag;
+{
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ mode_t mode = 0;
+ if (oflag & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, oflag);
+ mode = va_arg (arg, mode_t);
+ va_end (arg);
+ }
+
+ INTERNAL_SYSCALL_DECL (err);
+ int res;
+
+ if (SINGLE_THREAD_P)
+ res = INTERNAL_SYSCALL (open, err, 3, file, oflag | MORE_OFLAGS, mode);
+ else
+ {
+ int oldtype = LIBC_CANCEL_ASYNC ();
+
+ res = INTERNAL_SYSCALL (open, err, 3, file, oflag | MORE_OFLAGS, mode);
+
+ LIBC_CANCEL_RESET (oldtype);
+ }
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
+ {
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (res, err), fd, buf);
+ res = -1;
+ }
+
+ return res;
+}
diff --git a/sysdeps/unix/sysv/linux/openat64.c b/sysdeps/unix/sysv/linux/openat64.c
new file mode 100644
index 0000000000..9e7a2b3737
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/openat64.c
@@ -0,0 +1,4 @@
+#define OPENAT openat64
+#define MORE_OFLAGS O_LARGEFILE
+
+#include "openat.c"
diff --git a/sysdeps/unix/sysv/linux/powerpc/chown.c b/sysdeps/unix/sysv/linux/powerpc/chown.c
index 4b283e720c..fdcbd3683a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/chown.c
+++ b/sysdeps/unix/sysv/linux/powerpc/chown.c
@@ -1,5 +1,5 @@
/* chown() compatibility.
- Copyright (C) 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,6 +24,8 @@
#include <sysdep.h>
#include <stdlib.h>
+#include <kernel-features.h>
+
/*
In Linux 2.1.x the chown functions have been changed. A new function lchown
was introduced. The new chown now follows symlinks - the old chown and the
@@ -34,58 +36,61 @@
int
__chown (const char *file, uid_t owner, gid_t group)
{
- int err;
- int old_errno;
- char link[PATH_MAX+2];
- char path[2*PATH_MAX+4];
- int loopct;
- size_t filelen;
- static int libc_old_chown = 0 /* -1=old linux, 1=new linux, 0=unknown */;
-
- if (libc_old_chown == 1)
- return INLINE_SYSCALL (chown, 3, __ptrvalue (file), owner, group);
-
- old_errno = errno;
-
-#ifdef __NR_lchown
- if (libc_old_chown == 0)
- {
- err = INLINE_SYSCALL (chown, 3, __ptrvalue (file), owner, group);
- if (err != -1 || errno != ENOSYS)
- {
- libc_old_chown = 1;
- return err;
- }
- libc_old_chown = -1;
- }
-#endif
-
- err = __readlink (file, link, PATH_MAX+1);
- if (err == -1)
- {
- errno = old_errno;
- return __lchown(file, owner, group);
- }
-
- filelen = strlen (file) + 1;
- if (filelen > sizeof(path))
- {
- errno = ENAMETOOLONG;
- return -1;
- }
- memcpy (path, file, filelen);
-
- /* 'The system has an arbitrary limit...' In practise, we'll hit
- ENAMETOOLONG before this, usually. */
- for (loopct = 0; loopct < 128; loopct++)
- {
- size_t linklen;
-
- if (err >= PATH_MAX+1)
- {
- errno = ENAMETOOLONG;
- return -1;
- }
+#if __ASSUME_LCHOWN_SYSCALL
+ return INLINE_SYSCALL (chown, 3, file, owner, group);
+#else
+ int err;
+ int old_errno;
+ char link[PATH_MAX + 2];
+ char path[2 * PATH_MAX + 4];
+ int loopct;
+ size_t filelen;
+ static int libc_old_chown = 0 /* -1=old linux, 1=new linux, 0=unknown */;
+
+ if (libc_old_chown == 1)
+ return INLINE_SYSCALL (chown, 3, __ptrvalue (file), owner, group);
+
+ old_errno = errno;
+
+# ifdef __NR_lchown
+ if (libc_old_chown == 0)
+ {
+ err = INLINE_SYSCALL (chown, 3, __ptrvalue (file), owner, group);
+ if (err != -1 || errno != ENOSYS)
+ {
+ libc_old_chown = 1;
+ return err;
+ }
+ libc_old_chown = -1;
+ }
+# endif
+
+ err = __readlink (file, link, PATH_MAX + 1);
+ if (err == -1)
+ {
+ __set_errno (old_errno);
+ return __lchown (file, owner, group);
+ }
+
+ filelen = strlen (file) + 1;
+ if (filelen > sizeof (path))
+ {
+ __set_errno (ENAMETOOLONG);
+ return -1;
+ }
+ memcpy (path, file, filelen);
+
+ /* 'The system has an arbitrary limit...' In practise, we'll hit
+ ENAMETOOLONG before this, usually. */
+ for (loopct = 0; loopct < 128; ++loopct)
+ {
+ size_t linklen;
+
+ if (err >= PATH_MAX + 1)
+ {
+ __set_errno (ENAMETOOLONG);
+ return -1;
+ }
link[err] = 0; /* Null-terminate string, just-in-case. */
@@ -97,28 +102,29 @@ __chown (const char *file, uid_t owner, gid_t group)
{
filelen = strlen (path);
- while (filelen > 1 && path[filelen-1] == '/')
- filelen--;
- while (filelen > 0 && path[filelen-1] != '/')
- filelen--;
- if (filelen + linklen > sizeof(path))
+ while (filelen > 1 && path[filelen - 1] == '/')
+ --filelen;
+ while (filelen > 0 && path[filelen - 1] != '/')
+ --filelen;
+ if (filelen + linklen > sizeof (path))
{
errno = ENAMETOOLONG;
return -1;
}
- memcpy (path+filelen, link, linklen);
+ memcpy (path + filelen, link, linklen);
}
- err = __readlink(path, link, PATH_MAX+1);
+ err = __readlink (path, link, PATH_MAX + 1);
if (err == -1)
- {
- errno = old_errno;
- return __lchown(path, owner, group);
- }
- }
- errno = ELOOP;
- return -1;
+ {
+ __set_errno (old_errno);
+ return __lchown (path, owner, group);
+ }
+ }
+ __set_errno (ELOOP);
+ return -1;
+#endif
}
libc_hidden_def (__chown)
diff --git a/sysdeps/unix/sysv/linux/powerpc/fchownat.c b/sysdeps/unix/sysv/linux/powerpc/fchownat.c
new file mode 100644
index 0000000000..1fbae5c448
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/fchownat.c
@@ -0,0 +1,205 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#include <sysdep.h>
+#include <stdlib.h>
+
+#include <kernel-features.h>
+
+/*
+ In Linux 2.1.x the chown functions have been changed. A new function lchown
+ was introduced. The new chown now follows symlinks - the old chown and the
+ new lchown do not follow symlinks.
+ This file emulates chown() under the old kernels.
+*/
+
+int
+fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#if __ASSUME_LCHOWN_SYSCALL
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown, err, 3, file, owner, group);
+ else
+ result = INTERNAL_SYSCALL (chown, err, 3, file, owner, group);
+#else
+ char link[PATH_MAX + 2];
+ char path[2 * PATH_MAX + 4];
+ int loopct;
+ size_t filelen;
+ static int libc_old_chown = 0 /* -1=old linux, 1=new linux, 0=unknown */;
+
+ if (libc_old_chown == 1)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner,
+ group);
+ else
+ result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
+ group);
+ goto out;
+ }
+
+# ifdef __NR_lchown
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ {
+ result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner,
+ group);
+ goto out;
+ }
+
+ if (libc_old_chown == 0)
+ {
+ result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
+ group);
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ {
+ libc_old_chown = 1;
+ goto fail;
+ }
+ libc_old_chown = -1;
+ }
+# else
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ {
+ result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
+ group);
+ goto out;
+ }
+# endif
+
+ result = __readlink (file, link, PATH_MAX + 1);
+ if (result == -1)
+ {
+# ifdef __NR_lchown
+ result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner,
+ group);
+# else
+ result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
+ group);
+# endif
+ goto out;
+ }
+
+ filelen = strlen (file) + 1;
+ if (filelen > sizeof (path))
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ memcpy (path, file, filelen);
+
+ /* 'The system has an arbitrary limit...' In practise, we'll hit
+ ENAMETOOLONG before this, usually. */
+ for (loopct = 0; loopct < 128; ++loopct)
+ {
+ size_t linklen;
+
+ if (result >= PATH_MAX + 1)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ link[result] = 0; /* Null-terminate string, just-in-case. */
+
+ linklen = strlen (link) + 1;
+
+ if (link[0] == '/')
+ memcpy (path, link, linklen);
+ else
+ {
+ filelen = strlen (path);
+
+ while (filelen > 1 && path[filelen - 1] == '/')
+ --filelen;
+ while (filelen > 0 && path[filelen - 1] != '/')
+ --filelen;
+ if (filelen + linklen > sizeof (path))
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ memcpy (path + filelen, link, linklen);
+ }
+
+ result = __readlink (path, link, PATH_MAX + 1);
+
+ if (result == -1)
+ {
+# ifdef __NR_lchown
+ result = INTERNAL_SYSCALL (lchown, err, 3, path, owner, group);
+# else
+ result = INTERNAL_SYSCALL (chown, err, 3, path, owner, group);
+# endif
+ goto out;
+ }
+ }
+ __set_errno (ELOOP);
+ return -1;
+
+ out:
+#endif
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+#if !__ASSUME_LCHOWN_SYSCALL
+ fail:
+#endif
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
new file mode 100644
index 0000000000..ddaff303c5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
@@ -0,0 +1,105 @@
+/* Get frequency of the system processor. powerpc/Linux version.
+ Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <libc-internal.h>
+
+
+hp_timing_t
+__get_clockfreq (void)
+{
+ /* We read the information from the /proc filesystem. /proc/cpuinfo
+ contains at least one line like:
+ timebase : 33333333
+ We search for this line and convert the number into an integer. */
+ static hp_timing_t timebase_freq;
+ hp_timing_t result = 0L;
+
+ /* If this function was called before, we know the result. */
+ if (timebase_freq != 0)
+ return timebase_freq;
+
+ int fd = open ("/proc/cpuinfo", O_RDONLY);
+ if (__builtin_expect (fd != -1, 1))
+ {
+ /* The timebase will be in the 1st 1024 bytes for systems with up
+ to 8 processors. If the first read returns less then 1024
+ bytes read, we have the whole cpuinfo and can start the scan.
+ Otherwise we will have to read more to insure we have the
+ timebase value in the scan. */
+ char buf[1024];
+ ssize_t n;
+
+ n = read (fd, buf, sizeof (buf));
+ if (n == sizeof (buf))
+ {
+ /* We are here because the 1st read returned exactly sizeof
+ (buf) bytes. This implies that we are not at EOF and may
+ not have read the timebase value yet. So we need to read
+ more bytes until we know we have EOF. We copy the lower
+ half of buf to the upper half and read sizeof (buf)/2
+ bytes into the lower half of buf and repeat until we
+ reach EOF. We can assume that the timebase will be in
+ the last 512 bytes of cpuinfo, so two 512 byte half_bufs
+ will be sufficient to contain the timebase and will
+ handle the case where the timebase spans the half_buf
+ boundry. */
+ const ssize_t half_buf = sizeof (buf) / 2;
+ while (n >= half_buf)
+ {
+ memcpy (buf, buf + half_buf, half_buf);
+ n = read (fd, buf + half_buf, half_buf);
+ }
+ if (n >= 0)
+ n += half_buf;
+ }
+
+ if (__builtin_expect (n, 1) > 0)
+ {
+ char *mhz = memmem (buf, n, "timebase", 7);
+
+ if (__builtin_expect (mhz != NULL, 1))
+ {
+ char *endp = buf + n;
+
+ /* Search for the beginning of the string. */
+ while (mhz < endp && (*mhz < '0' || *mhz > '9') && *mhz != '\n')
+ ++mhz;
+
+ while (mhz < endp && *mhz != '\n')
+ {
+ if (*mhz >= '0' && *mhz <= '9')
+ {
+ result *= 10;
+ result += *mhz - '0';
+ }
+
+ ++mhz;
+ }
+ }
+ timebase_freq = result;
+ }
+ close (fd);
+ }
+
+ return timebase_freq;
+}
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fxstatat.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fxstatat.c
new file mode 100644
index 0000000000..0f8b3135d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/renameat.c b/sysdeps/unix/sysv/linux/renameat.c
new file mode 100644
index 0000000000..31662ea053
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/renameat.c
@@ -0,0 +1,121 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sysdep.h>
+
+
+/* Rename the file OLD relative to OLDFD to NEW relative to NEWFD. */
+int
+renameat (oldfd, old, newfd, new)
+ int oldfd;
+ const char *old;
+ int newfd;
+ const char *new;
+{
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ char *bufold = NULL;
+
+ if (oldfd != AT_FDCWD && old[0] != '/')
+ {
+ size_t filelen = strlen (old);
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ bufold = alloca (buflen);
+
+ __snprintf (bufold, buflen, procfd, oldfd, old);
+ old = bufold;
+ }
+
+ char *bufnew = NULL;
+
+ if (newfd != AT_FDCWD && new[0] != '/')
+ {
+ size_t filelen = strlen (new);
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ bufnew = alloca (buflen);
+
+ __snprintf (bufnew, buflen, procfd, newfd, new);
+ new = bufnew;
+ }
+
+ INTERNAL_SYSCALL_DECL (err);
+
+ int result = INTERNAL_SYSCALL (rename, err, 2, old, new);
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+ int errval = INTERNAL_SYSCALL_ERRNO (result, err);
+ if (errval == ENOTDIR && (bufnew != NULL || bufold != NULL))
+ {
+ /* This can mean either the file descriptor is invalid or
+ /proc is not mounted. */
+ struct stat64 st;
+
+ if (bufnew != NULL)
+ {
+ if (__fxstat64 (_STAT_VER, newfd, &st) != 0)
+ /* errno is already set correctly. */
+ return -1;
+
+ /* If /proc is not mounted there is nothing we can do. */
+ if (S_ISDIR (st.st_mode)
+ && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
+ || !S_ISDIR (st.st_mode)))
+ {
+ errval = ENOSYS;
+ goto out;
+ }
+ }
+
+ if (bufold != NULL)
+ {
+ if (__fxstat64 (_STAT_VER, oldfd, &st) != 0)
+ /* errno is already set correctly. */
+ return -1;
+
+ /* If /proc is not mounted there is nothing we can do. */
+ if (S_ISDIR (st.st_mode)
+ && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
+ || !S_ISDIR (st.st_mode)))
+ errval = ENOSYS;
+ }
+ }
+
+ out:
+ __set_errno (errval);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c b/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c
new file mode 100644
index 0000000000..b95665cad3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c
@@ -0,0 +1,140 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <shlib-compat.h>
+#include <bp-checks.h>
+
+#include <linux/posix_types.h>
+#include "kernel-features.h"
+
+/*
+ In Linux 2.1.x the chown functions have been changed. A new function lchown
+ was introduced. The new chown now follows symlinks - the old chown and the
+ new lchown do not follow symlinks.
+ The new lchown function has the same number as the old chown had and the
+ new chown has a new number. When compiling with headers from Linux > 2.1.8x
+ it's impossible to run this libc with older kernels. In these cases libc
+ has therefore to route calls to chown to the old chown function.
+*/
+
+/* Running under Linux > 2.1.80. */
+
+#ifdef __NR_chown32
+# if __ASSUME_32BITUIDS == 0
+/* This variable is shared with all files that need to check for 32bit
+ uids. */
+extern int __libc_missing_32bit_uids;
+# endif
+#endif /* __NR_chown32 */
+
+int
+fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
+{
+ if (flag & ~AT_SYMLINK_NOFOLLOW)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+#if __ASSUME_32BITUIDS > 0
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
+ group);
+#else
+ static int __libc_old_chown;
+
+# ifdef __NR_chown32
+ if (__libc_missing_32bit_uids <= 0)
+ {
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file),
+ owner, group);
+ else
+ result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file),
+ owner, group);
+
+ if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_missing_32bit_uids = 1;
+ }
+# endif /* __NR_chown32 */
+ if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
+ || ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (!__libc_old_chown && (flag & AT_SYMLINK_NOFOLLOW) == 0)
+ {
+ result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner,
+ group);
+
+ if (!INTERNAL_SYSCALL_ERROR_P (result, err))
+ return result;
+ if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
+ goto fail;
+
+ __libc_old_chown = 1;
+ }
+
+ result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner,
+ group);
+#endif
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+ fail:
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/fxstatat.c b/sysdeps/unix/sysv/linux/s390/s390-32/fxstatat.c
new file mode 100644
index 0000000000..0f8b3135d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/sh/fchownat.c b/sysdeps/unix/sysv/linux/sh/fchownat.c
new file mode 100644
index 0000000000..7acf7918ee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sh/fchownat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/m68k/fchownat.c>
diff --git a/sysdeps/unix/sysv/linux/sh/fxstatat.c b/sysdeps/unix/sysv/linux/sh/fxstatat.c
new file mode 100644
index 0000000000..0f8b3135d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sh/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/sh/socket.S b/sysdeps/unix/sysv/linux/sh/socket.S
index f1369eb49b..eb1761b94b 100644
--- a/sysdeps/unix/sysv/linux/sh/socket.S
+++ b/sysdeps/unix/sysv/linux/sh/socket.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -33,7 +33,11 @@
The .S files for the other calls just #define socket and #include this. */
#ifndef __socket
+#ifndef NO_WEAK_ALIAS
#define __socket P(__,socket)
+#else
+#define __socket socket
+#endif
#endif
#define PUSHARGS_1 mov.l r4,@-r15; \
@@ -173,4 +177,6 @@ ENTRY (__socket)
PSEUDO_END (__socket)
+#ifndef NO_WEAK_ALIAS
weak_alias (__socket, socket)
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c b/sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c
new file mode 100644
index 0000000000..7acf7918ee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/m68k/fchownat.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fxstatat.c b/sysdeps/unix/sysv/linux/sparc/sparc32/fxstatat.c
new file mode 100644
index 0000000000..0f8b3135d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c b/sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c
new file mode 100644
index 0000000000..c2610b2a06
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c
@@ -0,0 +1 @@
+#include "../../fxstatat.c"
diff --git a/sysdeps/unix/sysv/linux/tcflow.c b/sysdeps/unix/sysv/linux/tcflow.c
index 5be68e2ea2..6e72370272 100644
--- a/sysdeps/unix/sysv/linux/tcflow.c
+++ b/sysdeps/unix/sysv/linux/tcflow.c
@@ -1 +1,31 @@
-#include <sysdeps/unix/bsd/sun/sunos4/tcflow.c>
+/* tcflow -- Suspend or restart transmission on termios file descriptor.
+ Copyright (C) 1993,1997,2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+/* Suspend or restart transmission on FD. */
+int
+tcflow (fd, action)
+ int fd;
+ int action;
+{
+ return __ioctl (fd, TCXONC, action);
+}
diff --git a/sysdeps/unix/sysv/linux/tcflush.c b/sysdeps/unix/sysv/linux/tcflush.c
index 78e09b2f75..cae419f4a9 100644
--- a/sysdeps/unix/sysv/linux/tcflush.c
+++ b/sysdeps/unix/sysv/linux/tcflush.c
@@ -1 +1,31 @@
-#include <sysdeps/unix/bsd/sun/sunos4/tcflush.c>
+/* tcflush -- Flush pending data on termios file descriptor. Linux version.
+ Copyright (C) 1993,1997,2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+/* Flush pending data on FD. */
+int
+tcflush (fd, queue_selector)
+ int fd;
+ int queue_selector;
+{
+ return __ioctl (fd, TCFLSH, queue_selector);
+}
diff --git a/sysdeps/unix/sysv/linux/unlinkat.c b/sysdeps/unix/sysv/linux/unlinkat.c
new file mode 100644
index 0000000000..c590e71ada
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/unlinkat.c
@@ -0,0 +1,74 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* Remove the link named NAME. */
+int
+unlinkat (fd, file, flag)
+ int fd;
+ const char *file;
+ int flag;
+{
+ if (flag & ~AT_REMOVEDIR)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ int result;
+ INTERNAL_SYSCALL_DECL (err);
+
+ if (flag & AT_REMOVEDIR)
+ result = INTERNAL_SYSCALL (rmdir, err, 1, file);
+ else
+ result = INTERNAL_SYSCALL (unlink, err, 1, file);
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
+ {
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
+ result = -1;
+ }
+
+ return result;
+}
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c b/sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c
new file mode 100644
index 0000000000..70e73571f7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c
@@ -0,0 +1,78 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Ho hum, since fxstatat == fxstatat64 we must get rid of the
+ prototype or gcc will complain since they don't strictly match. */
+#define __fxstatat64 __fxstatat64_disable
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+/* Get information about the file NAME relative to FD in ST. */
+int
+__fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
+{
+ if ((vers != _STAT_VER_KERNEL && vers != _STAT_VER_LINUX)
+ || (flag & ~AT_SYMLINK_NOFOLLOW) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ char *buf = NULL;
+
+ if (fd != AT_FDCWD && file[0] != '/')
+ {
+ size_t filelen = strlen (file);
+ static const char procfd[] = "/proc/self/fd/%d/%s";
+ /* Buffer for the path name we are going to use. It consists of
+ - the string /proc/self/fd/
+ - the file descriptor number
+ - the file name provided.
+ The final NUL is included in the sizeof. A bit of overhead
+ due to the format elements compensates for possible negative
+ numbers. */
+ size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
+ buf = alloca (buflen);
+
+ __snprintf (buf, buflen, procfd, fd, file);
+ file = buf;
+ }
+
+ INTERNAL_SYSCALL_DECL (err);
+ int res;
+
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ res = INTERNAL_SYSCALL (lstat, err, 2, file, CHECK_1 (st));
+ else
+ res = INTERNAL_SYSCALL (stat, err, 2, file, CHECK_1 (st));
+
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
+ __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (res, err), fd, buf);
+
+ return res;
+}
+#undef __fxstatat64
+strong_alias (__fxstatat, __fxstatat64);
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fxstatat64.c b/sysdeps/unix/sysv/linux/wordsize-64/fxstatat64.c
new file mode 100644
index 0000000000..05e7f413bb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/wordsize-64/fxstatat64.c
@@ -0,0 +1 @@
+/* fxstatat64 is in fxstatat.c */
diff --git a/time/sys/time.h b/time/sys/time.h
index 515ea7ec68..199125bff3 100644
--- a/time/sys/time.h
+++ b/time/sys/time.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1994,1996-2002,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1994,1996-2002,2003,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -70,13 +70,14 @@ typedef void *__restrict __timezone_ptr_t;
NOTE: This form of timezone information is obsolete.
Use the functions and variables declared in <time.h> instead. */
extern int gettimeofday (struct timeval *__restrict __tv,
- __timezone_ptr_t __tz) __THROW;
+ __timezone_ptr_t __tz) __THROW __nonnull ((1));
#ifdef __USE_BSD
/* Set the current time of day and timezone information.
This call is restricted to the super-user. */
extern int settimeofday (__const struct timeval *__tv,
- __const struct timezone *__tz) __THROW;
+ __const struct timezone *__tz)
+ __THROW __nonnull ((1));
/* Adjust the current time of day by the amount in DELTA.
If OLDDELTA is not NULL, it is filled in with the amount
@@ -136,17 +137,25 @@ extern int setitimer (__itimer_which_t __which,
FILE to TVP[1]. If TVP is a null pointer, use the current time instead.
Returns 0 on success, -1 on errors. */
extern int utimes (__const char *__file, __const struct timeval __tvp[2])
- __THROW;
+ __THROW __nonnull ((1));
#ifdef __USE_BSD
/* Same as `utimes', but does not follow symbolic links. */
extern int lutimes (__const char *__file, __const struct timeval __tvp[2])
- __THROW;
+ __THROW __nonnull ((1));
/* Same as `utimes', but takes an open file descriptor instead of a name. */
extern int futimes (int __fd, __const struct timeval __tvp[2]) __THROW;
#endif
+#ifdef __USE_GNU
+/* Change the access time of FILE relative to FD to TVP[0] and the
+ modification time of FILE to TVP[1]. If TVP is a null pointer, use
+ the current time instead. Returns 0 on success, -1 on errors. */
+extern int futimesat (int __fd, __const char *__file,
+ __const struct timeval __tvp[2]) __THROW __nonnull ((2));
+#endif
+
#ifdef __USE_BSD
/* Convenience macros for operations on timevals.