[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r2907 - in /fsf/trunk/libc: ./ hurd/ libio/ login/ nis/nss_compat/ sysdeps/mach/hurd/ sysdeps/mach/hurd/bits/ sysdeps/mach/h...
- To: commits@xxxxxxxxxx
- Subject: [commits] r2907 - in /fsf/trunk/libc: ./ hurd/ libio/ login/ nis/nss_compat/ sysdeps/mach/hurd/ sysdeps/mach/hurd/bits/ sysdeps/mach/h...
- From: eglibc@xxxxxxxxxx
- Date: Mon, 23 Jul 2007 07:02:43 -0000
Author: eglibc
Date: Mon Jul 23 00:02:42 2007
New Revision: 2907
Log:
Import glibc-mainline for 2007-07-23
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/hurd/getdport.c
fsf/trunk/libc/hurd/port2fd.c
fsf/trunk/libc/libio/fileops.c
fsf/trunk/libc/login/utmp_file.c
fsf/trunk/libc/nis/nss_compat/compat-grp.c
fsf/trunk/libc/nis/nss_compat/compat-initgroups.c
fsf/trunk/libc/nis/nss_compat/compat-pwd.c
fsf/trunk/libc/nis/nss_compat/compat-spwd.c
fsf/trunk/libc/sysdeps/mach/hurd/bits/fcntl.h
fsf/trunk/libc/sysdeps/mach/hurd/i386/tls.h
fsf/trunk/libc/sysdeps/mach/hurd/sigaction.c
fsf/trunk/libc/sysdeps/mach/hurd/sigsuspend.c
fsf/trunk/libc/sysdeps/mach/hurd/tls.h
fsf/trunk/libc/sysdeps/mach/i386/sysdep.h
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Mon Jul 23 00:02:42 2007
@@ -1,14 +1,37 @@
+2007-07-22 Roland McGrath <roland@xxxxxxxx>
+
+ * hurd/getdport.c: Add missing copyright year update.
+
+ * sysdeps/mach/hurd/bits/fcntl.h [__USE_GNU] (O_CLOEXEC): New macro.
+ * hurd/port2fd.c (_hurd_port2fd): Implement O_CLOEXEC.
+
+2007-07-22 Ulrich Drepper <drepper@xxxxxxxxxx>
+
+ * login/utmp_file.c (setutent_file): Use O_CLOEXEC if possible.
+
+ * libio/fileops.c (_IO_new_file_fopen): Recognize 'e' flag and set
+ O_CLOEXEC is needed.
+ * nis/nss_compat/compat-grp.c: Use 'e' flag when opening file.
+ Avoid additional fcntl to set O_CLOEXEC if not needed.
+ * nis/nss_compat/compat-initgroups.c: Likewise.
+ * nis/nss_compat/compat-pwd.c: Likewise.
+ * nis/nss_compat/compat-spwd.c: Likewise.
+
2007-07-21 Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
+ [BZ #3665]
* manual/errno.texi: Change ECANCELED value to 119.
+ [BZ #4610]
* mach/lock-intern.h: Include <sys/cdefs.h>.
+ [BZ #4178]
* sysdeps/mach/hurd/sigaction.c (__sigaction): Check ACT != NULL before
reading A.
- * sysdeps/mach/hurd/sigsuspend.c (sigsuspend_not_cancel): Define alias
- to __sigsuspend.
+ [BZ #4126]
+ * sysdeps/mach/hurd/sigsuspend.c (sigsuspend_not_cancel): Define alias
+ to __sigsuspend.
* sysdeps/mach/i386/sysdep.h: Include <dl-sysdep.h> and <tls.h>.
Modified: fsf/trunk/libc/hurd/getdport.c
==============================================================================
--- fsf/trunk/libc/hurd/getdport.c (original)
+++ fsf/trunk/libc/hurd/getdport.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1994,1995,1997,2007 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
Modified: fsf/trunk/libc/hurd/port2fd.c
==============================================================================
--- fsf/trunk/libc/hurd/port2fd.c (original)
+++ fsf/trunk/libc/hurd/port2fd.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1997, 1999, 2007 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,7 +55,7 @@
mach_port_t old
= _hurd_userlink_clear (&d->port.users) ? d->port.port : MACH_PORT_NULL;
d->port.port = dport;
- d->flags = 0;
+ d->flags = (flags & O_CLOEXEC) ? FD_CLOEXEC : 0;
if (old != MACH_PORT_NULL)
__mach_port_deallocate (__mach_task_self (), old);
}
Modified: fsf/trunk/libc/libio/fileops.c
==============================================================================
--- fsf/trunk/libc/libio/fileops.c (original)
+++ fsf/trunk/libc/libio/fileops.c Mon Jul 23 00:02:42 2007
@@ -320,6 +320,11 @@
case 'c':
fp->_flags2 |= _IO_FLAGS2_NOTCANCEL;
break;
+#ifdef O_CLOEXEC
+ case 'e':
+ oflags |= O_CLOEXEC;
+ break;
+#endif
default:
/* Ignore. */
continue;
Modified: fsf/trunk/libc/login/utmp_file.c
==============================================================================
--- fsf/trunk/libc/login/utmp_file.c (original)
+++ fsf/trunk/libc/login/utmp_file.c Mon Jul 23 00:02:42 2007
@@ -27,6 +27,7 @@
#include <unistd.h>
#include <utmp.h>
#include <not-cancel.h>
+#include <kernel-features.h>
#include "utmp-private.h"
#include "utmp-equal.h"
@@ -140,24 +141,47 @@
file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name);
- file_fd = open_not_cancel_2 (file_name, O_RDWR | O_LARGEFILE);
+#ifdef O_CLOEXEC
+# define O_flags O_LARGEFILE | O_CLOEXEC
+#else
+# define O_flags O_LARGEFILE
+#endif
+ file_fd = open_not_cancel_2 (file_name, O_RDWR | O_flags);
if (file_fd == -1)
{
/* Hhm, read-write access did not work. Try read-only. */
- file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_LARGEFILE);
+ file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_flags);
if (file_fd == -1)
return 0;
}
- /* We have to make sure the file is `closed on exec'. */
- result = fcntl_not_cancel (file_fd, F_GETFD, 0);
- if (result >= 0)
- result = fcntl_not_cancel (file_fd, F_SETFD, result | FD_CLOEXEC);
- if (result == -1)
+#ifndef __ASSUME_O_CLOEXEC
+# ifdef O_CLOEXEC
+ static int have_o_cloexec;
+
+ if (have_o_cloexec <= 0)
+# endif
{
- close_not_cancel_no_status (file_fd);
- return 0;
+ /* We have to make sure the file is `closed on exec'. */
+ result = fcntl_not_cancel (file_fd, F_GETFD, 0);
+ if (result >= 0)
+ {
+# ifdef O_CLOEXEC
+ if (have_o_cloexec == 0)
+ have_o_cloexec = (result & FD_CLOEXEC) ? 1 : -1;
+# endif
+
+ result = fcntl_not_cancel (file_fd, F_SETFD,
+ result | FD_CLOEXEC);
+ }
+
+ if (result == -1)
+ {
+ close_not_cancel_no_status (file_fd);
+ return 0;
+ }
}
+#endif
}
__lseek64 (file_fd, 0, SEEK_SET);
Modified: fsf/trunk/libc/nis/nss_compat/compat-grp.c
==============================================================================
--- fsf/trunk/libc/nis/nss_compat/compat-grp.c (original)
+++ fsf/trunk/libc/nis/nss_compat/compat-grp.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001-2005,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999, 2001-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@xxxxxxx>, 1996.
@@ -27,6 +27,7 @@
#include <string.h>
#include <rpc/types.h>
#include <bits/libc-lock.h>
+#include <kernel-features.h>
static service_user *ni;
static enum nss_status (*nss_setgrent) (int stayopen);
@@ -70,6 +71,19 @@
/* Protect global state against multiple changers. */
__libc_lock_define_initialized (static, lock)
+/* Positive if O_CLOEXEC is supported, negative if it is not supported,
+ zero if it is still undecided. This variable is shared with the
+ other compat functions. */
+#ifdef __ASSUME_O_CLOEXEC
+# define __compat_have_cloexec 1
+#else
+# ifdef O_CLOEXEC
+int __compat_have_cloexec;
+# else
+# define __compat_have_cloexec -1
+# endif
+#endif
+
/* Prototypes for local functions. */
static void blacklist_store_name (const char *, ent_t *);
static int in_blacklist (const char *, int, ent_t *);
@@ -107,21 +121,36 @@
if (ent->stream == NULL)
{
- ent->stream = fopen ("/etc/group", "rm");
+ ent->stream = fopen ("/etc/group", "rme");
if (ent->stream == NULL)
status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
else
{
/* We have to make sure the file is `closed on exec'. */
- int result, flags;
-
- result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
- if (result >= 0)
- {
- flags |= FD_CLOEXEC;
- result = fcntl (fileno_unlocked (ent->stream), F_SETFD, flags);
- }
+ int result = 0;
+
+ if (__compat_have_cloexec <= 0)
+ {
+ int flags;
+ result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD,
+ 0);
+ if (result >= 0)
+ {
+#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC
+ if (__compat_have_cloexec == 0)
+ __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1;
+
+ if (__compat_have_cloexec < 0)
+#endif
+ {
+ flags |= FD_CLOEXEC;
+ result = fcntl (fileno_unlocked (ent->stream), F_SETFD,
+ flags);
+ }
+ }
+ }
+
if (result < 0)
{
/* Something went wrong. Close the stream and return a
Modified: fsf/trunk/libc/nis/nss_compat/compat-initgroups.c
==============================================================================
--- fsf/trunk/libc/nis/nss_compat/compat-initgroups.c (original)
+++ fsf/trunk/libc/nis/nss_compat/compat-initgroups.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998-2003, 2004, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2004, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@xxxxxxx>, 1998.
@@ -30,6 +30,7 @@
#include <sys/param.h>
#include <nsswitch.h>
#include <bits/libc-lock.h>
+#include <kernel-features.h>
static service_user *ni;
/* Type of the lookup function. */
@@ -74,6 +75,19 @@
typedef struct ent_t ent_t;
+/* Positive if O_CLOEXEC is supported, negative if it is not supported,
+ zero if it is still undecided. This variable is shared with the
+ other compat functions. */
+#ifdef __ASSUME_O_CLOEXEC
+# define __compat_have_cloexec 1
+#else
+# ifdef O_CLOEXEC
+extern int __compat_have_cloexec;
+# else
+# define __compat_have_cloexec -1
+# endif
+#endif
+
/* Prototypes for local functions. */
static void blacklist_store_name (const char *, ent_t *);
static int in_blacklist (const char *, int, ent_t *);
@@ -117,21 +131,35 @@
else
ent->blacklist.current = 0;
- ent->stream = fopen ("/etc/group", "rm");
+ ent->stream = fopen ("/etc/group", "rme");
if (ent->stream == NULL)
status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
else
{
/* We have to make sure the file is `closed on exec'. */
- int result, flags;
-
- result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
- if (result >= 0)
- {
- flags |= FD_CLOEXEC;
- result = fcntl (fileno_unlocked (ent->stream), F_SETFD, flags);
- }
+ int result = 0;
+
+ if (__compat_have_cloexec <= 0)
+ {
+ int flags;
+ result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
+ if (result >= 0)
+ {
+#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC
+ if (__compat_have_cloexec == 0)
+ __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1;
+
+ if (__compat_have_cloexec < 0)
+#endif
+ {
+ flags |= FD_CLOEXEC;
+ result = fcntl (fileno_unlocked (ent->stream), F_SETFD,
+ flags);
+ }
+ }
+ }
+
if (result < 0)
{
/* Something went wrong. Close the stream and return a
Modified: fsf/trunk/libc/nis/nss_compat/compat-pwd.c
==============================================================================
--- fsf/trunk/libc/nis/nss_compat/compat-pwd.c (original)
+++ fsf/trunk/libc/nis/nss_compat/compat-pwd.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001-2005,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999, 2001-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@xxxxxxxxxxxxxxxxxxx>, 1996.
@@ -29,6 +29,7 @@
#include <rpc/types.h>
#include <rpcsvc/ypclnt.h>
#include <bits/libc-lock.h>
+#include <kernel-features.h>
#include "netgroup.h"
@@ -80,6 +81,19 @@
/* Protect global state against multiple changers. */
__libc_lock_define_initialized (static, lock)
+/* Positive if O_CLOEXEC is supported, negative if it is not supported,
+ zero if it is still undecided. This variable is shared with the
+ other compat functions. */
+#ifdef __ASSUME_O_CLOEXEC
+# define __compat_have_cloexec 1
+#else
+# ifdef O_CLOEXEC
+extern int __compat_have_cloexec;
+# else
+# define __compat_have_cloexec -1
+# endif
+#endif
+
/* Prototypes for local functions. */
static void blacklist_store_name (const char *, ent_t *);
static int in_blacklist (const char *, int, ent_t *);
@@ -227,21 +241,36 @@
if (ent->stream == NULL)
{
- ent->stream = fopen ("/etc/passwd", "rm");
+ ent->stream = fopen ("/etc/passwd", "rme");
if (ent->stream == NULL)
status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
else
{
/* We have to make sure the file is `closed on exec'. */
- int result, flags;
-
- result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
- if (result >= 0)
- {
- flags |= FD_CLOEXEC;
- result = fcntl (fileno_unlocked (ent->stream), F_SETFD, flags);
- }
+ int result = 0;
+
+ if (__compat_have_cloexec <= 0)
+ {
+ int flags;
+ result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD,
+ 0);
+ if (result >= 0)
+ {
+#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC
+ if (__compat_have_cloexec == 0)
+ __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1;
+
+ if (__compat_have_cloexec < 0)
+#endif
+ {
+ flags |= FD_CLOEXEC;
+ result = fcntl (fileno_unlocked (ent->stream), F_SETFD,
+ flags);
+ }
+ }
+ }
+
if (result < 0)
{
/* Something went wrong. Close the stream and return a
Modified: fsf/trunk/libc/nis/nss_compat/compat-spwd.c
==============================================================================
--- fsf/trunk/libc/nis/nss_compat/compat-spwd.c (original)
+++ fsf/trunk/libc/nis/nss_compat/compat-spwd.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001-2005,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999, 2001-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@xxxxxxxxxxxxxxxxxxx>, 1996.
@@ -29,6 +29,7 @@
#include <rpc/types.h>
#include <rpcsvc/ypclnt.h>
#include <bits/libc-lock.h>
+#include <kernel-features.h>
#include "netgroup.h"
@@ -76,6 +77,19 @@
/* Protect global state against multiple changers. */
__libc_lock_define_initialized (static, lock)
+
+/* Positive if O_CLOEXEC is supported, negative if it is not supported,
+ zero if it is still undecided. This variable is shared with the
+ other compat functions. */
+#ifdef __ASSUME_O_CLOEXEC
+# define __compat_have_cloexec 1
+#else
+# ifdef O_CLOEXEC
+extern int __compat_have_cloexec;
+# else
+# define __compat_have_cloexec -1
+# endif
+#endif
/* Prototypes for local functions. */
static void blacklist_store_name (const char *, ent_t *);
@@ -180,21 +194,36 @@
if (ent->stream == NULL)
{
- ent->stream = fopen ("/etc/shadow", "rm");
+ ent->stream = fopen ("/etc/shadow", "rme");
if (ent->stream == NULL)
status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
else
{
/* We have to make sure the file is `closed on exec'. */
- int result, flags;
-
- result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
- if (result >= 0)
- {
- flags |= FD_CLOEXEC;
- result = fcntl (fileno_unlocked (ent->stream), F_SETFD, flags);
- }
+ int result = 0;
+
+ if (__compat_have_cloexec <= 0)
+ {
+ int flags;
+ result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD,
+ 0);
+ if (result >= 0)
+ {
+#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC
+ if (__compat_have_cloexec == 0)
+ __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1;
+
+ if (__compat_have_cloexec < 0)
+#endif
+ {
+ flags |= FD_CLOEXEC;
+ result = fcntl (fileno_unlocked (ent->stream), F_SETFD,
+ flags);
+ }
+ }
+ }
+
if (result < 0)
{
/* Something went wrong. Close the stream and return a
Modified: fsf/trunk/libc/sysdeps/mach/hurd/bits/fcntl.h
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/bits/fcntl.h (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/bits/fcntl.h Mon Jul 23 00:02:42 2007
@@ -1,5 +1,6 @@
/* O_*, F_*, FD_* bit values for GNU.
- Copyright (C) 1993,94,96,97,98,99,2000,01,04 Free Software Foundation, Inc.
+ Copyright (C) 1993,1994,1996,1997,1998,1999,2000,2001,2004,2007
+ 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,6 +71,7 @@
#define O_SYNC O_FSYNC
#ifdef __USE_GNU
# define O_NOATIME 0x0800 /* Don't set access time on read (owner). */
+# define O_CLOEXEC 0x00010000 /* Set FD_CLOEXEC. */
#endif
#ifdef __USE_MISC
# define O_SHLOCK 0x00020000 /* Open with shared file lock. */
Modified: fsf/trunk/libc/sysdeps/mach/hurd/i386/tls.h
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/i386/tls.h (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/i386/tls.h Mon Jul 23 00:02:42 2007
@@ -1,5 +1,5 @@
/* Definitions for thread-local data handling. Hurd/i386 version.
- Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2006, 2007 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
Modified: fsf/trunk/libc/sysdeps/mach/hurd/sigaction.c
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/sigaction.c (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/sigaction.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,6 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2002, 2007
+ 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
Modified: fsf/trunk/libc/sysdeps/mach/hurd/sigsuspend.c
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/sigsuspend.c (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/sigsuspend.c Mon Jul 23 00:02:42 2007
@@ -1,4 +1,6 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,98,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2002, 2007
+ 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
Modified: fsf/trunk/libc/sysdeps/mach/hurd/tls.h
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/tls.h (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/tls.h Mon Jul 23 00:02:42 2007
@@ -1,5 +1,5 @@
/* Definitions for thread-local data handling. Hurd version.
- Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2005, 2007 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
Modified: fsf/trunk/libc/sysdeps/mach/i386/sysdep.h
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/i386/sysdep.h (original)
+++ fsf/trunk/libc/sysdeps/mach/i386/sysdep.h Mon Jul 23 00:02:42 2007
@@ -1,4 +1,6 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2007
+ 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