mirror of git://sourceware.org/git/glibc.git
Updated to fedora-glibc-20080728T2320
This commit is contained in:
parent
c83494a925
commit
c7045198ca
264
ChangeLog
264
ChangeLog
|
|
@ -1,3 +1,267 @@
|
|||
2008-07-28 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* resolv/res_send.c (__libc_res_nsend): Take additional parameter.
|
||||
Use it instead of locally defined resplen2 variable.
|
||||
(res_nsend): Adjust for __libc_res_nsend interface change.
|
||||
(send_vc): Initialize *resplen2 if necessary. Read length of
|
||||
package into an appropriately aligned variable. Store converted length
|
||||
in new variable and use it appropriately.
|
||||
Add branch prediction help.
|
||||
* resolv/res_query.c (__libc_res_nquery): Take additional parameter
|
||||
and pass it on to __libc_res_nsend. Adjust all callers.
|
||||
(__libc_res_nsearch): Likewise.
|
||||
(__libc_res_nqeurydomain): Likewise.
|
||||
* resolv/nss_dns/dns-host.c: Adjust for __libc_res_nsearch interface
|
||||
change.
|
||||
(_nss_dns_gethostbyname4): Don't unconditionally allocate tmp array.
|
||||
Define resplen2 variable and pass it to __libc_res_nsearch and then
|
||||
to gaih_getanswer.
|
||||
(getanswer_r): In case of incorrect DNS data don't overread buffer.
|
||||
Add branch prediction.
|
||||
(gaih_getanswer_slice): Likewise. Check for invalid data types.
|
||||
(gaih_getanswer): Don't decode second slice if first one failed due
|
||||
to a too small buffer. Don't let not found status of second
|
||||
decoder shadow results of the first.
|
||||
* resolv/gethnamaddr.c (gethostbyname2): Adjust for __libc_res_nsearch
|
||||
and __libc_res_nquery interface changes
|
||||
(gethostbyaddr): Adjust for __libc_res_nquery interface change.
|
||||
* include/resolv.h: Adjust prototypes for __libc_res_nquery,
|
||||
__libc_res_nsearch, and __libc_res_nsend.
|
||||
* resolv/nss_dns/dns-canon.c: Adjust for __libc_res_nquery interface
|
||||
change.
|
||||
* resolv/nss_dns/dns-network.c: Adjust for __libc_res_nquery and
|
||||
__libc_res_nsearch interface changes.
|
||||
|
||||
2008-07-27 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* libio/iopopen.c (_IO_new_proc_open): Remove unnecessary volatile.
|
||||
|
||||
* posix/wordexp.c (exec_comm): Use pipe2 if possible to create
|
||||
file descriptors with close-on-exec set.
|
||||
(exec_comm_child): Fix the case where the write end of the pipe is
|
||||
STDOUT_FILENO already. In case it is, clear close-on-exec.
|
||||
|
||||
* sysdeps/unix/sysv/linux/syscalls.list: Add __pipe2 alias.
|
||||
* io/pipe2.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/kernel-features.h: Define __ASSUME_PIPE2
|
||||
instead of __ASSUME_PACCEPT.
|
||||
* include/unistd.h: Declare __have_pipe2.
|
||||
* libio/iopopen.c: Implement "e" flag.
|
||||
* libio/Makefile (tests): Add tst-popen1.
|
||||
* libio/tst-popen1.c: New file.
|
||||
|
||||
* sysdeps/unix/sysv/linux/bits/socket.h: Define PF_ISDN and AF_ISDN.
|
||||
* sysdeps/unix/sysv/linux/sparc/bits/socket.h: Likewise.
|
||||
|
||||
2008-07-26 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
[BZ #6771]
|
||||
* libio/fileops.c (_IO_new_file_attach): Preserve errno around
|
||||
success call of _IO_SEEKOFF or calls which failed because the
|
||||
descriptor is for a pipe.
|
||||
|
||||
* sunrpc/key_call.c (getkeyserv_handle): Use FD_CLOEXEC instead of
|
||||
magic number.
|
||||
|
||||
* misc/syslog.c (openlog_internal): Use SOCK_CLOEXEC if possible.
|
||||
|
||||
* malloc/mtrace.c (mtrace): Use 'e' flag in fopen call. Drop
|
||||
F_SETFD use if we know fopen set the flag.
|
||||
|
||||
* login/utmp_file.c (setutent_file): Minor optimization in case
|
||||
O_CLOEXEC is available.
|
||||
|
||||
2008-07-24 Tom "spot" Callaway <tcallawa@redhat.com>
|
||||
|
||||
* Makeconfig: Define pie-ccflag and PIE-ccflag variables.
|
||||
* elf/Makefile: Use pie-ccflag variable.
|
||||
* nscd/Makefile: Likewise.
|
||||
* sysdeps/sparc/Makefile: Set $(pie-ccflag) to -fPIE.
|
||||
|
||||
2008-07-21 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
[BZ #6724]
|
||||
* Versions.def: Add GLIBC_2.9 version tag for libutil.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/utmp.h: Copy of
|
||||
gnu/bits/utmp.h. Check for __WORDSIZE_COMPAT32 removed.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/utmpx.h: Copy of
|
||||
gnu/bits/utmpx.h. Check for __WORDSIZE_COMPAT32 removed.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Add new files
|
||||
utmp32, utmpx32 and login32.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/Versions: Add 2.9
|
||||
versions of struct utmp functions to libc and libutil.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmp-compat.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutent.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutent_r.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutid_r.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutline.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutline_r.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutmp.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutxent.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutxid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/getutxline.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/login.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/login32.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/pututxline.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/updwtmp.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/updwtmpx.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmp-convert.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmp32.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmp32.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmpx-convert.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmpx32.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/utmpx32.h: New file.
|
||||
|
||||
2008-07-26 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* scripts/gen-as-const.awk: Generate more widely usable code by
|
||||
using 64-bit arithmetic.
|
||||
|
||||
* stdio-common/printf_fp.c (___printf_fp): Give wide outout code
|
||||
the same treatment as narrow output code in last patch.
|
||||
|
||||
* sunrpc/clnt_udp.c (__libc_clntudp_bufcreate): Namespace cleanup.
|
||||
|
||||
[BZ #6763]
|
||||
* elf/dl-load.c (local_strdup): Remove inline.
|
||||
(_dl_map_object_from_fd): Don't allocate l_symbolic_searchlist.r_list.
|
||||
* elf/dl-object.c (_dl_new_object): Allocate symbolic searchlist as
|
||||
part of the object.
|
||||
|
||||
* sysdeps/unix/sysv/linux/dl-origin.c: Add const to avoid warning.
|
||||
|
||||
2008-07-25 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/kernel-features.h: IA-64 and SPARC have
|
||||
the new syscalls, too.
|
||||
|
||||
* sysdeps/i386/i686/memcmp.S: Fix unwind information.
|
||||
Reported by Paul Pluzhnikov <ppluzhnikov@google.com>.
|
||||
|
||||
[BZ #6698]
|
||||
* stdio-common/_i18n_number.h (_i18n_number_rewrite): Take additional
|
||||
parameter for end of buffer. If temporary copy is too large use
|
||||
malloc.
|
||||
* stdio-common/vfprintf.c: Adjust for _i18n_number_rewrite
|
||||
interface change.
|
||||
* stdio-common/printf_fp.c (__printf_fp): Likewise.. Account for
|
||||
string rewrite when allocating buffer.
|
||||
|
||||
* sysdeps/unix/sysv/linux/kernel-features.h: PPC has the new
|
||||
syscalls, too.
|
||||
|
||||
* nscd/connections.c (nscd_init): Clean up fcntl call.
|
||||
|
||||
* nscd/nscd_helper.c (open_socket): Use SOCK_CLOEXEC and
|
||||
SOCK_NONBLOCK if possible.
|
||||
|
||||
* sysdeps/unix/sysv/linux/opensock.c (__opensock): Use
|
||||
SOCK_CLOEXEC if available.
|
||||
|
||||
* include/rpc/clnt.h: Declare __libc_clntudp_bufcreate and
|
||||
__libc_clntudp_bufcreate_internal.
|
||||
* include/sys/socket.h: Declare __have_sock_cloexec.
|
||||
* socket/Makefile (aux): Add have_sock_cloexec.
|
||||
* socket/have_sock_cloexec.c: New file.
|
||||
* sunrpc/clnt_udp.h (clntudp_bufcreate): Now a wrapper around
|
||||
__libc_clntudp_bufcreate.
|
||||
(__libc_clntudp_bufcreate): Former implementation of clntudp_bufcreate
|
||||
which takes an additional parameter. Create socket with non-blocking
|
||||
mode and close-on-exec flag set, if wanted.
|
||||
* sunrpc/Versions: Export __libc_clntudp_bufcreate@GLIBC_PRIVATE.
|
||||
* nis/ypclnt.c (yp_bind_client_create): Use __libc_clntpudp_bufcreate
|
||||
instead of clntudp_create. The socket has already the close-on-exec
|
||||
flag set if SOCK_CLOEXEC is defined.
|
||||
|
||||
2008-07-24 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/kernel-features.h: Define
|
||||
__ASSUME_PACCEPT, __ASSUME_IN_NONBLOCK, and __ASSUME_PACCEPT if
|
||||
appropriate.
|
||||
* nscd/connections.c: Avoid fcntl calls to set close-on-exec flag and
|
||||
non-blocking mode by using socket, paccept, and inotify_init1.
|
||||
|
||||
* Versions.def (glibc): Add GLIBC_2.9.
|
||||
* io/Makefile (routines): Add dup3 and pipe2.
|
||||
* io/Versions [glibc] (GLIBC_2.9): Add dup3 and pipe2.
|
||||
* io/dup3.c: New file.
|
||||
* io/pipe2.c: New file.
|
||||
* posix/unistd.h: Declare dup3 and pipe2.
|
||||
* socket/Makefile (routines): Add paccept.
|
||||
* socket/Versions [glibc] (GLIBC_2.9): Add paccept.
|
||||
* socket/paccept.c: New file.
|
||||
* socket/sys/socket.h: Declare paccept.
|
||||
* sysdeps/unix/syscalls.list: Add entry for dup3.
|
||||
* sysdeps/unix/sysv/linux/Versions [glibc] (GLIBC_2.9): Add
|
||||
epoll_create2 and inotify_init1.
|
||||
* sysdeps/unix/sysv/linux/eventfd.c: Use eventfd1 syscall if possible.
|
||||
* sysdeps/unix/sysv/linux/paccept.c: New file.
|
||||
* sysdeps/unix/sysv/linux/signalfd.c: Use signalfd4 syscall if
|
||||
possible.
|
||||
* sysdeps/unix/sysv/linux/socketcall.h: Add SOCKOP_paccept.
|
||||
* sysdeps/unix/sysv/linux/syscalls.list: Add epoll_create2,
|
||||
inotify_init1, and pipe2 entries.
|
||||
* sysdeps/unix/sysv/linux/alpha/sys/epoll.h: New file.
|
||||
* sysdeps/unix/sysv/linux/alpha/sys/eventfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/alpha/sys/inotify.h: New file.
|
||||
* sysdeps/unix/sysv/linux/alpha/sys/signalfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/alpha/sys/timerfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/bits/socket.h: Define SOCK_CLOEXEC and
|
||||
SOCK_NONBLOCK.
|
||||
* sysdeps/unix/sysv/linux/i386/paccept.S: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sys/epoll.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sys/eventfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sys/inotify.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sys/signalfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/sys/timerfd.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sparc/bits/socket.h: New file.
|
||||
* sysdeps/unix/sysv/linux/sys/epoll.h: Define EPOLL_CLOEXEC and
|
||||
EPOLL_NONBLOCK. Declare epoll_create2.
|
||||
* sysdeps/unix/sysv/linux/sys/eventfd.h: Define EFD_CLOEXEC and
|
||||
EFD_NONBLOCK.
|
||||
* sysdeps/unix/sysv/linux/sys/inotify.h: Define IN_CLOEXEC and
|
||||
IN_NONBLOCK. Declare inotify_init1.
|
||||
* sysdeps/unix/sysv/linux/sys/signalfd.h: Define SFD_CLOEXEC and
|
||||
SFD_NONBLOCK.
|
||||
* sysdeps/unix/sysv/linux/sys/timerfd.h: Define TFD_CLOEXEC and
|
||||
TFD_NONBLOCK.
|
||||
|
||||
* elf/elf.h: Define AT_EXECFN.
|
||||
* elf/rtld.c [!__ASSUME_AT_EXECFN] (process_envvars): Don't handle
|
||||
LD_ORIGIN_PATH.
|
||||
* elf/dl-sysdep.c (_dl_sysdep_start): Handle AT_EXECFN.
|
||||
* elf/dl-support.c: Define _dl_execfn. Don't define _dl_origin_path
|
||||
if __ASSUME_AT_EXECFN is defined.
|
||||
(_dl_aux_init): Handle AT_EXECFN.
|
||||
* sysdeps/unix/sysv/linux/kernel-features.h: Define __ASSUME_AT_EXECFN
|
||||
for 2.6.27 and up.
|
||||
* sysdeps/generic/ldsodefs.h (rtld_global_ro): Add _dl_execfn.
|
||||
Don't define _dl_origin_path if __ASSUME_AT_EXECFN is defined.
|
||||
* sysdeps/unix/sysv/linux/dl-origin.c (_dl_get_origin): Use
|
||||
_dl_execfn if available and avoid compatibility code if
|
||||
__ASSUME_AT_EXECFN is defined.
|
||||
|
||||
* sysdeps/unix/sysv/linux/dl-sysdep.h: Don't declare
|
||||
_dl_discover_osversion only for older kernels.
|
||||
|
||||
2008-07-22 Roland McGrath <roland@frob.com>
|
||||
|
||||
* hurd/fd-read.c (_hurd_fd_read): Fix last change.
|
||||
|
||||
2008-07-21 Roland McGrath <roland@frob.com>
|
||||
|
||||
* hurd/fd-read.c (_hurd_fd_read): Return EGRATUITOUS if the server
|
||||
returned too much data out of line.
|
||||
|
||||
2008-07-20 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* locale/setlocale.c (setname): Remove inline to avoid compiler
|
||||
warning.
|
||||
|
||||
[BZ #6712]
|
||||
* locale/setlocale.c (setlocale): Take the setlocale lock earlier.
|
||||
|
||||
2008-07-15 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* stdio-common/vfprintf.c (_IO_helper_overflow): In case _IO_sputn
|
||||
|
|
|
|||
|
|
@ -712,6 +712,10 @@ pic-ccflag = -fPIC
|
|||
# This one should always stay like this unless there is a very good reason.
|
||||
PIC-ccflag = -fPIC
|
||||
endif
|
||||
# This can be changed by a sysdep makefile
|
||||
pie-ccflag = -fpie
|
||||
# This one should always stay like this unless there is a very good reason.
|
||||
PIE-ccflag = -fPIE
|
||||
ifeq (yes,$(build-profile))
|
||||
# Under --enable-profile, we will build a static library of profiled objects.
|
||||
# The profiled object files are named foo.op.
|
||||
|
|
|
|||
12
NEWS
12
NEWS
|
|
@ -1,4 +1,4 @@
|
|||
GNU C Library NEWS -- history of user-visible changes. 2008-5-14
|
||||
GNU C Library NEWS -- history of user-visible changes. 2008-7-27
|
||||
Copyright (C) 1992-2007, 2008 Free Software Foundation, Inc.
|
||||
See the end for copying conditions.
|
||||
|
||||
|
|
@ -22,10 +22,18 @@ Version 2.9
|
|||
|
||||
* New implementation of memmem, strstr, and strcasestr which is O(n).
|
||||
Implemented by Eric Blake.
|
||||
|
||||
* New Linux interfaces: inotify_init1, paccept, dup3, epoll_create2, pipe2
|
||||
|
||||
* Implement "e" option for popen to open file descriptor with the
|
||||
close-on-exec flag set
|
||||
|
||||
* Many functions, exported and internal, now atomically set the close-on-exec
|
||||
flag when run on a sufficiently new kernel. Implemented by Ulrich Drepper.
|
||||
|
||||
Version 2.8
|
||||
|
||||
* New locales: bo_CN, bo_IN.
|
||||
* New locales: bo_CN, bo_IN, shs_CA.
|
||||
|
||||
* New encoding: HP-ROMAN9, HP-GREEK8, HP-THAI8, HP-TURKISH8.
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ libc {
|
|||
GLIBC_2.6
|
||||
GLIBC_2.7
|
||||
GLIBC_2.8
|
||||
GLIBC_2.9
|
||||
%ifdef USE_IN_LIBIO
|
||||
HURD_CTHREADS_0.3
|
||||
%endif
|
||||
|
|
@ -105,6 +106,7 @@ librt {
|
|||
}
|
||||
libutil {
|
||||
GLIBC_2.0
|
||||
GLIBC_2.9
|
||||
}
|
||||
ld {
|
||||
GLIBC_2.0
|
||||
|
|
|
|||
|
|
@ -800,7 +800,7 @@ $(objpfx)tst-array5-static.out: $(objpfx)tst-array5-static
|
|||
cmp $@ tst-array5-static.exp > /dev/null
|
||||
|
||||
ifeq (yesyes,$(have-fpie)$(build-shared))
|
||||
CFLAGS-tst-pie1.c += -fpie
|
||||
CFLAGS-tst-pie1.c += $(pie-ccflag)
|
||||
|
||||
$(objpfx)tst-pie1.out: $(objpfx)tst-pie1
|
||||
$(elf-objpfx)$(rtld-installed-name) \
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ static const size_t system_dirs_len[] =
|
|||
|
||||
|
||||
/* Local version of `strdup' function. */
|
||||
static inline char *
|
||||
static char *
|
||||
local_strdup (const char *s)
|
||||
{
|
||||
size_t len = strlen (s) + 1;
|
||||
|
|
@ -1470,15 +1470,6 @@ cannot enable executable stack as shared object requires");
|
|||
{
|
||||
/* Create an appropriate searchlist. It contains only this map.
|
||||
This is the definition of DT_SYMBOLIC in SysVr4. */
|
||||
l->l_symbolic_searchlist.r_list =
|
||||
(struct link_map **) malloc (sizeof (struct link_map *));
|
||||
|
||||
if (l->l_symbolic_searchlist.r_list == NULL)
|
||||
{
|
||||
errstring = N_("cannot create searchlist");
|
||||
goto call_lose_errno;
|
||||
}
|
||||
|
||||
l->l_symbolic_searchlist.r_list[0] = l;
|
||||
l->l_symbolic_searchlist.r_nlist = 1;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Storage management for the chain of loaded shared objects.
|
||||
Copyright (C) 1995-2002, 2004, 2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2002,2004,2006,2007,2008 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
|
||||
|
|
@ -50,13 +50,17 @@ _dl_new_object (char *realname, const char *libname, int type,
|
|||
#endif
|
||||
|
||||
new = (struct link_map *) calloc (sizeof (*new) + audit_space
|
||||
+ sizeof (struct link_map *)
|
||||
+ sizeof (*newname) + libname_len, 1);
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
||||
new->l_real = new;
|
||||
new->l_libname = newname = (struct libname_list *) ((char *) (new + 1)
|
||||
+ audit_space);
|
||||
new->l_symbolic_searchlist.r_list = (struct link_map **) ((char *) (new + 1)
|
||||
+ audit_space);
|
||||
|
||||
new->l_libname = newname
|
||||
= (struct libname_list *) (new->l_symbolic_searchlist.r_list + 1);
|
||||
newname->name = (char *) memcpy (newname + 1, libname, libname_len);
|
||||
/* newname->next = NULL; We use calloc therefore not necessary. */
|
||||
newname->dont_free = 1;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Support for dynamic linking code in static libc.
|
||||
Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996-2005, 2006, 2007, 2008 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
|
||||
|
|
@ -62,8 +62,12 @@ struct link_map *_dl_profile_map;
|
|||
/* This is the address of the last stack address ever used. */
|
||||
void *__libc_stack_end;
|
||||
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
/* Path where the binary is found. */
|
||||
const char *_dl_origin_path;
|
||||
#endif
|
||||
/* File Name of the executable. */
|
||||
const char *_dl_execfn;
|
||||
|
||||
/* Nonzero if runtime lookup should not update the .got/.plt. */
|
||||
int _dl_bind_not;
|
||||
|
|
@ -216,6 +220,9 @@ _dl_aux_init (ElfW(auxv_t) *av)
|
|||
__libc_enable_secure = av->a_un.a_val;
|
||||
__libc_enable_secure_decided = 1;
|
||||
break;
|
||||
case AT_EXECFN:
|
||||
GLRO(dl_execfn) = (void *) av->a_un.a_val;
|
||||
break;
|
||||
# ifdef DL_PLATFORM_AUXV
|
||||
DL_PLATFORM_AUXV
|
||||
# endif
|
||||
|
|
|
|||
|
|
@ -173,6 +173,9 @@ _dl_sysdep_start (void **start_argptr,
|
|||
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
case AT_EXECFN:
|
||||
GLRO(dl_execfn) = (void *) av->a_un.a_val;
|
||||
break;
|
||||
#ifdef DL_PLATFORM_AUXV
|
||||
DL_PLATFORM_AUXV
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -970,6 +970,8 @@ typedef struct
|
|||
|
||||
#define AT_SECURE 23 /* Boolean, was exec setuid-like? */
|
||||
|
||||
#define AT_EXECFN 31 /* Filename of executable. */
|
||||
|
||||
/* Pointer to the global system page used for system calls and other
|
||||
nice things. */
|
||||
#define AT_SYSINFO 32
|
||||
|
|
|
|||
|
|
@ -2579,10 +2579,12 @@ process_envvars (enum mode *modep)
|
|||
break;
|
||||
|
||||
case 11:
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
/* Path where the binary is found. */
|
||||
if (!INTUSE(__libc_enable_secure)
|
||||
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
||||
GLRO(dl_origin_path) = &envline[12];
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 12:
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@ glibc-branch := fedora
|
|||
glibc-base := HEAD
|
||||
DIST_BRANCH := devel
|
||||
COLLECTION := dist-f8
|
||||
fedora-sync-date := 2008-07-16 09:44 UTC
|
||||
fedora-sync-tag := fedora-glibc-20080716T0944
|
||||
fedora-sync-date := 2008-07-28 23:20 UTC
|
||||
fedora-sync-tag := fedora-glibc-20080728T2320
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: @glibcversion@
|
||||
Release: 9
|
||||
Release: 10
|
||||
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
||||
# Things that are linked directly into dynamically linked programs
|
||||
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
||||
|
|
@ -976,6 +976,14 @@ rm -f *.filelist*
|
|||
%endif
|
||||
|
||||
%changelog
|
||||
* Tue Jul 29 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-10
|
||||
- update from trunk
|
||||
- resolver fixes
|
||||
- misc fixes (BZ#6771, BZ#6763, BZ#6698, BZ#6712)
|
||||
- s390{,x} utmp/utmpx bi-arch support (BZ#6724)
|
||||
- popen "e" flag
|
||||
- fr_FR locale changes reenabled
|
||||
|
||||
* Wed Jul 16 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-9
|
||||
- update from trunk
|
||||
- fix unbuffered vfprintf if writing to the stream fails (#455360)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1993,94,95,97,99,2002 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993,94,95,97,99,2002,2008 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
|
||||
|
|
@ -41,6 +41,11 @@ _hurd_fd_read (struct hurd_fd *fd, void *buf, size_t *nbytes, loff_t offset)
|
|||
|
||||
if (data != buf)
|
||||
{
|
||||
if (nread > *nbytes) /* Sanity check for bogus server. */
|
||||
{
|
||||
__vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
|
||||
return EGRATUITOUS;
|
||||
}
|
||||
memcpy (buf, data, nread);
|
||||
__vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,11 +58,11 @@ libc_hidden_proto (__res_randomid)
|
|||
libc_hidden_proto (__res_state)
|
||||
|
||||
int __libc_res_nquery (res_state, const char *, int, int, u_char *, int,
|
||||
u_char **, u_char **, int *);
|
||||
u_char **, u_char **, int *, int *);
|
||||
int __libc_res_nsearch (res_state, const char *, int, int, u_char *, int,
|
||||
u_char **, u_char **, int *);
|
||||
u_char **, u_char **, int *, int *);
|
||||
int __libc_res_nsend (res_state, const u_char *, int, const u_char *, int,
|
||||
u_char *, int, u_char **, u_char **, int *)
|
||||
u_char *, int, u_char **, u_char **, int *, int *)
|
||||
attribute_hidden;
|
||||
|
||||
libresolv_hidden_proto (_sethtent)
|
||||
|
|
|
|||
|
|
@ -21,6 +21,18 @@ extern CLIENT *clntudp_bufcreate_internal (struct sockaddr_in *__raddr,
|
|||
struct timeval __wait_resend,
|
||||
int *__sockp, u_int __sendsz,
|
||||
u_int __recvsz) attribute_hidden;
|
||||
extern CLIENT *__libc_clntudp_bufcreate (struct sockaddr_in *__raddr,
|
||||
u_long __program, u_long __version,
|
||||
struct timeval __wait_resend,
|
||||
int *__sockp, u_int __sendsz,
|
||||
u_int __recvsz, int __flags);
|
||||
extern CLIENT *__libc_clntudp_bufcreate_internal (struct sockaddr_in *__raddr,
|
||||
u_long __program,
|
||||
u_long __version,
|
||||
struct timeval __wait_resend,
|
||||
int *__sockp, u_int __sendsz,
|
||||
u_int __recvsz, int __flags)
|
||||
attribute_hidden;
|
||||
extern CLIENT *clntunix_create_internal (struct sockaddr_un *__raddr,
|
||||
u_long __program, u_long __version,
|
||||
int *__sockp, u_int __sendsz,
|
||||
|
|
|
|||
|
|
@ -153,4 +153,12 @@ extern int __libc_sa_len_internal (sa_family_t __af) attribute_hidden;
|
|||
# define __connect(fd, addr, len) INTUSE(__connect) (fd, addr, len)
|
||||
#endif
|
||||
|
||||
#ifdef SOCK_CLOEXEC
|
||||
extern int __have_sock_cloexec;
|
||||
/* At lot of other functionality became available at the same time as
|
||||
SOCK_CLOEXEC. Avoid defining separate variables for all of them
|
||||
unless it is really necessary. */
|
||||
# define __have_paccept __have_sock_cloexec
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ extern ssize_t __libc_write (int __fd, __const void *__buf, size_t __n);
|
|||
libc_hidden_proto (__libc_write)
|
||||
extern int __pipe (int __pipedes[2]);
|
||||
libc_hidden_proto (__pipe)
|
||||
extern int __pipe2 (int __pipedes[2], int __flags);
|
||||
extern unsigned int __sleep (unsigned int __seconds);
|
||||
extern int __chown (__const char *__file,
|
||||
__uid_t __owner, __gid_t __group);
|
||||
|
|
@ -165,4 +166,10 @@ extern int __libc_pause (void);
|
|||
/* Not cancelable variant. */
|
||||
extern int __pause_nocancel (void) attribute_hidden;
|
||||
|
||||
extern int __have_sock_cloexec;
|
||||
/* At lot of other functionality became available at the same time as
|
||||
SOCK_CLOEXEC. Avoid defining separate variables for all of them
|
||||
unless it is really necessary. */
|
||||
#define __have_pipe2 __have_sock_cloexec
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (C) 1992-2002,2003,2005,2006, 2007 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1992-2003,2005,2006,2007,2008 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 @@ routines := \
|
|||
open open64 openat openat64 close \
|
||||
read write lseek lseek64 access euidaccess faccessat \
|
||||
fcntl flock lockf lockf64 \
|
||||
dup dup2 pipe \
|
||||
dup dup2 dup3 pipe pipe2 \
|
||||
creat creat64 \
|
||||
chdir fchdir \
|
||||
getcwd getwd getdirname \
|
||||
|
|
|
|||
|
|
@ -119,4 +119,7 @@ libc {
|
|||
GLIBC_2.7 {
|
||||
__open_2; __open64_2; __openat_2; __openat64_2;
|
||||
}
|
||||
GLIBC_2.9 {
|
||||
dup3; pipe2;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
/* Copyright (C) 2008 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 <unistd.h>
|
||||
|
||||
|
||||
/* Duplicate FD to FD2, closing the old FD2 and making FD2 be
|
||||
open the same file as FD is which setting flags according to
|
||||
FLAGS. Return FD2 or -1. */
|
||||
int
|
||||
dup3 (fd, fd2, flags)
|
||||
int fd;
|
||||
int fd2;
|
||||
int flags;
|
||||
{
|
||||
if (fd < 0 || fd2 < 0)
|
||||
{
|
||||
__set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fd == fd2)
|
||||
/* No way to check that they are valid. */
|
||||
return fd2;
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (dup3)
|
||||
|
||||
#include <stub-tag.h>
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/* Copyright (C) 1991, 1995, 1996, 2002, 2008 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 <unistd.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* Create a one-way communication channel (__pipe). If successful,
|
||||
two file descriptors are stored in PIPEDES; bytes written on
|
||||
PIPEDES[1] can be read from PIPEDES[0]. Apply FLAGS to the new
|
||||
file descriptors. Returns 0 if successful, -1 if not. */
|
||||
int
|
||||
__pipe2 (pipedes, flags)
|
||||
int pipedes[2];
|
||||
int flags;
|
||||
{
|
||||
if (pipedes == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
weak_alias (__pipe2, pipe2)
|
||||
stub_warning (pipe2)
|
||||
|
||||
#include <stub-tag.h>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (C) 1995-2002,2003,2004,2006,2007 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1995-2004,2006,2007,2008 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
|
||||
|
|
@ -58,7 +58,7 @@ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \
|
|||
tst-memstream1 tst-memstream2 \
|
||||
tst-wmemstream1 tst-wmemstream2 \
|
||||
bug-memstream1 bug-wmemstream1 \
|
||||
tst-setvbuf1
|
||||
tst-setvbuf1 tst-popen1
|
||||
test-srcs = test-freopen
|
||||
|
||||
all: # Make this the default target; it will be defined in Rules.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1993, 1995, 1997-2005, 2006, 2007
|
||||
/* Copyright (C) 1993, 1995, 1997-2005, 2006, 2007, 2008
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Per Bothner <bothner@cygnus.com>.
|
||||
|
|
@ -428,9 +428,11 @@ _IO_new_file_attach (fp, fd)
|
|||
/* Get the current position of the file. */
|
||||
/* We have to do that since that may be junk. */
|
||||
fp->_offset = _IO_pos_BAD;
|
||||
int save_errno = errno;
|
||||
if (_IO_SEEKOFF (fp, (_IO_off64_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT)
|
||||
== _IO_pos_BAD && errno != ESPIPE)
|
||||
return NULL;
|
||||
__set_errno (save_errno);
|
||||
return fp;
|
||||
}
|
||||
INTDEF2(_IO_new_file_attach, _IO_file_attach)
|
||||
|
|
|
|||
120
libio/iopopen.c
120
libio/iopopen.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1993, 1997-2002, 2003, 2004, 2007
|
||||
/* Copyright (C) 1993, 1997-2002, 2003, 2004, 2007, 2008
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Per Bothner <bothner@cygnus.com>.
|
||||
|
|
@ -44,6 +44,7 @@
|
|||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
#ifndef _IO_fork
|
||||
#ifdef _LIBC
|
||||
|
|
@ -56,15 +57,6 @@ extern _IO_pid_t _IO_fork (void) __THROW;
|
|||
|
||||
#endif /* _IO_HAVE_SYS_WAIT */
|
||||
|
||||
#ifndef _IO_pipe
|
||||
#ifdef _LIBC
|
||||
#define _IO_pipe __pipe
|
||||
#else
|
||||
#define _IO_pipe pipe
|
||||
#endif
|
||||
extern int _IO_pipe (int des[2]) __THROW;
|
||||
#endif
|
||||
|
||||
#ifndef _IO_dup2
|
||||
#ifdef _LIBC
|
||||
#define _IO_dup2 __dup2
|
||||
|
|
@ -127,45 +119,103 @@ _IO_new_proc_open (fp, command, mode)
|
|||
const char *mode;
|
||||
{
|
||||
#if _IO_HAVE_SYS_WAIT
|
||||
volatile int read_or_write;
|
||||
volatile int parent_end, child_end;
|
||||
int read_or_write;
|
||||
int parent_end, child_end;
|
||||
int pipe_fds[2];
|
||||
_IO_pid_t child_pid;
|
||||
|
||||
int do_read = 0;
|
||||
int do_write = 0;
|
||||
int do_cloexec = 0;
|
||||
while (*mode != '\0')
|
||||
switch (*mode++)
|
||||
{
|
||||
case 'r':
|
||||
do_read = 1;
|
||||
break;
|
||||
case 'w':
|
||||
do_write = 1;
|
||||
break;
|
||||
case 'e':
|
||||
do_cloexec = 1;
|
||||
break;
|
||||
default:
|
||||
errout:
|
||||
__set_errno (EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((do_read ^ do_write) == 0)
|
||||
goto errout;
|
||||
|
||||
if (_IO_file_is_open (fp))
|
||||
return NULL;
|
||||
if (_IO_pipe (pipe_fds) < 0)
|
||||
return NULL;
|
||||
if (mode[0] == 'r' && mode[1] == '\0')
|
||||
|
||||
#ifdef O_CLOEXEC
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 >= 0)
|
||||
# endif
|
||||
{
|
||||
int r = __pipe2 (pipe_fds, O_CLOEXEC);
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 == 0)
|
||||
__have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1;
|
||||
|
||||
if (__have_pipe2 > 0)
|
||||
# endif
|
||||
if (r < 0)
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_PIPE2
|
||||
# ifdef O_CLOEXEC
|
||||
if (__have_pipe2 < 0)
|
||||
# endif
|
||||
if (__pipe (pipe_fds) < 0)
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
if (do_read)
|
||||
{
|
||||
parent_end = pipe_fds[0];
|
||||
child_end = pipe_fds[1];
|
||||
read_or_write = _IO_NO_WRITES;
|
||||
}
|
||||
else if (mode[0] == 'w' && mode[1] == '\0')
|
||||
else
|
||||
{
|
||||
parent_end = pipe_fds[1];
|
||||
child_end = pipe_fds[0];
|
||||
read_or_write = _IO_NO_READS;
|
||||
}
|
||||
else
|
||||
{
|
||||
_IO_close (pipe_fds[0]);
|
||||
_IO_close (pipe_fds[1]);
|
||||
__set_errno (EINVAL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
((_IO_proc_file *) fp)->pid = child_pid = _IO_fork ();
|
||||
if (child_pid == 0)
|
||||
{
|
||||
int child_std_end = mode[0] == 'r' ? 1 : 0;
|
||||
int child_std_end = do_read ? 1 : 0;
|
||||
struct _IO_proc_file *p;
|
||||
|
||||
#ifndef __ASSUME_PIPE2
|
||||
/* If we have pipe2 the descriptor is marked for close-on-exec. */
|
||||
_IO_close (parent_end);
|
||||
#endif
|
||||
if (child_end != child_std_end)
|
||||
{
|
||||
_IO_dup2 (child_end, child_std_end);
|
||||
#ifndef __ASSUME_PIPE2
|
||||
_IO_close (child_end);
|
||||
#endif
|
||||
}
|
||||
#ifdef O_CLOEXEC
|
||||
else
|
||||
{
|
||||
/* The descriptor is already the one we will use. But it must
|
||||
not be marked close-on-exec. Undo the effects. */
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 > 0)
|
||||
# endif
|
||||
__fcntl (child_end, F_SETFD, 0);
|
||||
}
|
||||
#endif
|
||||
/* POSIX.2: "popen() shall ensure that any streams from previous
|
||||
popen() calls that remain open in the parent process are closed
|
||||
in the new child process." */
|
||||
|
|
@ -189,6 +239,28 @@ _IO_new_proc_open (fp, command, mode)
|
|||
_IO_close (parent_end);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (do_cloexec)
|
||||
{
|
||||
#ifndef __ASSUME_PIPE2
|
||||
# ifdef O_CLOEXEC
|
||||
if (__have_pipe2 < 0)
|
||||
# endif
|
||||
__fcntl (parent_end, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef O_CLOEXEC
|
||||
/* Undo the effects of the pipe2 call which set the
|
||||
close-on-exec flag. */
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 > 0)
|
||||
# endif
|
||||
__fcntl (parent_end, F_SETFD, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
_IO_fileno (fp) = parent_end;
|
||||
|
||||
/* Link into proc_file_chain. */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
FILE *fp = popen ("echo hello", "r");
|
||||
if (fp == NULL)
|
||||
{
|
||||
puts ("first popen failed");
|
||||
res = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int fd = fileno (fp);
|
||||
if (fcntl (fd, F_GETFD) == FD_CLOEXEC)
|
||||
{
|
||||
puts ("first popen(\"r\") set FD_CLOEXEC");
|
||||
res = 1;
|
||||
}
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
fp = popen ("echo hello", "re");
|
||||
if (fp == NULL)
|
||||
{
|
||||
puts ("second popen failed");
|
||||
res = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int fd = fileno (fp);
|
||||
if (fcntl (fd, F_GETFD) != FD_CLOEXEC)
|
||||
{
|
||||
puts ("second popen(\"r\") did not set FD_CLOEXEC");
|
||||
res = 1;
|
||||
}
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
|
@ -193,7 +193,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST])
|
|||
|
||||
|
||||
/* Put NAME in _nl_global_locale.__names. */
|
||||
static inline void
|
||||
static void
|
||||
setname (int category, const char *name)
|
||||
{
|
||||
if (_nl_global_locale.__names[category] == name)
|
||||
|
|
@ -234,9 +234,16 @@ setlocale (int category, const char *locale)
|
|||
if (locale == NULL)
|
||||
return (char *) _nl_global_locale.__names[category];
|
||||
|
||||
/* Protect global data. */
|
||||
__libc_rwlock_wrlock (__libc_setlocale_lock);
|
||||
|
||||
if (strcmp (locale, _nl_global_locale.__names[category]) == 0)
|
||||
/* Changing to the same thing. */
|
||||
return (char *) _nl_global_locale.__names[category];
|
||||
{
|
||||
/* Changing to the same thing. */
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
|
||||
return (char *) _nl_global_locale.__names[category];
|
||||
}
|
||||
|
||||
/* We perhaps really have to load some data. So we determine the
|
||||
path in which to look for the data now. The environment variable
|
||||
|
|
@ -250,12 +257,13 @@ setlocale (int category, const char *locale)
|
|||
if (locpath_var != NULL && locpath_var[0] != '\0')
|
||||
{
|
||||
if (__argz_create_sep (locpath_var, ':',
|
||||
&locale_path, &locale_path_len) != 0)
|
||||
return NULL;
|
||||
|
||||
if (__argz_add_sep (&locale_path, &locale_path_len,
|
||||
_nl_default_locale_path, ':') != 0)
|
||||
return NULL;
|
||||
&locale_path, &locale_path_len) != 0
|
||||
|| __argz_add_sep (&locale_path, &locale_path_len,
|
||||
_nl_default_locale_path, ':') != 0)
|
||||
{
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (category == LC_ALL)
|
||||
|
|
@ -290,8 +298,13 @@ setlocale (int category, const char *locale)
|
|||
break;
|
||||
|
||||
if (cnt == __LC_LAST)
|
||||
/* Bogus category name. */
|
||||
ERROR_RETURN;
|
||||
{
|
||||
error_return:
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
|
||||
/* Bogus category name. */
|
||||
ERROR_RETURN;
|
||||
}
|
||||
|
||||
/* Found the category this clause sets. */
|
||||
newnames[cnt] = ++cp;
|
||||
|
|
@ -310,12 +323,9 @@ setlocale (int category, const char *locale)
|
|||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
||||
if (cnt != LC_ALL && newnames[cnt] == locale)
|
||||
/* The composite name did not specify all categories. */
|
||||
ERROR_RETURN;
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
/* Protect global data. */
|
||||
__libc_rwlock_wrlock (__libc_setlocale_lock);
|
||||
|
||||
/* Load the new data for each category. */
|
||||
while (category-- > 0)
|
||||
if (category != LC_ALL)
|
||||
|
|
@ -393,9 +403,6 @@ setlocale (int category, const char *locale)
|
|||
struct locale_data *newdata = NULL;
|
||||
const char *newname[1] = { locale };
|
||||
|
||||
/* Protect global data. */
|
||||
__libc_rwlock_wrlock (__libc_setlocale_lock);
|
||||
|
||||
if (CATEGORY_USED (category))
|
||||
{
|
||||
/* Only actually load the data if anything will use it. */
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@
|
|||
* locales/es_ES: Fix p_cs_precedes and n_cs_precedes.
|
||||
Use common collation definition.
|
||||
|
||||
[BZ #6040]
|
||||
* locales/fr_FR: Fix abmon, abday, d_ftm, grouping.
|
||||
|
||||
[BZ #6004]
|
||||
* locales/iso14651_t1_common: Fix first weight for U+1E60, U+1E62,
|
||||
U+1E64, U+1E66, and U+1E68.
|
||||
|
|
|
|||
|
|
@ -3,33 +3,35 @@ escape_char /
|
|||
%
|
||||
% French Language Locale for France
|
||||
% Source: RAP
|
||||
% Address: Sankt Jo//rgens Alle 8
|
||||
% DK-1615 Ko//benhavn V, Danmark
|
||||
% Contact: Keld Simonsen
|
||||
% Email: Keld.Simonsen@dkuug.dk
|
||||
% Tel: +45 - 31226543
|
||||
% Fax: +45 - 33256543
|
||||
% Language: fr
|
||||
% Contact: Traduc.org
|
||||
% Address: 18, rue Cavendish
|
||||
% 75019 Paris
|
||||
% Email: traduc@traduc.org
|
||||
% Territory: FR
|
||||
% Revision: 4.3
|
||||
% Date: 1996-10-15
|
||||
% Revision: 4.4
|
||||
% Date: 2008-03-02
|
||||
% Users: general
|
||||
% Charset: ISO-8859-1
|
||||
% Authors:
|
||||
% 2000-06-28, keld.simonsen@dkuug.dk
|
||||
% 2008-03-02, stephane.raimbault@gmail.com
|
||||
%
|
||||
% Distribution and use is free, also
|
||||
% for commercial purposes.
|
||||
|
||||
LC_IDENTIFICATION
|
||||
title "French locale for France"
|
||||
source "RAP"
|
||||
address "Sankt J<U00F8>rgens Alle 8, DK-1615 K<U00F8>benhavn V, Danmark"
|
||||
contact "Keld Simonsen"
|
||||
address ""
|
||||
contact "Traduc.org"
|
||||
email "bug-glibc-locales@gnu.org"
|
||||
tel ""
|
||||
fax ""
|
||||
language "French"
|
||||
territory "France"
|
||||
revision "1.0"
|
||||
date "2000-06-28"
|
||||
date "2008-03-15"
|
||||
%
|
||||
category "fr_FR:2000";LC_IDENTIFICATION
|
||||
category "fr_FR:2000";LC_CTYPE
|
||||
|
|
@ -72,7 +74,7 @@ int_curr_symbol "<U0045><U0055><U0052><U0020>"
|
|||
currency_symbol "<U20AC>"
|
||||
mon_decimal_point "<U002C>"
|
||||
mon_thousands_sep "<U0020>"
|
||||
mon_grouping 3;3
|
||||
mon_grouping 3
|
||||
positive_sign ""
|
||||
negative_sign "<U002D>"
|
||||
int_frac_digits 2
|
||||
|
|
@ -88,14 +90,17 @@ END LC_MONETARY
|
|||
LC_NUMERIC
|
||||
decimal_point "<U002C>"
|
||||
thousands_sep "<U0020>"
|
||||
grouping 0;0
|
||||
grouping 3
|
||||
END LC_NUMERIC
|
||||
|
||||
LC_TIME
|
||||
abday "<U0064><U0069><U006D>";"<U006C><U0075><U006E>";/
|
||||
"<U006D><U0061><U0072>";"<U006D><U0065><U0072>";/
|
||||
"<U006A><U0065><U0075>";"<U0076><U0065><U006E>";/
|
||||
"<U0073><U0061><U006D>"
|
||||
abday "<U0064><U0069><U006D><U002E>";/
|
||||
"<U006C><U0075><U006E><U002E>";/
|
||||
"<U006D><U0061><U0072><U002E>";/
|
||||
"<U006D><U0065><U0072><U002E>";/
|
||||
"<U006A><U0065><U0075><U002E>";/
|
||||
"<U0076><U0065><U006E><U002E>";/
|
||||
"<U0073><U0061><U006D><U002E>"
|
||||
day "<U0064><U0069><U006D><U0061><U006E><U0063><U0068><U0065>";/
|
||||
"<U006C><U0075><U006E><U0064><U0069>";/
|
||||
"<U006D><U0061><U0072><U0064><U0069>";/
|
||||
|
|
@ -103,12 +108,18 @@ day "<U0064><U0069><U006D><U0061><U006E><U0063><U0068><U0065>";/
|
|||
"<U006A><U0065><U0075><U0064><U0069>";/
|
||||
"<U0076><U0065><U006E><U0064><U0072><U0065><U0064><U0069>";/
|
||||
"<U0073><U0061><U006D><U0065><U0064><U0069>"
|
||||
abmon "<U006A><U0061><U006E>";"<U0066><U00E9><U0076>";/
|
||||
"<U006D><U0061><U0072>";"<U0061><U0076><U0072>";/
|
||||
"<U006D><U0061><U0069>";"<U006A><U0075><U006E>";/
|
||||
"<U006A><U0075><U0069>";"<U0061><U006F><U00FB>";/
|
||||
"<U0073><U0065><U0070>";"<U006F><U0063><U0074>";/
|
||||
"<U006E><U006F><U0076>";"<U0064><U00E9><U0063>"
|
||||
abmon "<U006A><U0061><U006E><U0076><U002E>";/
|
||||
"<U0066><U00E9><U0076><U0072><U002E>";/
|
||||
"<U006D><U0061><U0072><U0073>";/
|
||||
"<U0061><U0076><U0072><U0069><U006C>";/
|
||||
"<U006D><U0061><U0069>";/
|
||||
"<U006A><U0075><U0069><U006E>";/
|
||||
"<U006A><U0075><U0069><U006C><U002E>";/
|
||||
"<U0061><U006F><U00FB><U0074>";/
|
||||
"<U0073><U0065><U0070><U0074><U002E>";/
|
||||
"<U006F><U0063><U0074><U002E>";/
|
||||
"<U006E><U006F><U0076><U002E>";/
|
||||
"<U0064><U00E9><U0063><U002E>"
|
||||
mon "<U006A><U0061><U006E><U0076><U0069><U0065><U0072>";/
|
||||
"<U0066><U00E9><U0076><U0072><U0069><U0065><U0072>";/
|
||||
"<U006D><U0061><U0072><U0073>";/
|
||||
|
|
@ -122,7 +133,7 @@ mon "<U006A><U0061><U006E><U0076><U0069><U0065><U0072>";/
|
|||
"<U006E><U006F><U0076><U0065><U006D><U0062><U0072><U0065>";/
|
||||
"<U0064><U00E9><U0063><U0065><U006D><U0062><U0072><U0065>"
|
||||
d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>"
|
||||
d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059>"
|
||||
d_fmt "<U0025><U0064><U002F><U0025><U006D><U002F><U0025><U0059>"
|
||||
t_fmt "<U0025><U0054>"
|
||||
am_pm "";""
|
||||
t_fmt_ampm ""
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Test nl_langinfo.
|
||||
# Copyright (C) 2000, 2001, 2003, 2007 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2000, 2001, 2003, 2007, 2008 Free Software Foundation, Inc.
|
||||
# This file is part of the GNU C Library.
|
||||
#
|
||||
|
||||
|
|
@ -245,13 +245,13 @@ de_DE.UTF-8 RADIXCHAR ,
|
|||
de_DE.UTF-8 THOUSEP .
|
||||
de_DE.UTF-8 YESEXPR ^[jJyY].*
|
||||
de_DE.UTF-8 NOEXPR ^[nN].*
|
||||
fr_FR.ISO-8859-1 ABDAY_1 dim
|
||||
fr_FR.ISO-8859-1 ABDAY_2 lun
|
||||
fr_FR.ISO-8859-1 ABDAY_3 mar
|
||||
fr_FR.ISO-8859-1 ABDAY_4 mer
|
||||
fr_FR.ISO-8859-1 ABDAY_5 jeu
|
||||
fr_FR.ISO-8859-1 ABDAY_6 ven
|
||||
fr_FR.ISO-8859-1 ABDAY_7 sam
|
||||
fr_FR.ISO-8859-1 ABDAY_1 dim.
|
||||
fr_FR.ISO-8859-1 ABDAY_2 lun.
|
||||
fr_FR.ISO-8859-1 ABDAY_3 mar.
|
||||
fr_FR.ISO-8859-1 ABDAY_4 mer.
|
||||
fr_FR.ISO-8859-1 ABDAY_5 jeu.
|
||||
fr_FR.ISO-8859-1 ABDAY_6 ven.
|
||||
fr_FR.ISO-8859-1 ABDAY_7 sam.
|
||||
fr_FR.ISO-8859-1 DAY_1 dimanche
|
||||
fr_FR.ISO-8859-1 DAY_2 lundi
|
||||
fr_FR.ISO-8859-1 DAY_3 mardi
|
||||
|
|
@ -259,18 +259,18 @@ fr_FR.ISO-8859-1 DAY_4 mercredi
|
|||
fr_FR.ISO-8859-1 DAY_5 jeudi
|
||||
fr_FR.ISO-8859-1 DAY_6 vendredi
|
||||
fr_FR.ISO-8859-1 DAY_7 samedi
|
||||
fr_FR.ISO-8859-1 ABMON_1 jan
|
||||
fr_FR.ISO-8859-1 ABMON_2 fév
|
||||
fr_FR.ISO-8859-1 ABMON_3 mar
|
||||
fr_FR.ISO-8859-1 ABMON_4 avr
|
||||
fr_FR.ISO-8859-1 ABMON_1 janv.
|
||||
fr_FR.ISO-8859-1 ABMON_2 févr.
|
||||
fr_FR.ISO-8859-1 ABMON_3 mars
|
||||
fr_FR.ISO-8859-1 ABMON_4 avril
|
||||
fr_FR.ISO-8859-1 ABMON_5 mai
|
||||
fr_FR.ISO-8859-1 ABMON_6 jun
|
||||
fr_FR.ISO-8859-1 ABMON_7 jui
|
||||
fr_FR.ISO-8859-1 ABMON_8 aoû
|
||||
fr_FR.ISO-8859-1 ABMON_9 sep
|
||||
fr_FR.ISO-8859-1 ABMON_10 oct
|
||||
fr_FR.ISO-8859-1 ABMON_11 nov
|
||||
fr_FR.ISO-8859-1 ABMON_12 déc
|
||||
fr_FR.ISO-8859-1 ABMON_6 juin
|
||||
fr_FR.ISO-8859-1 ABMON_7 juil.
|
||||
fr_FR.ISO-8859-1 ABMON_8 août
|
||||
fr_FR.ISO-8859-1 ABMON_9 sept.
|
||||
fr_FR.ISO-8859-1 ABMON_10 oct.
|
||||
fr_FR.ISO-8859-1 ABMON_11 nov.
|
||||
fr_FR.ISO-8859-1 ABMON_12 déc.
|
||||
fr_FR.ISO-8859-1 MON_1 janvier
|
||||
fr_FR.ISO-8859-1 MON_2 février
|
||||
fr_FR.ISO-8859-1 MON_3 mars
|
||||
|
|
@ -284,7 +284,7 @@ fr_FR.ISO-8859-1 MON_10 octobre
|
|||
fr_FR.ISO-8859-1 MON_11 novembre
|
||||
fr_FR.ISO-8859-1 MON_12 décembre
|
||||
fr_FR.ISO-8859-1 D_T_FMT "%a %d %b %Y %T %Z"
|
||||
fr_FR.ISO-8859-1 D_FMT "%d.%m.%Y"
|
||||
fr_FR.ISO-8859-1 D_FMT "%d/%m/%Y"
|
||||
fr_FR.ISO-8859-1 T_FMT "%T"
|
||||
fr_FR.ISO-8859-1 RADIXCHAR ,
|
||||
fr_FR.ISO-8859-1 THOUSEP " "
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996-2002, 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996-2004, 2007, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>
|
||||
and Paul Janzen <pcj@primenet.com>, 1996.
|
||||
|
|
@ -167,10 +167,11 @@ setutent_file (void)
|
|||
# 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 (__have_o_cloexec < 0)
|
||||
# endif
|
||||
result = fcntl_not_cancel (file_fd, F_SETFD,
|
||||
result | FD_CLOEXEC);
|
||||
}
|
||||
|
||||
if (result == -1)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* More debugging hooks for `malloc'.
|
||||
Copyright (C) 1991-1994,1996-2003, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991-1994,1996-2004, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written April 2, 1991 by John Gilmore of Cygnus Support.
|
||||
Based on mcheck.c by Mike Haertel.
|
||||
|
|
@ -34,25 +34,13 @@
|
|||
|
||||
#include <stdio-common/_itoa.h>
|
||||
|
||||
#ifdef _LIBC
|
||||
# include <libc-internal.h>
|
||||
#include <libc-internal.h>
|
||||
|
||||
# include <libio/iolibio.h>
|
||||
# define setvbuf(s, b, f, l) INTUSE(_IO_setvbuf) (s, b, f, l)
|
||||
# define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
|
||||
extern __typeof (malloc) __libc_malloc;
|
||||
extern __typeof (free) __libc_free;
|
||||
extern __typeof (realloc) __libc_realloc;
|
||||
libc_hidden_proto (__libc_malloc)
|
||||
libc_hidden_proto (__libc_realloc)
|
||||
libc_hidden_proto (__libc_free)
|
||||
libc_hidden_proto (__libc_memalign)
|
||||
#else
|
||||
# define __libc_malloc(sz) malloc (sz)
|
||||
# define __libc_free(ptr) free (ptr)
|
||||
# define __libc_realloc(ptr, sz) realloc (ptr, sz)
|
||||
# define __libc_memalign(al, sz) memalign (al, sz)
|
||||
#endif
|
||||
#include <libio/iolibio.h>
|
||||
#define setvbuf(s, b, f, l) INTUSE(_IO_setvbuf) (s, b, f, l)
|
||||
#define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
|
||||
|
||||
#include <kernel-features.h>
|
||||
|
||||
#ifndef attribute_hidden
|
||||
# define attribute_hidden
|
||||
|
|
@ -166,7 +154,7 @@ tr_freehook (ptr, caller)
|
|||
if (tr_old_free_hook != NULL)
|
||||
(*tr_old_free_hook) (ptr, caller);
|
||||
else
|
||||
__libc_free (ptr);
|
||||
free (ptr);
|
||||
__free_hook = tr_freehook;
|
||||
__libc_lock_unlock (lock);
|
||||
}
|
||||
|
|
@ -185,7 +173,7 @@ tr_mallochook (size, caller)
|
|||
if (tr_old_malloc_hook != NULL)
|
||||
hdr = (__ptr_t) (*tr_old_malloc_hook) (size, caller);
|
||||
else
|
||||
hdr = (__ptr_t) __libc_malloc (size);
|
||||
hdr = (__ptr_t) malloc (size);
|
||||
__malloc_hook = tr_mallochook;
|
||||
|
||||
tr_where (caller);
|
||||
|
|
@ -221,7 +209,7 @@ tr_reallochook (ptr, size, caller)
|
|||
if (tr_old_realloc_hook != NULL)
|
||||
hdr = (__ptr_t) (*tr_old_realloc_hook) (ptr, size, caller);
|
||||
else
|
||||
hdr = (__ptr_t) __libc_realloc (ptr, size);
|
||||
hdr = (__ptr_t) realloc (ptr, size);
|
||||
__free_hook = tr_freehook;
|
||||
__malloc_hook = tr_mallochook;
|
||||
__realloc_hook = tr_reallochook;
|
||||
|
|
@ -263,7 +251,7 @@ tr_memalignhook (alignment, size, caller)
|
|||
if (tr_old_memalign_hook != NULL)
|
||||
hdr = (__ptr_t) (*tr_old_memalign_hook) (alignment, size, caller);
|
||||
else
|
||||
hdr = (__ptr_t) __libc_memalign (alignment, size);
|
||||
hdr = (__ptr_t) memalign (alignment, size);
|
||||
__memalign_hook = tr_memalignhook;
|
||||
__malloc_hook = tr_mallochook;
|
||||
|
||||
|
|
@ -327,9 +315,10 @@ mtrace ()
|
|||
if (mtb == NULL)
|
||||
return;
|
||||
|
||||
mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wc");
|
||||
mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce");
|
||||
if (mallstream != NULL)
|
||||
{
|
||||
#ifndef __ASSUME_O_CLOEXEC
|
||||
/* Make sure we close the file descriptor on exec. */
|
||||
int flags = __fcntl (fileno (mallstream), F_GETFD, 0);
|
||||
if (flags >= 0)
|
||||
|
|
@ -337,6 +326,7 @@ mtrace ()
|
|||
flags |= FD_CLOEXEC;
|
||||
__fcntl (fileno (mallstream), F_SETFD, flags);
|
||||
}
|
||||
#endif
|
||||
/* Be sure it doesn't malloc its buffer! */
|
||||
malloc_trace_buffer = mtb;
|
||||
setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE);
|
||||
|
|
|
|||
|
|
@ -348,10 +348,35 @@ openlog_internal(const char *ident, int logstat, int logfac)
|
|||
(void)strncpy(SyslogAddr.sun_path, _PATH_LOG,
|
||||
sizeof(SyslogAddr.sun_path));
|
||||
if (LogStat & LOG_NDELAY) {
|
||||
if ((LogFile = __socket(AF_UNIX, LogType, 0))
|
||||
== -1)
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec >= 0) {
|
||||
# endif
|
||||
LogFile = __socket(AF_UNIX,
|
||||
LogType
|
||||
| SOCK_CLOEXEC, 0);
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec == 0)
|
||||
__have_sock_cloexec
|
||||
= (LogFile != -1
|
||||
|| errno != EINVAL);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
LogFile = __socket(AF_UNIX, LogType, 0);
|
||||
#endif
|
||||
if (LogFile == -1)
|
||||
return;
|
||||
(void)__fcntl(LogFile, F_SETFD, 1);
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
__fcntl(LogFile, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (LogFile != -1 && !connected)
|
||||
|
|
|
|||
17
nis/ypclnt.c
17
nis/ypclnt.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996-2001, 2002, 2003, 2004, 2005, 2006
|
||||
/* Copyright (C) 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||
|
|
@ -28,6 +28,7 @@
|
|||
#include <rpcsvc/yp.h>
|
||||
#include <rpcsvc/ypclnt.h>
|
||||
#include <rpcsvc/ypupd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
#include <bits/libc-lock.h>
|
||||
|
||||
|
|
@ -69,14 +70,24 @@ yp_bind_client_create (const char *domain, dom_binding *ysd,
|
|||
ysd->dom_domain[YPMAXDOMAIN] = '\0';
|
||||
|
||||
ysd->dom_socket = RPC_ANYSOCK;
|
||||
ysd->dom_client = clntudp_create (&ysd->dom_server_addr, YPPROG, YPVERS,
|
||||
UDPTIMEOUT, &ysd->dom_socket);
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# define xflags SOCK_CLOEXEC
|
||||
#else
|
||||
# define xflags 0
|
||||
#endif
|
||||
ysd->dom_client = __libc_clntudp_bufcreate (&ysd->dom_server_addr, YPPROG,
|
||||
YPVERS, UDPTIMEOUT,
|
||||
&ysd->dom_socket,
|
||||
UDPMSGSIZE, UDPMSGSIZE,
|
||||
xflags);
|
||||
|
||||
if (ysd->dom_client != NULL)
|
||||
{
|
||||
#ifndef SOCK_CLOEXEC
|
||||
/* If the program exits, close the socket */
|
||||
if (fcntl (ysd->dom_socket, F_SETFD, FD_CLOEXEC) == -1)
|
||||
perror ("fcntl: F_SETFD");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,20 @@
|
|||
2008-04-28 Hiroki Kaminaga <kaminaga@sm.sony.co.jp>
|
||||
|
||||
[BZ #6740]
|
||||
* sysdeps/powerpc/tcb-offsets.sym (PRIVATE_FUTEX_OFFSET): Guard symbol
|
||||
definition with #ifndef __ASSUME_PRIVATE_FUTEX.
|
||||
|
||||
2008-07-25 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/mq_notify.c (init_mq_netlink): Use
|
||||
SOCK_CLOEXEC if possible.
|
||||
|
||||
2008-05-29 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* Makefile (tests): Add tst-rwlock2a.
|
||||
* tst-rwlock2.c: Use TYPE macro to decide what rwlock type to use.
|
||||
* tst-rwlock2a.c: New file.
|
||||
|
||||
2008-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/pthread/pthread.h: Remove inadvertant checkin.
|
||||
|
|
@ -76,7 +93,7 @@
|
|||
|
||||
2008-03-27 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/bits/local_lim.h: Undefined ARG_MAX if
|
||||
* sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine ARG_MAX if
|
||||
<linux/limits.h> has defined it.
|
||||
* sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: Likewise.
|
||||
|
|
|
|||
|
|
@ -15,4 +15,6 @@ MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
|
|||
PID thread_offsetof (pid)
|
||||
TID thread_offsetof (tid)
|
||||
POINTER_GUARD (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t))
|
||||
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||
PRIVATE_FUTEX_OFFSET thread_offsetof (header.private_futex)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2004, 2005, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contribute by Ulrich Drepper <drepper@redhat.com>, 2004.
|
||||
|
||||
|
|
@ -29,6 +29,7 @@
|
|||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <not-cancel.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
|
||||
#ifdef __NR_mq_notify
|
||||
|
|
@ -152,18 +153,40 @@ reset_once (void)
|
|||
static void
|
||||
init_mq_netlink (void)
|
||||
{
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
static int have_sock_cloexec;
|
||||
# else
|
||||
# define have_sock_cloexec 1
|
||||
# endif
|
||||
#else
|
||||
# define have_sock_cloexec -1
|
||||
# define SOCK_CLOEXEC 0
|
||||
#endif
|
||||
|
||||
/* This code might be called a second time after fork(). The file
|
||||
descriptor is inherited from the parent. */
|
||||
if (netlink_socket == -1)
|
||||
{
|
||||
/* Just a normal netlink socket, not bound. */
|
||||
netlink_socket = socket (AF_NETLINK, SOCK_RAW, 0);
|
||||
if (have_sock_cloexec >= 0)
|
||||
{
|
||||
netlink_socket = socket (AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, 0);
|
||||
#if defined SOCK_CLOEXEC && !defined __ASSUME_SOCK_CLOEXEC
|
||||
if (have_sock_cloexec == 0)
|
||||
have_sock_cloexec = (netlink_socket != -1 || errno != EINVAL
|
||||
? 1 : -1);
|
||||
#endif
|
||||
}
|
||||
if (have_sock_cloexec < 0)
|
||||
netlink_socket = socket (AF_NETLINK, SOCK_RAW, 0);
|
||||
/* No need to do more if we have no socket. */
|
||||
if (netlink_socket == -1)
|
||||
return;
|
||||
|
||||
/* Make sure the descriptor is closed on exec. */
|
||||
if (fcntl (netlink_socket, F_SETFD, FD_CLOEXEC) != 0)
|
||||
if (have_sock_cloexec < 0
|
||||
&& fcntl (netlink_socket, F_SETFD, FD_CLOEXEC) != 0)
|
||||
goto errout;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ CFLAGS-nscd_initgroups.c = -fexceptions
|
|||
|
||||
nscd-cflags = -DIS_IN_nscd=1 -D_FORTIFY_SOURCE=2
|
||||
ifeq (yesyes,$(have-fpie)$(build-shared))
|
||||
nscd-cflags += -fpie
|
||||
nscd-cflags += $(pie-ccflag)
|
||||
endif
|
||||
ifeq (yes,$(have-ssp))
|
||||
nscd-cflags += -fstack-protector
|
||||
|
|
|
|||
|
|
@ -234,6 +234,14 @@ static int inotify_fd = -1;
|
|||
static int resolv_conf_descr = -1;
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
/* Negative if SOCK_CLOEXEC is not supported, positive if it is, zero
|
||||
before be know the result. */
|
||||
static int have_sock_cloexec;
|
||||
/* The paccept syscall was introduced at the same time as SOCK_CLOEXEC. */
|
||||
# define have_paccept have_sock_cloexec
|
||||
#endif
|
||||
|
||||
/* Number of times clients had to wait. */
|
||||
unsigned long int client_queued;
|
||||
|
||||
|
|
@ -517,9 +525,15 @@ nscd_init (void)
|
|||
|
||||
#ifdef HAVE_INOTIFY
|
||||
/* Use inotify to recognize changed files. */
|
||||
inotify_fd = inotify_init ();
|
||||
if (inotify_fd != -1)
|
||||
fcntl (inotify_fd, F_SETFL, O_NONBLOCK);
|
||||
inotify_fd = inotify_init1 (IN_NONBLOCK);
|
||||
# ifndef __ASSUME_IN_NONBLOCK
|
||||
if (inotify_fd == -1 && errno == ENOSYS)
|
||||
{
|
||||
inotify_fd = inotify_init ();
|
||||
if (inotify_fd != -1)
|
||||
fcntl (inotify_fd, F_SETFL, O_RDONLY | O_NONBLOCK);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
for (size_t cnt = 0; cnt < lastdb; ++cnt)
|
||||
|
|
@ -860,7 +874,21 @@ cannot set socket to close on exec: %s; disabling paranoia mode"),
|
|||
}
|
||||
|
||||
/* Create the socket. */
|
||||
sock = socket (AF_UNIX, SOCK_STREAM, 0);
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
sock = -1;
|
||||
if (have_sock_cloexec >= 0)
|
||||
#endif
|
||||
{
|
||||
sock = socket (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
|
||||
#ifdef __ASSUME_SOCK_CLOEXEC
|
||||
if (have_sock_cloexec == 0)
|
||||
have_sock_cloexec = sock != -1 || errno != EINVAL ? 1 : -1;
|
||||
#endif
|
||||
}
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (have_sock_cloexec < 0)
|
||||
sock = socket (AF_UNIX, SOCK_STREAM, 0);
|
||||
#endif
|
||||
if (sock < 0)
|
||||
{
|
||||
dbg_log (_("cannot open socket: %s"), strerror (errno));
|
||||
|
|
@ -876,22 +904,27 @@ cannot set socket to close on exec: %s; disabling paranoia mode"),
|
|||
exit (errno == EACCES ? 4 : 1);
|
||||
}
|
||||
|
||||
/* We don't want to get stuck on accept. */
|
||||
int fl = fcntl (sock, F_GETFL);
|
||||
if (fl == -1 || fcntl (sock, F_SETFL, fl | O_NONBLOCK) == -1)
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (have_sock_cloexec < 0)
|
||||
{
|
||||
dbg_log (_("cannot change socket to nonblocking mode: %s"),
|
||||
strerror (errno));
|
||||
exit (1);
|
||||
}
|
||||
/* We don't want to get stuck on accept. */
|
||||
int fl = fcntl (sock, F_GETFL);
|
||||
if (fl == -1 || fcntl (sock, F_SETFL, fl | O_NONBLOCK) == -1)
|
||||
{
|
||||
dbg_log (_("cannot change socket to nonblocking mode: %s"),
|
||||
strerror (errno));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* The descriptor needs to be closed on exec. */
|
||||
if (paranoia && fcntl (sock, F_SETFD, FD_CLOEXEC) == -1)
|
||||
{
|
||||
dbg_log (_("cannot set socket to close on exec: %s"),
|
||||
strerror (errno));
|
||||
exit (1);
|
||||
/* The descriptor needs to be closed on exec. */
|
||||
if (paranoia && fcntl (sock, F_SETFD, FD_CLOEXEC) == -1)
|
||||
{
|
||||
dbg_log (_("cannot set socket to close on exec: %s"),
|
||||
strerror (errno));
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set permissions for the socket. */
|
||||
chmod (_PATH_NSCDSOCKET, DEFFILEMODE);
|
||||
|
|
@ -1576,10 +1609,15 @@ nscd_run_worker (void *p)
|
|||
/* We are done with the list. */
|
||||
pthread_mutex_unlock (&readylist_lock);
|
||||
|
||||
/* We do not want to block on a short read or so. */
|
||||
int fl = fcntl (fd, F_GETFL);
|
||||
if (fl == -1 || fcntl (fd, F_SETFL, fl | O_NONBLOCK) == -1)
|
||||
goto close_and_out;
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (have_sock_cloexec < 0)
|
||||
{
|
||||
/* We do not want to block on a short read or so. */
|
||||
int fl = fcntl (fd, F_GETFL);
|
||||
if (fl == -1 || fcntl (fd, F_SETFL, fl | O_NONBLOCK) == -1)
|
||||
goto close_and_out;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Now read the request. */
|
||||
request_header req;
|
||||
|
|
@ -1779,7 +1817,24 @@ main_loop_poll (void)
|
|||
if (conns[0].revents != 0)
|
||||
{
|
||||
/* We have a new incoming connection. Accept the connection. */
|
||||
int fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL));
|
||||
int fd;
|
||||
|
||||
#ifndef __ASSUME_PACCEPT
|
||||
fd = -1;
|
||||
if (have_paccept >= 0)
|
||||
#endif
|
||||
{
|
||||
fd = TEMP_FAILURE_RETRY (paccept (sock, NULL, NULL, NULL,
|
||||
SOCK_NONBLOCK));
|
||||
#ifndef __ASSUME_PACCEPT
|
||||
if (have_paccept == 0)
|
||||
have_paccept = fd != -1 || errno != ENOSYS ? 1 : -1;
|
||||
#endif
|
||||
}
|
||||
#ifndef __ASSUME_PACCEPT
|
||||
if (have_paccept < 0)
|
||||
fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL));
|
||||
#endif
|
||||
|
||||
/* Use the descriptor if we have not reached the limit. */
|
||||
if (fd >= 0)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <sys/un.h>
|
||||
#include <not-cancel.h>
|
||||
#include <nis/rpcsvc/nis.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
#include "nscd-client.h"
|
||||
|
||||
|
|
@ -161,7 +162,26 @@ __readvall (int fd, const struct iovec *iov, int iovcnt)
|
|||
static int
|
||||
open_socket (request_type type, const char *key, size_t keylen)
|
||||
{
|
||||
int sock = __socket (PF_UNIX, SOCK_STREAM, 0);
|
||||
int sock;
|
||||
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec >= 0)
|
||||
# endif
|
||||
{
|
||||
sock = __socket (PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec == 0)
|
||||
__have_sock_cloexec = sock != -1 || errno != EINVAL ? 1 : -1;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
sock = __socket (PF_UNIX, SOCK_STREAM, 0);
|
||||
#endif
|
||||
if (sock < 0)
|
||||
return -1;
|
||||
|
||||
|
|
@ -172,8 +192,13 @@ open_socket (request_type type, const char *key, size_t keylen)
|
|||
} reqdata;
|
||||
size_t real_sizeof_reqdata = sizeof (request_header) + keylen;
|
||||
|
||||
/* Make socket non-blocking. */
|
||||
__fcntl (sock, F_SETFL, O_RDWR | O_NONBLOCK);
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_NONBLOCK
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
/* Make socket non-blocking. */
|
||||
__fcntl (sock, F_SETFL, O_RDWR | O_NONBLOCK);
|
||||
#endif
|
||||
|
||||
struct sockaddr_un sun;
|
||||
sun.sun_family = AF_UNIX;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1991-2006, 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991-2006, 2007, 2008 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
|
||||
|
|
@ -383,6 +383,12 @@ extern ssize_t pwrite64 (int __fd, __const void *__buf, size_t __n,
|
|||
Returns 0 if successful, -1 if not. */
|
||||
extern int pipe (int __pipedes[2]) __THROW __wur;
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Same as pipe but apply flags passed in FLAGS to the new file
|
||||
descriptors. */
|
||||
extern int pipe2 (int __pipedes[2], int __flags) __THROW __wur;
|
||||
#endif
|
||||
|
||||
/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM.
|
||||
If SECONDS is zero, any currently scheduled alarm will be cancelled.
|
||||
The function returns the number of seconds remaining until the last
|
||||
|
|
@ -492,6 +498,12 @@ extern int dup (int __fd) __THROW __wur;
|
|||
/* Duplicate FD to FD2, closing FD2 and making it open on the same file. */
|
||||
extern int dup2 (int __fd, int __fd2) __THROW;
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Duplicate FD to FD2, closing FD2 and making it open on the same
|
||||
file while setting flags according to FLAGS. */
|
||||
extern int dup3 (int __fd, int __fd2, int __flags) __THROW;
|
||||
#endif
|
||||
|
||||
/* NULL-terminated array of "NAME=VALUE" environment variables. */
|
||||
extern char **__environ;
|
||||
#ifdef __USE_GNU
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* POSIX.2 wordexp implementation.
|
||||
Copyright (C) 1997-2002, 2003, 2005, 2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997-2003, 2005, 2006, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Tim Waugh <tim@cyberelk.demon.co.uk>.
|
||||
|
||||
|
|
@ -42,6 +42,7 @@
|
|||
# include <wchar.h>
|
||||
#endif
|
||||
#include <wordexp.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
#include <bits/libc-lock.h>
|
||||
#include <stdio-common/_itoa.h>
|
||||
|
|
@ -824,17 +825,30 @@ exec_comm_child (char *comm, int *fildes, int showerr, int noexec)
|
|||
args[1] = "-nc";
|
||||
|
||||
/* Redirect output. */
|
||||
__dup2 (fildes[1], STDOUT_FILENO);
|
||||
__close (fildes[1]);
|
||||
if (__builtin_expect (fildes[1] != STDOUT_FILENO, 1))
|
||||
{
|
||||
__dup2 (fildes[1], STDOUT_FILENO);
|
||||
__close (fildes[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef O_CLOEXEC
|
||||
/* Reset the close-on-exec flag (if necessary). */
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 > 0)
|
||||
# endif
|
||||
__fcntl (fildes[1], F_SETFD, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Redirect stderr to /dev/null if we have to. */
|
||||
if (showerr == 0)
|
||||
{
|
||||
struct stat64 st;
|
||||
int fd;
|
||||
__close (2);
|
||||
__close (STDERR_FILENO);
|
||||
fd = __open (_PATH_DEVNULL, O_WRONLY);
|
||||
if (fd >= 0 && fd != 2)
|
||||
if (fd >= 0 && fd != STDERR_FILENO)
|
||||
{
|
||||
__dup2 (fd, STDERR_FILENO);
|
||||
__close (fd);
|
||||
|
|
@ -885,18 +899,38 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length,
|
|||
if (!comm || !*comm)
|
||||
return 0;
|
||||
|
||||
if (__pipe (fildes))
|
||||
/* Bad */
|
||||
return WRDE_NOSPACE;
|
||||
#ifdef O_CLOEXEC
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 >= 0)
|
||||
# endif
|
||||
{
|
||||
int r = __pipe2 (fildes, O_CLOEXEC);
|
||||
# ifndef __ASSUME_PIPE2
|
||||
if (__have_pipe2 == 0)
|
||||
__have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1;
|
||||
|
||||
if (__have_pipe2 > 0)
|
||||
# endif
|
||||
if (r < 0)
|
||||
/* Bad */
|
||||
return WRDE_NOSPACE;
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_PIPE2
|
||||
# ifdef O_CLOEXEC
|
||||
if (__have_pipe2 < 0)
|
||||
# endif
|
||||
if (__pipe (fildes) < 0)
|
||||
/* Bad */
|
||||
return WRDE_NOSPACE;
|
||||
#endif
|
||||
|
||||
again:
|
||||
if ((pid = __fork ()) < 0)
|
||||
{
|
||||
/* Bad */
|
||||
if (fildes[0] != -1)
|
||||
__close (fildes[0]);
|
||||
if (fildes[1] != -1)
|
||||
__close (fildes[1]);
|
||||
__close (fildes[0]);
|
||||
__close (fildes[1]);
|
||||
return WRDE_NOSPACE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -621,7 +621,7 @@ gethostbyname2(name, af)
|
|||
buf.buf = origbuf = (querybuf *) alloca (1024);
|
||||
|
||||
if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf.buf->buf, 1024,
|
||||
&buf.ptr, NULL, NULL)) < 0) {
|
||||
&buf.ptr, NULL, NULL, NULL)) < 0) {
|
||||
if (buf.buf != origbuf)
|
||||
free (buf.buf);
|
||||
Dprintf("res_nsearch failed (%d)\n", n);
|
||||
|
|
@ -716,12 +716,12 @@ gethostbyaddr(addr, len, af)
|
|||
buf.buf = orig_buf = (querybuf *) alloca (1024);
|
||||
|
||||
n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, 1024,
|
||||
&buf.ptr, NULL, NULL);
|
||||
&buf.ptr, NULL, NULL, NULL);
|
||||
if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) {
|
||||
strcpy(qp, "ip6.int");
|
||||
n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf,
|
||||
buf.buf != orig_buf ? MAXPACKET : 1024,
|
||||
&buf.ptr, NULL, NULL);
|
||||
&buf.ptr, NULL, NULL, NULL);
|
||||
}
|
||||
if (n < 0) {
|
||||
if (buf.buf != orig_buf)
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@ _nss_dns_getcanonname_r (const char *name, char *buffer, size_t buflen,
|
|||
for (int i = 0; i < nqtypes; ++i)
|
||||
{
|
||||
int r = __libc_res_nquery (&_res, name, ns_c_in, qtypes[i],
|
||||
buf, sizeof (buf), &ansp.ptr, NULL, NULL);
|
||||
buf, sizeof (buf), &ansp.ptr, NULL, NULL,
|
||||
NULL);
|
||||
if (r > 0)
|
||||
{
|
||||
/* We need to decode the response. Just one question record.
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
|||
host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
|
||||
|
||||
n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer.buf->buf,
|
||||
1024, &host_buffer.ptr, NULL, NULL);
|
||||
1024, &host_buffer.ptr, NULL, NULL, NULL);
|
||||
if (n < 0)
|
||||
{
|
||||
status = (errno == ECONNREFUSED
|
||||
|
|
@ -213,7 +213,7 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
|||
n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf->buf,
|
||||
host_buffer.buf != orig_host_buffer
|
||||
? MAXPACKET : 1024, &host_buffer.ptr,
|
||||
NULL, NULL);
|
||||
NULL, NULL, NULL);
|
||||
|
||||
if (n < 0)
|
||||
{
|
||||
|
|
@ -273,8 +273,6 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||
if (__res_maybe_init (&_res, 0) == -1)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
char tmp[NS_MAXDNAME];
|
||||
|
||||
/*
|
||||
* if there aren't any dots, it could be a user-level alias.
|
||||
* this is also done in res_query() since we are not the only
|
||||
|
|
@ -282,7 +280,8 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||
*/
|
||||
if (strchr (name, '.') == NULL)
|
||||
{
|
||||
const char *cp = res_hostalias (&_res, name, tmp, sizeof (tmp));
|
||||
char *tmp = alloca (NS_MAXDNAME);
|
||||
const char *cp = res_hostalias (&_res, name, tmp, NS_MAXDNAME);
|
||||
if (cp != NULL)
|
||||
name = cp;
|
||||
}
|
||||
|
|
@ -296,12 +295,13 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||
host_buffer.buf = orig_host_buffer = (querybuf *) alloca (2048);
|
||||
u_char *ans2p = NULL;
|
||||
int nans2p = 0;
|
||||
int resplen2 = 0;
|
||||
|
||||
int olderr = errno;
|
||||
enum nss_status status;
|
||||
int n = __libc_res_nsearch (&_res, name, C_IN, T_UNSPEC,
|
||||
host_buffer.buf->buf, 2048, &host_buffer.ptr,
|
||||
&ans2p, &nans2p);
|
||||
&ans2p, &nans2p, &resplen2);
|
||||
if (n < 0)
|
||||
{
|
||||
status = (errno == ECONNREFUSED
|
||||
|
|
@ -319,7 +319,7 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||
}
|
||||
|
||||
status = gaih_getanswer(host_buffer.buf, n, (const querybuf *) ans2p,
|
||||
nans2p, name, pat, buffer, buflen,
|
||||
resplen2, name, pat, buffer, buflen,
|
||||
errnop, herrnop, ttlp);
|
||||
|
||||
if (host_buffer.buf != orig_host_buffer)
|
||||
|
|
@ -417,7 +417,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
|
|||
strcpy (qp, "].ip6.arpa");
|
||||
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR,
|
||||
host_buffer.buf->buf, 1024, &host_buffer.ptr,
|
||||
NULL, NULL);
|
||||
NULL, NULL, NULL);
|
||||
if (n >= 0)
|
||||
goto got_it_already;
|
||||
}
|
||||
|
|
@ -438,14 +438,14 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
|
|||
}
|
||||
|
||||
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
|
||||
1024, &host_buffer.ptr, NULL, NULL);
|
||||
1024, &host_buffer.ptr, NULL, NULL, NULL);
|
||||
if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0)
|
||||
{
|
||||
strcpy (qp, "ip6.int");
|
||||
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
|
||||
host_buffer.buf != orig_host_buffer
|
||||
? MAXPACKET : 1024, &host_buffer.ptr,
|
||||
NULL, NULL);
|
||||
NULL, NULL, NULL);
|
||||
}
|
||||
if (n < 0)
|
||||
{
|
||||
|
|
@ -685,12 +685,19 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
n = -1;
|
||||
}
|
||||
|
||||
if (n < 0 || (*name_ok) (bp) == 0)
|
||||
if (__builtin_expect (n < 0 || (*name_ok) (bp) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
}
|
||||
cp += n; /* name */
|
||||
|
||||
if (__builtin_expect (cp + 10 > end_of_message, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
}
|
||||
|
||||
type = ns_get16 (cp);
|
||||
cp += INT16SZ; /* type */
|
||||
class = ns_get16 (cp);
|
||||
|
|
@ -699,7 +706,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
cp += INT32SZ; /* TTL */
|
||||
n = ns_get16 (cp);
|
||||
cp += INT16SZ; /* len */
|
||||
if (class != C_IN)
|
||||
if (__builtin_expect (class != C_IN, 0))
|
||||
{
|
||||
/* XXX - debug? syslog? */
|
||||
cp += n;
|
||||
|
|
@ -711,7 +718,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1])
|
||||
continue;
|
||||
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
|
||||
if (n < 0 || (*name_ok) (tbuf) == 0)
|
||||
if (__builtin_expect (n < 0 || (*name_ok) (tbuf) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
|
|
@ -745,7 +752,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
if (qtype == T_PTR && type == T_CNAME)
|
||||
{
|
||||
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
|
||||
if (n < 0 || res_dnok (tbuf) == 0)
|
||||
if (__builtin_expect (n < 0 || res_dnok (tbuf) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
|
|
@ -792,7 +799,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
switch (type)
|
||||
{
|
||||
case T_PTR:
|
||||
if (__strcasecmp (tname, bp) != 0)
|
||||
if (__builtin_expect (__strcasecmp (tname, bp) != 0, 0))
|
||||
{
|
||||
syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp);
|
||||
cp += n;
|
||||
|
|
@ -809,7 +816,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
n = -1;
|
||||
}
|
||||
|
||||
if (n < 0 || res_hnok (bp) == 0)
|
||||
if (__builtin_expect (n < 0 || res_hnok (bp) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
break;
|
||||
|
|
@ -839,7 +846,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||
if (have_to_map)
|
||||
{
|
||||
n = strlen (bp) + 1; /* for the \0 */
|
||||
if (n >= MAXHOSTNAMELEN)
|
||||
if (__builtin_expect (n >= MAXHOSTNAMELEN, 0))
|
||||
{
|
||||
++had_error;
|
||||
break;
|
||||
|
|
@ -957,7 +964,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
|||
return NSS_STATUS_UNAVAIL;
|
||||
}
|
||||
|
||||
u_char packtmp[NS_MAXCDNAME];
|
||||
u_char packtmp[NS_MAXCDNAME];
|
||||
int n = __ns_name_unpack (answer->buf, end_of_message, cp,
|
||||
packtmp, sizeof packtmp);
|
||||
/* We unpack the name to check it for validity. But we do not need
|
||||
|
|
@ -1005,7 +1012,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
|||
|
||||
n = -1;
|
||||
}
|
||||
if (n < 0 || res_hnok (buffer) == 0)
|
||||
if (__builtin_expect (n < 0 || res_hnok (buffer) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
|
|
@ -1018,6 +1025,13 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
|||
}
|
||||
|
||||
cp += n; /* name */
|
||||
|
||||
if (__builtin_expect (cp + 10 > end_of_message, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
}
|
||||
|
||||
int type = ns_get16 (cp);
|
||||
cp += INT16SZ; /* type */
|
||||
int class = ns_get16 (cp);
|
||||
|
|
@ -1037,7 +1051,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
|||
{
|
||||
char tbuf[MAXDNAME];
|
||||
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
|
||||
if (n < 0 || res_hnok (tbuf) == 0)
|
||||
if (__builtin_expect (n < 0 || res_hnok (tbuf) == 0, 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
|
|
@ -1130,6 +1144,12 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
|||
}
|
||||
|
||||
(*pat)->family = type == T_A ? AF_INET : AF_INET6;
|
||||
if (__builtin_expect ((type == T_A && n != INADDRSZ)
|
||||
|| (type == T_AAAA && n != IN6ADDRSZ), 0))
|
||||
{
|
||||
++had_error;
|
||||
continue;
|
||||
}
|
||||
memcpy ((*pat)->addr, cp, n);
|
||||
cp += n;
|
||||
(*pat)->scopeid = 0;
|
||||
|
|
@ -1172,14 +1192,15 @@ gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2,
|
|||
errnop, h_errnop, ttlp,
|
||||
&first);
|
||||
if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND
|
||||
|| status == NSS_STATUS_TRYAGAIN)
|
||||
|| (status == NSS_STATUS_TRYAGAIN
|
||||
&& (errno != ERANGE || *h_errnop != NO_RECOVERY)))
|
||||
&& answer2 != NULL && anslen2 > 0)
|
||||
{
|
||||
enum nss_status status2 = gaih_getanswer_slice(answer2, anslen2, qname,
|
||||
&pat, &buffer, &buflen,
|
||||
errnop, h_errnop, ttlp,
|
||||
&first);
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
if (status != NSS_STATUS_SUCCESS && status2 != NSS_STATUS_NOTFOUND)
|
||||
status = status2;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
|
|||
net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
|
||||
|
||||
anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
|
||||
1024, &net_buffer.ptr, NULL, NULL);
|
||||
1024, &net_buffer.ptr, NULL, NULL, NULL);
|
||||
if (anslen < 0)
|
||||
{
|
||||
/* Nothing found. */
|
||||
|
|
@ -206,7 +206,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
|
|||
net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
|
||||
|
||||
anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
|
||||
1024, &net_buffer.ptr, NULL, NULL);
|
||||
1024, &net_buffer.ptr, NULL, NULL, NULL);
|
||||
if (anslen < 0)
|
||||
{
|
||||
/* Nothing found. */
|
||||
|
|
|
|||
|
|
@ -97,7 +97,8 @@ static const char rcsid[] = "$BINDId: res_query.c,v 8.20 2000/02/29 05:39:12 vix
|
|||
static int
|
||||
__libc_res_nquerydomain(res_state statp, const char *name, const char *domain,
|
||||
int class, int type, u_char *answer, int anslen,
|
||||
u_char **answerp, u_char **answerp2, int *nanswerp2);
|
||||
u_char **answerp, u_char **answerp2, int *nanswerp2,
|
||||
int *resplen2);
|
||||
|
||||
/*
|
||||
* Formulate a normal query, send, and await answer.
|
||||
|
|
@ -117,7 +118,8 @@ __libc_res_nquery(res_state statp,
|
|||
int anslen, /* size of answer buffer */
|
||||
u_char **answerp, /* if buffer needs to be enlarged */
|
||||
u_char **answerp2,
|
||||
int *nanswerp2)
|
||||
int *nanswerp2,
|
||||
int *resplen2)
|
||||
{
|
||||
HEADER *hp = (HEADER *) answer;
|
||||
int n, use_malloc = 0;
|
||||
|
|
@ -221,7 +223,7 @@ __libc_res_nquery(res_state statp,
|
|||
}
|
||||
assert (answerp == NULL || (void *) *answerp == (void *) answer);
|
||||
n = __libc_res_nsend(statp, query1, nquery1, query2, nquery2, answer,
|
||||
anslen, answerp, answerp2, nanswerp2);
|
||||
anslen, answerp, answerp2, nanswerp2, resplen2);
|
||||
if (use_malloc)
|
||||
free (buf);
|
||||
if (n < 0) {
|
||||
|
|
@ -307,7 +309,7 @@ res_nquery(res_state statp,
|
|||
int anslen) /* size of answer buffer */
|
||||
{
|
||||
return __libc_res_nquery(statp, name, class, type, answer, anslen,
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
libresolv_hidden_def (res_nquery)
|
||||
|
||||
|
|
@ -325,7 +327,8 @@ __libc_res_nsearch(res_state statp,
|
|||
int anslen, /* size of answer */
|
||||
u_char **answerp,
|
||||
u_char **answerp2,
|
||||
int *nanswerp2)
|
||||
int *nanswerp2,
|
||||
int *resplen2)
|
||||
{
|
||||
const char *cp, * const *domain;
|
||||
HEADER *hp = (HEADER *) answer;
|
||||
|
|
@ -349,7 +352,7 @@ __libc_res_nsearch(res_state statp,
|
|||
if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL)
|
||||
return (__libc_res_nquery(statp, cp, class, type, answer,
|
||||
anslen, answerp, answerp2,
|
||||
nanswerp2));
|
||||
nanswerp2, resplen2));
|
||||
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
|
|
@ -366,7 +369,7 @@ __libc_res_nsearch(res_state statp,
|
|||
if (dots >= statp->ndots || trailing_dot) {
|
||||
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
|
||||
answer, anslen, answerp,
|
||||
answerp2, nanswerp2);
|
||||
answerp2, nanswerp2, resplen2);
|
||||
if (ret > 0 || trailing_dot)
|
||||
return (ret);
|
||||
saved_herrno = h_errno;
|
||||
|
|
@ -404,7 +407,8 @@ __libc_res_nsearch(res_state statp,
|
|||
ret = __libc_res_nquerydomain(statp, name, *domain,
|
||||
class, type,
|
||||
answer, anslen, answerp,
|
||||
answerp2, nanswerp2);
|
||||
answerp2, nanswerp2,
|
||||
resplen2);
|
||||
if (ret > 0)
|
||||
return (ret);
|
||||
|
||||
|
|
@ -473,7 +477,7 @@ __libc_res_nsearch(res_state statp,
|
|||
if (dots && !(tried_as_is || root_on_list)) {
|
||||
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
|
||||
answer, anslen, answerp,
|
||||
answerp2, nanswerp2);
|
||||
answerp2, nanswerp2, resplen2);
|
||||
if (ret > 0)
|
||||
return (ret);
|
||||
}
|
||||
|
|
@ -508,7 +512,7 @@ res_nsearch(res_state statp,
|
|||
int anslen) /* size of answer */
|
||||
{
|
||||
return __libc_res_nsearch(statp, name, class, type, answer,
|
||||
anslen, NULL, NULL, NULL);
|
||||
anslen, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
libresolv_hidden_def (res_nsearch)
|
||||
|
||||
|
|
@ -525,7 +529,8 @@ __libc_res_nquerydomain(res_state statp,
|
|||
int anslen, /* size of answer */
|
||||
u_char **answerp,
|
||||
u_char **answerp2,
|
||||
int *nanswerp2)
|
||||
int *nanswerp2,
|
||||
int *resplen2)
|
||||
{
|
||||
char nbuf[MAXDNAME];
|
||||
const char *longname = nbuf;
|
||||
|
|
@ -562,7 +567,8 @@ __libc_res_nquerydomain(res_state statp,
|
|||
sprintf(nbuf, "%s.%s", name, domain);
|
||||
}
|
||||
return (__libc_res_nquery(statp, longname, class, type, answer,
|
||||
anslen, answerp, answerp2, nanswerp2));
|
||||
anslen, answerp, answerp2, nanswerp2,
|
||||
resplen2));
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -574,7 +580,7 @@ res_nquerydomain(res_state statp,
|
|||
int anslen) /* size of answer */
|
||||
{
|
||||
return __libc_res_nquerydomain(statp, name, domain, class, type,
|
||||
answer, anslen, NULL, NULL, NULL);
|
||||
answer, anslen, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
libresolv_hidden_def (res_nquerydomain)
|
||||
|
||||
|
|
|
|||
|
|
@ -339,9 +339,9 @@ int
|
|||
__libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
||||
const u_char *buf2, int buflen2,
|
||||
u_char *ans, int anssiz, u_char **ansp, u_char **ansp2,
|
||||
int *nansp2)
|
||||
int *nansp2, int *resplen2)
|
||||
{
|
||||
int gotsomewhere, terrno, try, v_circuit, resplen, resplen2, ns, n;
|
||||
int gotsomewhere, terrno, try, v_circuit, resplen, ns, n;
|
||||
|
||||
if (statp->nscount == 0) {
|
||||
__set_errno (ESRCH);
|
||||
|
|
@ -539,7 +539,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
|||
try = statp->retry;
|
||||
n = send_vc(statp, buf, buflen, buf2, buflen2,
|
||||
&ans, &anssiz, &terrno,
|
||||
ns, ansp, ansp2, nansp2, &resplen2);
|
||||
ns, ansp, ansp2, nansp2, resplen2);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
if (n == 0)
|
||||
|
|
@ -549,14 +549,14 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
|||
n = send_dg(statp, buf, buflen, buf2, buflen2,
|
||||
&ans, &anssiz, &terrno,
|
||||
ns, &v_circuit, &gotsomewhere, ansp,
|
||||
ansp2, nansp2, &resplen2);
|
||||
ansp2, nansp2, resplen2);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
if (n == 0)
|
||||
goto next_ns;
|
||||
if (v_circuit)
|
||||
// XXX Check whether both requests failed or
|
||||
// XXX whether one have been answered successfully
|
||||
// XXX whether one has been answered successfully
|
||||
goto same_ns;
|
||||
}
|
||||
|
||||
|
|
@ -575,7 +575,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
|
|||
DprintQ((statp->options & RES_DEBUG) ||
|
||||
(statp->pfcode & RES_PRF_REPLY),
|
||||
(stdout, "%s", ""),
|
||||
*ansp2, (resplen2 > *nansp2) ? *nansp2 : resplen2);
|
||||
*ansp2, (*resplen2 > *nansp2) ? *nansp2 : *resplen2);
|
||||
|
||||
/*
|
||||
* If we have temporarily opened a virtual circuit,
|
||||
|
|
@ -638,7 +638,7 @@ res_nsend(res_state statp,
|
|||
const u_char *buf, int buflen, u_char *ans, int anssiz)
|
||||
{
|
||||
return __libc_res_nsend(statp, buf, buflen, NULL, 0, ans, anssiz,
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
libresolv_hidden_def (res_nsend)
|
||||
|
||||
|
|
@ -665,6 +665,8 @@ send_vc(res_state statp,
|
|||
u_short len2;
|
||||
u_char *cp;
|
||||
|
||||
if (resplen2 != NULL)
|
||||
*resplen2 = 0;
|
||||
connreset = 0;
|
||||
same_ns:
|
||||
truncating = 0;
|
||||
|
|
@ -734,8 +736,9 @@ send_vc(res_state statp,
|
|||
int recvresp2 = buf2 == NULL;
|
||||
read_len:
|
||||
cp = ans;
|
||||
len = INT16SZ;
|
||||
while ((n = TEMP_FAILURE_RETRY (read(statp->_vcsock, (char *)cp,
|
||||
uint16_t rlen16;
|
||||
len = sizeof(rlen16);
|
||||
while ((n = TEMP_FAILURE_RETRY (read(statp->_vcsock, &rlen16,
|
||||
(int)len))) > 0) {
|
||||
cp += n;
|
||||
if ((len -= n) <= 0)
|
||||
|
|
@ -760,11 +763,7 @@ send_vc(res_state statp,
|
|||
}
|
||||
return (0);
|
||||
}
|
||||
#ifdef _STRING_ARCH_unaligned
|
||||
resplen = ntohs (*(uint16_t *) ans);
|
||||
#else
|
||||
resplen = ns_get16(ans);
|
||||
#endif
|
||||
int rlen = ntohs (rlen16);
|
||||
|
||||
int *thisanssizp;
|
||||
u_char **thisansp;
|
||||
|
|
@ -795,11 +794,11 @@ send_vc(res_state statp,
|
|||
}
|
||||
anhp = (HEADER *) *thisansp;
|
||||
|
||||
*thisresplenp = resplen;
|
||||
if (resplen > *thisanssizp) {
|
||||
*thisresplenp = rlen;
|
||||
if (rlen > *thisanssizp) {
|
||||
/* Yes, we test ANSCP here. If we have two buffers
|
||||
both will be allocatable. */
|
||||
if (anscp) {
|
||||
if (__builtin_expect (anscp != NULL, 1)) {
|
||||
u_char *newp = malloc (MAXPACKET);
|
||||
if (newp == NULL) {
|
||||
*terrno = ENOMEM;
|
||||
|
|
@ -809,7 +808,7 @@ send_vc(res_state statp,
|
|||
*thisanssizp = MAXPACKET;
|
||||
*thisansp = newp;
|
||||
anhp = (HEADER *) newp;
|
||||
len = resplen;
|
||||
len = rlen;
|
||||
} else {
|
||||
Dprint(statp->options & RES_DEBUG,
|
||||
(stdout, ";; response truncated\n")
|
||||
|
|
@ -818,9 +817,9 @@ send_vc(res_state statp,
|
|||
len = *thisanssizp;
|
||||
}
|
||||
} else
|
||||
len = resplen;
|
||||
len = rlen;
|
||||
|
||||
if (len < HFIXEDSZ) {
|
||||
if (__builtin_expect (len < HFIXEDSZ, 0)) {
|
||||
/*
|
||||
* Undersized message.
|
||||
*/
|
||||
|
|
@ -836,18 +835,18 @@ send_vc(res_state statp,
|
|||
cp += n;
|
||||
len -= n;
|
||||
}
|
||||
if (n <= 0) {
|
||||
if (__builtin_expect (n <= 0, 0)) {
|
||||
*terrno = errno;
|
||||
Perror(statp, stderr, "read(vc)", errno);
|
||||
__res_iclose(statp, false);
|
||||
return (0);
|
||||
}
|
||||
if (truncating) {
|
||||
if (__builtin_expect (truncating, 0)) {
|
||||
/*
|
||||
* Flush rest of answer so connection stays in synch.
|
||||
*/
|
||||
anhp->tc = 1;
|
||||
len = resplen - *thisanssizp;
|
||||
len = rlen - *thisanssizp;
|
||||
while (len != 0) {
|
||||
char junk[PACKETSZ];
|
||||
|
||||
|
|
@ -872,7 +871,7 @@ send_vc(res_state statp,
|
|||
(statp->pfcode & RES_PRF_REPLY),
|
||||
(stdout, ";; old answer (unexpected):\n"),
|
||||
*thisansp,
|
||||
(resplen > *thisanssiz) ? *thisanssiz: resplen);
|
||||
(rlen > *thisanssiz) ? *thisanssiz: rlen);
|
||||
goto read_len;
|
||||
}
|
||||
|
||||
|
|
@ -889,7 +888,7 @@ send_vc(res_state statp,
|
|||
* All is well, or the error is fatal. Signal that the
|
||||
* next nameserver ought not be tried.
|
||||
*/
|
||||
return (resplen);
|
||||
return resplen;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -1084,7 +1083,7 @@ send_dg(res_state statp,
|
|||
*thisresplenp = recvfrom(pfd[0].fd, (char*)*thisansp,
|
||||
*thisanssizp, 0,
|
||||
(struct sockaddr *)&from, &fromlen);
|
||||
if (*thisresplenp <= 0) {
|
||||
if (__builtin_expect (*thisresplenp <= 0, 0)) {
|
||||
if (errno == EINTR || errno == EAGAIN) {
|
||||
need_recompute = 1;
|
||||
goto wait;
|
||||
|
|
@ -1093,7 +1092,7 @@ send_dg(res_state statp,
|
|||
goto err_out;
|
||||
}
|
||||
*gotsomewhere = 1;
|
||||
if (*thisresplenp < HFIXEDSZ) {
|
||||
if (__builtin_expect (*thisresplenp < HFIXEDSZ, 0)) {
|
||||
/*
|
||||
* Undersized message.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -14,12 +14,14 @@ BEGIN { started = 0 }
|
|||
|
||||
NF >= 1 && !started {
|
||||
if (test) {
|
||||
print "\n#include <inttypes.h>";
|
||||
print "\n#include <stdio.h>";
|
||||
print "\n#define U(n) UINT64_C (n)";
|
||||
print "\nstatic int do_test (void)\n{\n int bad = 0, good = 0;\n";
|
||||
print "#define TEST(name, source, expr) \\\n" \
|
||||
" if (asconst_##name != (expr)) { ++bad;" \
|
||||
" fprintf (stderr, \"%s: %s is %ld but %s is %ld\\n\"," \
|
||||
" source, #name, (long int) asconst_##name, #expr, (long int) (expr));" \
|
||||
" if (U (asconst_##name) != (uint64_t) (expr)) { ++bad;" \
|
||||
" fprintf (stderr, \"%s: %s is %\" PRId64 \" but %s is %\"PRId64 \"\\n\"," \
|
||||
" source, #name, U (asconst_##name), #expr, (uint64_t) (expr));" \
|
||||
" } else ++good;\n";
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (C) 1991,1995-2001,2005 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1991,1995-2001,2005,2008 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,7 +27,9 @@ headers := sys/socket.h sys/un.h bits/sockaddr.h bits/socket.h \
|
|||
routines := accept bind connect getpeername getsockname getsockopt \
|
||||
listen recv recvfrom recvmsg send sendmsg sendto \
|
||||
setsockopt shutdown socket socketpair isfdtype opensock \
|
||||
sockatmark
|
||||
sockatmark paccept
|
||||
|
||||
aux := have_sock_cloexec
|
||||
|
||||
distribute := ifreq.h
|
||||
|
||||
|
|
|
|||
|
|
@ -31,4 +31,7 @@ libc {
|
|||
# Addition from P1003.1-200x
|
||||
sockatmark;
|
||||
}
|
||||
GLIBC_2.9 {
|
||||
paccept;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
/* Copyright (C) 2008 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/socket.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
#if defined SOCK_CLOEXEC && !defined __ASSUME_SOCK_CLOEXEC
|
||||
int __have_sock_cloexec;
|
||||
#endif
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/* Copyright (C) 2008 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 <sys/socket.h>
|
||||
|
||||
/* Await a connection on socket FD.
|
||||
When a connection arrives, open a new socket to communicate with it,
|
||||
set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
|
||||
peer and *ADDR_LEN to the address's actual length, and return the
|
||||
new socket's descriptor, or -1 for errors. SS is installed as
|
||||
the thread's signal mask and FLAGS are additional flags. */
|
||||
int
|
||||
paccept (fd, addr, addr_len, ss, flags)
|
||||
int fd;
|
||||
__SOCKADDR_ARG addr;
|
||||
socklen_t *addr_len;
|
||||
const __sigset_t *ss;
|
||||
int flags;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (paccept)
|
||||
|
||||
|
||||
stub_warning (paccept)
|
||||
#include <stub-tag.h>
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/* Declarations of socket constants, types, and functions.
|
||||
Copyright (C) 1991,92,1994-2001,2003,2005,2007
|
||||
Copyright (C) 1991,92,1994-2001,2003,2005,2007,2008
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
|
|
@ -28,6 +28,10 @@ __BEGIN_DECLS
|
|||
#include <sys/uio.h>
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
#ifdef __USE_GNU
|
||||
/* Get the __sigset_t definition. */
|
||||
# include <bits/sigset.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* This operating system-specific header file defines the SOCK_*, PF_*,
|
||||
|
|
@ -210,6 +214,18 @@ extern int listen (int __fd, int __n) __THROW;
|
|||
extern int accept (int __fd, __SOCKADDR_ARG __addr,
|
||||
socklen_t *__restrict __addr_len);
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Variant of the accept function which takes additional parameters. The
|
||||
MASK parameter allows to change the thread signal mask for the duration
|
||||
of the call. The FLAGS parameter allows to pass additional flags.
|
||||
|
||||
This function is a cancellation point and therefore not marked with
|
||||
__THROW. */
|
||||
extern int paccept (int __fd, __SOCKADDR_ARG __addr,
|
||||
socklen_t *__restrict __addr_len,
|
||||
__const __sigset_t *__restrict __ss, int __flags);
|
||||
#endif
|
||||
|
||||
/* Shut down all or part of the connection open on socket FD.
|
||||
HOW determines what to shut down:
|
||||
SHUT_RD = No more receptions;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2000, 2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2000, 2004, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
|
||||
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
#include "../locale/outdigitswc.h"
|
||||
|
||||
static CHAR_T *
|
||||
_i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr)
|
||||
_i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
|
||||
{
|
||||
#ifdef COMPILE_WPRINTF
|
||||
# define decimal NULL
|
||||
|
|
@ -58,10 +58,23 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr)
|
|||
#endif
|
||||
|
||||
/* Copy existing string so that nothing gets overwritten. */
|
||||
CHAR_T *src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T));
|
||||
CHAR_T *src;
|
||||
bool use_alloca = __libc_use_alloca ((rear_ptr - w) * sizeof (CHAR_T));
|
||||
if (__builtin_expect (use_alloca, true))
|
||||
src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T));
|
||||
else
|
||||
{
|
||||
src = (CHAR_T *) malloc ((rear_ptr - w) * sizeof (CHAR_T));
|
||||
if (src == NULL)
|
||||
/* If we cannot allocate the memory don't rewrite the string.
|
||||
It is better than nothing. */
|
||||
return w;
|
||||
}
|
||||
|
||||
CHAR_T *s = (CHAR_T *) __mempcpy (src, w,
|
||||
(rear_ptr - w) * sizeof (CHAR_T));
|
||||
w = rear_ptr;
|
||||
|
||||
w = end;
|
||||
|
||||
/* Process all characters in the string. */
|
||||
while (--s >= src)
|
||||
|
|
@ -91,5 +104,8 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr)
|
|||
}
|
||||
}
|
||||
|
||||
if (! use_alloca)
|
||||
free (src);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Floating point output for `printf'.
|
||||
Copyright (C) 1995-2003, 2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2003, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU C Library.
|
||||
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||
|
|
@ -1148,6 +1148,7 @@ ___printf_fp (FILE *fp,
|
|||
|
||||
{
|
||||
char *buffer = NULL;
|
||||
char *buffer_end = NULL;
|
||||
char *cp = NULL;
|
||||
char *tmpptr;
|
||||
|
||||
|
|
@ -1157,6 +1158,9 @@ ___printf_fp (FILE *fp,
|
|||
size_t decimal_len;
|
||||
size_t thousands_sep_len;
|
||||
wchar_t *copywc;
|
||||
size_t factor = (info->i18n
|
||||
? _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)
|
||||
: 1);
|
||||
|
||||
decimal_len = strlen (decimal);
|
||||
|
||||
|
|
@ -1165,10 +1169,11 @@ ___printf_fp (FILE *fp,
|
|||
else
|
||||
thousands_sep_len = strlen (thousands_sep);
|
||||
|
||||
size_t nbuffer = (2 + chars_needed * factor + decimal_len
|
||||
+ ngroups * thousands_sep_len);
|
||||
if (__builtin_expect (buffer_malloced, 0))
|
||||
{
|
||||
buffer = (char *) malloc (2 + chars_needed + decimal_len
|
||||
+ ngroups * thousands_sep_len);
|
||||
buffer = (char *) malloc (nbuffer);
|
||||
if (buffer == NULL)
|
||||
{
|
||||
/* Signal an error to the caller. */
|
||||
|
|
@ -1177,8 +1182,8 @@ ___printf_fp (FILE *fp,
|
|||
}
|
||||
}
|
||||
else
|
||||
buffer = (char *) alloca (2 + chars_needed + decimal_len
|
||||
+ ngroups * thousands_sep_len);
|
||||
buffer = (char *) alloca (nbuffer);
|
||||
buffer_end = buffer + nbuffer;
|
||||
|
||||
/* Now copy the wide character string. Since the character
|
||||
(except for the decimal point and thousands separator) must
|
||||
|
|
@ -1197,9 +1202,17 @@ ___printf_fp (FILE *fp,
|
|||
if (__builtin_expect (info->i18n, 0))
|
||||
{
|
||||
#ifdef COMPILE_WPRINTF
|
||||
wstartp = _i18n_number_rewrite (wstartp, wcp);
|
||||
wstartp = _i18n_number_rewrite (wstartp, wcp,
|
||||
wbuffer + wbuffer_to_alloc);
|
||||
wcp = wbuffer + wbuffer_to_alloc;
|
||||
assert ((uintptr_t) wbuffer <= (uintptr_t) wstartp);
|
||||
assert ((uintptr_t) wstartp
|
||||
< (uintptr_t) wbuffer + wbuffer_to_alloc);
|
||||
#else
|
||||
tmpptr = _i18n_number_rewrite (tmpptr, cp);
|
||||
tmpptr = _i18n_number_rewrite (tmpptr, cp, buffer_end);
|
||||
cp = buffer_end;
|
||||
assert ((uintptr_t) buffer <= (uintptr_t) tmpptr);
|
||||
assert ((uintptr_t) tmpptr < (uintptr_t) buffer_end);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -625,7 +625,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||
thousands_sep); \
|
||||
\
|
||||
if (use_outdigits && base == 10) \
|
||||
string = _i18n_number_rewrite (string, workend); \
|
||||
string = _i18n_number_rewrite (string, workend, workend); \
|
||||
} \
|
||||
/* Simplify further test for num != 0. */ \
|
||||
number.word = number.longlong != 0; \
|
||||
|
|
@ -683,7 +683,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||
thousands_sep); \
|
||||
\
|
||||
if (use_outdigits && base == 10) \
|
||||
string = _i18n_number_rewrite (string, workend); \
|
||||
string = _i18n_number_rewrite (string, workend, workend); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
|
|
|
|||
|
|
@ -116,4 +116,7 @@ libc {
|
|||
GLIBC_2.3.4 {
|
||||
xdr_quad_t; xdr_u_quad_t;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__libc_clntudp_bufcreate;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,12 +54,15 @@ static char sccsid[] = "@(#)clnt_udp.c 1.39 87/08/11 Copyr 1984 Sun Micro";
|
|||
#ifdef USE_IN_LIBIO
|
||||
# include <wchar.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifdef IP_RECVERR
|
||||
#include <errqueue.h>
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
|
||||
#include <kernel-features.h>
|
||||
|
||||
extern bool_t xdr_opaque_auth (XDR *, struct opaque_auth *);
|
||||
extern u_long _create_xid (void);
|
||||
|
||||
|
|
@ -121,9 +124,9 @@ struct cu_data
|
|||
* sent and received.
|
||||
*/
|
||||
CLIENT *
|
||||
clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
|
||||
struct timeval wait, int *sockp, u_int sendsz,
|
||||
u_int recvsz)
|
||||
__libc_clntudp_bufcreate (struct sockaddr_in *raddr, u_long program,
|
||||
u_long version, struct timeval wait, int *sockp,
|
||||
u_int sendsz, u_int recvsz, int flags)
|
||||
{
|
||||
CLIENT *cl;
|
||||
struct cu_data *cu = NULL;
|
||||
|
|
@ -178,8 +181,32 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
|
|||
{
|
||||
int dontblock = 1;
|
||||
|
||||
*sockp = __socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (*sockp < 0)
|
||||
#ifdef SOCK_NONBLOCK
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec >= 0)
|
||||
# endif
|
||||
{
|
||||
*sockp = __socket (AF_INET, SOCK_DGRAM|SOCK_NONBLOCK|flags,
|
||||
IPPROTO_UDP);
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec == 0)
|
||||
__have_sock_cloexec = *sockp >= 0 || errno != EINVAL ? 1 : -1;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
{
|
||||
*sockp = __socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (flags & SOCK_CLOEXEC)
|
||||
__fcntl (*sockp, F_SETFD, FD_CLOEXEC);
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
if (__builtin_expect (*sockp < 0, 0))
|
||||
{
|
||||
struct rpc_createerr *ce = &get_rpc_createerr ();
|
||||
ce->cf_stat = RPC_SYSTEMERROR;
|
||||
|
|
@ -188,8 +215,13 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
|
|||
}
|
||||
/* attempt to bind to prov port */
|
||||
(void) bindresvport (*sockp, (struct sockaddr_in *) 0);
|
||||
/* the sockets rpc controls are non-blocking */
|
||||
(void) __ioctl (*sockp, FIONBIO, (char *) &dontblock);
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
/* the sockets rpc controls are non-blocking */
|
||||
(void) __ioctl (*sockp, FIONBIO, (char *) &dontblock);
|
||||
#endif
|
||||
#ifdef IP_RECVERR
|
||||
{
|
||||
int on = 1;
|
||||
|
|
@ -212,6 +244,16 @@ fooy:
|
|||
mem_free ((caddr_t) cl, sizeof (CLIENT));
|
||||
return (CLIENT *) NULL;
|
||||
}
|
||||
INTDEF (__libc_clntudp_bufcreate)
|
||||
|
||||
CLIENT *
|
||||
clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
|
||||
struct timeval wait, int *sockp, u_int sendsz,
|
||||
u_int recvsz)
|
||||
{
|
||||
return INTUSE(__libc_clntudp_bufcreate) (raddr, program, version, wait,
|
||||
sockp, sendsz, recvsz, 0);
|
||||
}
|
||||
INTDEF (clntudp_bufcreate)
|
||||
|
||||
CLIENT *
|
||||
|
|
@ -222,8 +264,8 @@ clntudp_create (raddr, program, version, wait, sockp)
|
|||
struct timeval wait;
|
||||
int *sockp;
|
||||
{
|
||||
return INTUSE(clntudp_bufcreate) (raddr, program, version, wait, sockp,
|
||||
UDPMSGSIZE, UDPMSGSIZE);
|
||||
return INTUSE(__libc_clntudp_bufcreate) (raddr, program, version, wait,
|
||||
sockp, UDPMSGSIZE, UDPMSGSIZE, 0);
|
||||
}
|
||||
INTDEF (clntudp_create)
|
||||
|
||||
|
|
|
|||
|
|
@ -462,7 +462,7 @@ getkeyserv_handle (int vers)
|
|||
clnt_control (kcp->client, CLSET_RETRY_TIMEOUT,
|
||||
(char *)&wait_time);
|
||||
if (clnt_control (kcp->client, CLGET_FD, (char *)&fd))
|
||||
__fcntl (fd, F_SETFD, 1); /* make it "close on exec" */
|
||||
__fcntl (fd, F_SETFD, FD_CLOEXEC); /* make it "close on exec" */
|
||||
|
||||
return kcp->client;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include <bits/libc-lock.h>
|
||||
#include <hp-timing.h>
|
||||
#include <tls.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
|
|
@ -592,8 +593,13 @@ struct rtld_global_ro
|
|||
/* Names of shared object for which the RPATH should be ignored. */
|
||||
EXTERN const char *_dl_inhibit_rpath;
|
||||
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
/* Location of the binary. */
|
||||
EXTERN const char *_dl_origin_path;
|
||||
#endif
|
||||
|
||||
/* If set, points to the file name of the executable. */
|
||||
EXTERN const char *_dl_execfn;
|
||||
|
||||
/* -1 if the dynamic linker should honor library load bias,
|
||||
0 if not, -2 use the default (honor biases for normal
|
||||
|
|
|
|||
|
|
@ -29,8 +29,7 @@
|
|||
#define ENTRANCE pushl %ebx; cfi_adjust_cfa_offset (4); \
|
||||
cfi_rel_offset (ebx, 0); ENTER
|
||||
#define RETURN popl %ebx; cfi_adjust_cfa_offset (-4); \
|
||||
cfi_restore (ebx); LEAVE; ret; \
|
||||
cfi_adjust_cfa_offset (4); cfi_rel_offset (ebx, 0);
|
||||
cfi_restore (ebx); LEAVE; ret
|
||||
|
||||
/* Load an entry in a jump table into EBX. TABLE is a jump table
|
||||
with relative offsets. INDEX is a register contains the index
|
||||
|
|
@ -71,6 +70,8 @@ L(bye):
|
|||
xorl %eax, %eax
|
||||
RETURN
|
||||
|
||||
cfi_adjust_cfa_offset (4)
|
||||
cfi_rel_offset (ebx, 0)
|
||||
L(neq):
|
||||
sbbl %eax, %eax
|
||||
sbbl $-1, %eax
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
# The Sparc `long double' is a distinct type we support.
|
||||
long-double-fcts = yes
|
||||
|
||||
pie-ccflag = -fPIE
|
||||
|
||||
ifeq ($(subdir),gmon)
|
||||
sysdep_routines += sparc-mcount
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ chroot - chroot i:s chroot
|
|||
close - close Ci:i __libc_close __close close
|
||||
dup - dup i:i __dup dup
|
||||
dup2 - dup2 i:ii __dup2 dup2
|
||||
dup3 - dup3 i:iii dup3
|
||||
fchdir - fchdir i:i __fchdir fchdir
|
||||
fcntl - fcntl Ci:iiF __libc_fcntl __fcntl __fcntl_internal fcntl
|
||||
fstatfs - fstatfs i:ip __fstatfs fstatfs
|
||||
|
|
|
|||
|
|
@ -135,6 +135,9 @@ libc {
|
|||
GLIBC_2.8 {
|
||||
timerfd_create; timerfd_settime; timerfd_gettime;
|
||||
}
|
||||
GLIBC_2.9 {
|
||||
epoll_create2; inotify_init1;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
# functions used in other libraries
|
||||
__syscall_rt_sigqueueinfo;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,143 @@
|
|||
/* Copyright (C) 2002-2006, 2007, 2008 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_EPOLL_H
|
||||
#define _SYS_EPOLL_H 1
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Get __sigset_t. */
|
||||
#include <bits/sigset.h>
|
||||
|
||||
#ifndef __sigset_t_defined
|
||||
# define __sigset_t_defined
|
||||
typedef __sigset_t sigset_t;
|
||||
#endif
|
||||
|
||||
|
||||
/* Flags to be passed to epoll_create2. */
|
||||
enum
|
||||
{
|
||||
EPOLL_CLOEXEC = 010000000,
|
||||
#define EPOLL_CLOEXEC EPOLL_CLOEXEC
|
||||
EPOLL_NONBLOCK = 04
|
||||
#define EPOLL_NONBLOCK EPOLL_NONBLOCK
|
||||
};
|
||||
|
||||
|
||||
enum EPOLL_EVENTS
|
||||
{
|
||||
EPOLLIN = 0x001,
|
||||
#define EPOLLIN EPOLLIN
|
||||
EPOLLPRI = 0x002,
|
||||
#define EPOLLPRI EPOLLPRI
|
||||
EPOLLOUT = 0x004,
|
||||
#define EPOLLOUT EPOLLOUT
|
||||
EPOLLRDNORM = 0x040,
|
||||
#define EPOLLRDNORM EPOLLRDNORM
|
||||
EPOLLRDBAND = 0x080,
|
||||
#define EPOLLRDBAND EPOLLRDBAND
|
||||
EPOLLWRNORM = 0x100,
|
||||
#define EPOLLWRNORM EPOLLWRNORM
|
||||
EPOLLWRBAND = 0x200,
|
||||
#define EPOLLWRBAND EPOLLWRBAND
|
||||
EPOLLMSG = 0x400,
|
||||
#define EPOLLMSG EPOLLMSG
|
||||
EPOLLERR = 0x008,
|
||||
#define EPOLLERR EPOLLERR
|
||||
EPOLLHUP = 0x010,
|
||||
#define EPOLLHUP EPOLLHUP
|
||||
EPOLLRDHUP = 0x2000,
|
||||
#define EPOLLRDHUP EPOLLRDHUP
|
||||
EPOLLONESHOT = (1 << 30),
|
||||
#define EPOLLONESHOT EPOLLONESHOT
|
||||
EPOLLET = (1 << 31)
|
||||
#define EPOLLET EPOLLET
|
||||
};
|
||||
|
||||
|
||||
/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl(). */
|
||||
#define EPOLL_CTL_ADD 1 /* Add a file descriptor to the interface. */
|
||||
#define EPOLL_CTL_DEL 2 /* Remove a file descriptor from the interface. */
|
||||
#define EPOLL_CTL_MOD 3 /* Change file descriptor epoll_event structure. */
|
||||
|
||||
|
||||
typedef union epoll_data
|
||||
{
|
||||
void *ptr;
|
||||
int fd;
|
||||
uint32_t u32;
|
||||
uint64_t u64;
|
||||
} epoll_data_t;
|
||||
|
||||
struct epoll_event
|
||||
{
|
||||
uint32_t events; /* Epoll events */
|
||||
epoll_data_t data; /* User data variable */
|
||||
};
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Creates an epoll instance. Returns an fd for the new instance.
|
||||
The "size" parameter is a hint specifying the number of file
|
||||
descriptors to be associated with the new instance. The fd
|
||||
returned by epoll_create() should be closed with close(). */
|
||||
extern int epoll_create (int __size) __THROW;
|
||||
|
||||
/* Same as epoll_create but with an additional FLAGS parameter. */
|
||||
extern int epoll_create2 (int __size, int __flags) __THROW;
|
||||
|
||||
|
||||
/* Manipulate an epoll instance "epfd". Returns 0 in case of success,
|
||||
-1 in case of error ( the "errno" variable will contain the
|
||||
specific error code ) The "op" parameter is one of the EPOLL_CTL_*
|
||||
constants defined above. The "fd" parameter is the target of the
|
||||
operation. The "event" parameter describes which events the caller
|
||||
is interested in and any associated user data. */
|
||||
extern int epoll_ctl (int __epfd, int __op, int __fd,
|
||||
struct epoll_event *__event) __THROW;
|
||||
|
||||
|
||||
/* Wait for events on an epoll instance "epfd". Returns the number of
|
||||
triggered events returned in "events" buffer. Or -1 in case of
|
||||
error with the "errno" variable set to the specific error code. The
|
||||
"events" parameter is a buffer that will contain triggered
|
||||
events. The "maxevents" is the maximum number of events to be
|
||||
returned ( usually size of "events" ). The "timeout" parameter
|
||||
specifies the maximum wait time in milliseconds (-1 == infinite).
|
||||
|
||||
This function is a cancellation point and therefore not marked with
|
||||
__THROW. */
|
||||
extern int epoll_wait (int __epfd, struct epoll_event *__events,
|
||||
int __maxevents, int __timeout);
|
||||
|
||||
|
||||
/* Same as epoll_wait, but the thread's signal mask is temporarily
|
||||
and atomically replaced with the one provided as parameter.
|
||||
|
||||
This function is a cancellation point and therefore not marked with
|
||||
__THROW. */
|
||||
extern int epoll_pwait (int __epfd, struct epoll_event *__events,
|
||||
int __maxevents, int __timeout,
|
||||
__const __sigset_t *__ss);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* sys/epoll.h */
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/* Copyright (C) 2007, 2008 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_EVENTFD_H
|
||||
#define _SYS_EVENTFD_H 1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
/* Type for event counter. */
|
||||
typedef uint64_t eventfd_t;
|
||||
|
||||
/* Flags for signalfd. */
|
||||
enum
|
||||
{
|
||||
EFD_CLOEXEC = 010000000,
|
||||
#define EFD_CLOEXEC EFD_CLOEXEC
|
||||
EFD_NONBLOCK = 04
|
||||
#define EFD_NONBLOCK EFD_NONBLOCK
|
||||
};
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Return file descriptor for generic event channel. Set initial
|
||||
value to COUNT. */
|
||||
extern int eventfd (int __count, int __flags) __THROW;
|
||||
|
||||
/* Read event counter and possibly wait for events. */
|
||||
extern int eventfd_read (int __fd, eventfd_t *__value);
|
||||
|
||||
/* Increment event counter. */
|
||||
extern int eventfd_write (int __fd, eventfd_t value);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* sys/eventfd.h */
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
/* Copyright (C) 2005, 2006, 2008 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_INOTIFY_H
|
||||
#define _SYS_INOTIFY_H 1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
/* Flags for the parameter of inotify_init1. */
|
||||
enum
|
||||
{
|
||||
IN_CLOEXEC = 010000000,
|
||||
#define IN_CLOEXEC IN_CLOEXEC
|
||||
IN_NONBLOCK = 04
|
||||
#define IN_NONBLOCK IN_NONBLOCK
|
||||
};
|
||||
|
||||
|
||||
/* Structure describing an inotify event. */
|
||||
struct inotify_event
|
||||
{
|
||||
int wd; /* Watch descriptor. */
|
||||
uint32_t mask; /* Watch mask. */
|
||||
uint32_t cookie; /* Cookie to synchronize two events. */
|
||||
uint32_t len; /* Length (including NULs) of name. */
|
||||
char name __flexarr; /* Name. */
|
||||
};
|
||||
|
||||
|
||||
/* Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH. */
|
||||
#define IN_ACCESS 0x00000001 /* File was accessed. */
|
||||
#define IN_MODIFY 0x00000002 /* File was modified. */
|
||||
#define IN_ATTRIB 0x00000004 /* Metadata changed. */
|
||||
#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed. */
|
||||
#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed. */
|
||||
#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close. */
|
||||
#define IN_OPEN 0x00000020 /* File was opened. */
|
||||
#define IN_MOVED_FROM 0x00000040 /* File was moved from X. */
|
||||
#define IN_MOVED_TO 0x00000080 /* File was moved to Y. */
|
||||
#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* Moves. */
|
||||
#define IN_CREATE 0x00000100 /* Subfile was created. */
|
||||
#define IN_DELETE 0x00000200 /* Subfile was deleted. */
|
||||
#define IN_DELETE_SELF 0x00000400 /* Self was deleted. */
|
||||
#define IN_MOVE_SELF 0x00000800 /* Self was moved. */
|
||||
|
||||
/* Events sent by the kernel. */
|
||||
#define IN_UNMOUNT 0x00002000 /* Backing fs was unmounted. */
|
||||
#define IN_Q_OVERFLOW 0x00004000 /* Event queued overflowed. */
|
||||
#define IN_IGNORED 0x00008000 /* File was ignored. */
|
||||
|
||||
/* Helper events. */
|
||||
#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close. */
|
||||
#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* Moves. */
|
||||
|
||||
/* Special flags. */
|
||||
#define IN_ONLYDIR 0x01000000 /* Only watch the path if it is a
|
||||
directory. */
|
||||
#define IN_DONT_FOLLOW 0x02000000 /* Do not follow a sym link. */
|
||||
#define IN_MASK_ADD 0x20000000 /* Add to the mask of an already
|
||||
existing watch. */
|
||||
#define IN_ISDIR 0x40000000 /* Event occurred against dir. */
|
||||
#define IN_ONESHOT 0x80000000 /* Only send event once. */
|
||||
|
||||
/* All events which a program can wait on. */
|
||||
#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE \
|
||||
| IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM \
|
||||
| IN_MOVED_TO | IN_CREATE | IN_DELETE \
|
||||
| IN_DELETE_SELF | IN_MOVE_SELF)
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Create and initialize inotify instance. */
|
||||
extern int inotify_init (void) __THROW;
|
||||
|
||||
/* Create and initialize inotify instance. */
|
||||
extern int inotify_init1 (int __flags) __THROW;
|
||||
|
||||
/* Add watch of object NAME to inotify instance FD. Notify about
|
||||
events specified by MASK. */
|
||||
extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask)
|
||||
__THROW;
|
||||
|
||||
/* Remove the watch specified by WD from the inotify instance FD. */
|
||||
extern int inotify_rm_watch (int __fd, uint32_t __wd) __THROW;
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* sys/inotify.h */
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/* Copyright (C) 2007, 2008 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_SIGNALFD_H
|
||||
#define _SYS_SIGNALFD_H 1
|
||||
|
||||
#define __need_sigset_t
|
||||
#include <signal.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
struct signalfd_siginfo
|
||||
{
|
||||
uint32_t ssi_signo;
|
||||
int32_t ssi_errno;
|
||||
int32_t ssi_code;
|
||||
uint32_t ssi_pid;
|
||||
uint32_t ssi_uid;
|
||||
int32_t ssi_fd;
|
||||
uint32_t ssi_tid;
|
||||
uint32_t ssi_band;
|
||||
uint32_t ssi_overrun;
|
||||
uint32_t ssi_trapno;
|
||||
int32_t ssi_status;
|
||||
int32_t ssi_int;
|
||||
uint64_t ssi_ptr;
|
||||
uint64_t ssi_utime;
|
||||
uint64_t ssi_stime;
|
||||
uint64_t ssi_addr;
|
||||
uint8_t __pad[48];
|
||||
};
|
||||
|
||||
/* Flags for signalfd. */
|
||||
enum
|
||||
{
|
||||
SFD_CLOEXEC = 010000000,
|
||||
#define SFD_CLOEXEC SFD_CLOEXEC
|
||||
SFD_NONBLOCK = 04
|
||||
#define SFD_NONBLOCK SFD_NONBLOCK
|
||||
};
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Request notification for delivery of signals in MASK to be
|
||||
performed using descriptor FD.*/
|
||||
extern int signalfd (int __fd, const sigset_t *__mask, int __flags)
|
||||
__nonnull ((2)) __THROW;
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* sys/signalfd.h */
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/* Copyright (C) 2008 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_TIMERFD_H
|
||||
#define _SYS_TIMERFD_H 1
|
||||
|
||||
#include <time.h>
|
||||
|
||||
|
||||
/* Bits to be set in the FLAGS parameter of `timerfd_create'. */
|
||||
enum
|
||||
{
|
||||
TFD_CLOEXEC = 010000000,
|
||||
#define TFD_CLOEXEC TFD_CLOEXEC
|
||||
TFD_NONBLOCK = 04
|
||||
#define TFD_NONBLOCK TFD_NONBLOCK
|
||||
};
|
||||
|
||||
|
||||
/* Bits to be set in the FLAGS parameter of `timerfd_settime'. */
|
||||
enum
|
||||
{
|
||||
TFD_TIMER_ABSTIME = 1 << 0
|
||||
#define TFD_TIMER_ABSTIME TFD_TIMER_ABSTIME
|
||||
};
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Return file descriptor for new interval timer source. */
|
||||
extern int timerfd_create (clockid_t __clock_id, int __flags) __THROW;
|
||||
|
||||
/* Set next expiration time of interval timer source UFD to UTMR. If
|
||||
FLAGS has the TFD_TIMER_ABSTIME flag set the timeout value is
|
||||
absolute. Optionally return the old expiration time in OTMR. */
|
||||
extern int timerfd_settime (int __ufd, int __flags,
|
||||
__const struct itimerspec *__utmr,
|
||||
struct itimerspec *__otmr) __THROW;
|
||||
|
||||
/* Return the next expiration time of UFD. */
|
||||
extern int timerfd_gettime (int __ufd, struct itimerspec *__otmr) __THROW;
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* sys/timerfd.h */
|
||||
|
|
@ -52,12 +52,22 @@ enum __socket_type
|
|||
SOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based,
|
||||
datagrams of fixed maximum length. */
|
||||
#define SOCK_SEQPACKET SOCK_SEQPACKET
|
||||
SOCK_DCCP = 6,
|
||||
#define SOCK_DCCP SOCK_DCCP /* Datagram Congestion Control Protocol. */
|
||||
SOCK_PACKET = 10 /* Linux specific way of getting packets
|
||||
SOCK_DCCP = 6, /* Datagram Congestion Control Protocol. */
|
||||
#define SOCK_DCCP SOCK_DCCP
|
||||
SOCK_PACKET = 10, /* Linux specific way of getting packets
|
||||
at the dev level. For writing rarp and
|
||||
other similar things on the user level. */
|
||||
#define SOCK_PACKET SOCK_PACKET
|
||||
|
||||
/* Flags to be ORed into the type parameter of socket and socketpair and
|
||||
used for the flags parameter of paccept. */
|
||||
|
||||
SOCK_CLOEXEC = 02000000, /* Atomically set close-on-exec flag for the
|
||||
new descriptor(s). */
|
||||
#define SOCK_CLOEXEC SOCK_CLOEXEC
|
||||
SOCK_NONBLOCK = 04000 /* Atomically mark descriptor(s) as
|
||||
non-blocking. */
|
||||
#define SOCK_NONBLOCK SOCK_NONBLOCK
|
||||
};
|
||||
|
||||
/* Protocol families. */
|
||||
|
|
@ -92,7 +102,8 @@ enum __socket_type
|
|||
#define PF_BLUETOOTH 31 /* Bluetooth sockets. */
|
||||
#define PF_IUCV 32 /* IUCV sockets. */
|
||||
#define PF_RXRPC 33 /* RxRPC sockets. */
|
||||
#define PF_MAX 34 /* For now.. */
|
||||
#define PF_ISDN 34 /* mISDN sockets. */
|
||||
#define PF_MAX 35 /* For now.. */
|
||||
|
||||
/* Address families. */
|
||||
#define AF_UNSPEC PF_UNSPEC
|
||||
|
|
@ -126,6 +137,7 @@ enum __socket_type
|
|||
#define AF_BLUETOOTH PF_BLUETOOTH
|
||||
#define AF_IUCV PF_IUCV
|
||||
#define AF_RXRPC PF_RXRPC
|
||||
#define AF_ISDN PF_ISDN
|
||||
#define AF_MAX PF_MAX
|
||||
|
||||
/* Socket level values. Others are defined in the appropriate headers.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Find path of executable.
|
||||
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998-2000, 2002, 2004, 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
|
|
@ -35,30 +35,32 @@
|
|||
const char *
|
||||
_dl_get_origin (void)
|
||||
{
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
char linkval[PATH_MAX];
|
||||
char *result;
|
||||
#endif
|
||||
const char *str;
|
||||
char *result = (char *) -1l;
|
||||
int len;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
len = INTERNAL_SYSCALL (readlink, err, 3, "/proc/self/exe", linkval,
|
||||
sizeof (linkval));
|
||||
if (! INTERNAL_SYSCALL_ERROR_P (len, err) && len > 0 && linkval[0] != '[')
|
||||
str = GLRO(dl_execfn);
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
if (str == NULL)
|
||||
{
|
||||
/* We can use this value. */
|
||||
assert (linkval[0] == '/');
|
||||
while (len > 1 && linkval[len - 1] != '/')
|
||||
--len;
|
||||
result = (char *) malloc (len + 1);
|
||||
if (result == NULL)
|
||||
result = (char *) -1;
|
||||
else if (len == 1)
|
||||
memcpy (result, "/", 2);
|
||||
else
|
||||
*((char *) __mempcpy (result, linkval, len - 1)) = '\0';
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
len = INTERNAL_SYSCALL (readlink, err, 3, "/proc/self/exe", linkval,
|
||||
sizeof (linkval));
|
||||
if (! INTERNAL_SYSCALL_ERROR_P (len, err)
|
||||
&& len > 0 && linkval[0] != '[')
|
||||
str = linkval;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
len = strlen (str);
|
||||
|
||||
#ifndef __ASSUME_AT_EXECFN
|
||||
if (str == NULL)
|
||||
{
|
||||
result = (char *) -1;
|
||||
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
||||
a copy and strip out trailing slashes. */
|
||||
if (GLRO(dl_origin_path) != NULL)
|
||||
|
|
@ -76,6 +78,21 @@ _dl_get_origin (void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* We can use this value. */
|
||||
assert (str[0] == '/');
|
||||
while (len > 1 && str[len - 1] != '/')
|
||||
--len;
|
||||
result = (char *) malloc (len + 1);
|
||||
if (result == NULL)
|
||||
result = (char *) -1;
|
||||
else if (len == 1)
|
||||
memcpy (result, "/", 2);
|
||||
else
|
||||
*((char *) __mempcpy (result, str, len - 1)) = '\0';
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,7 @@
|
|||
#define NEED_DL_SYSINFO_DSO 1
|
||||
|
||||
|
||||
/* The _dl_discover_osversion function is so far only needed in sysconf
|
||||
to check for kernels later than 2.6.23. */
|
||||
#if !defined __ASSEMBLER__ && __LINUX_KERNEL_VERSION < 0x020617
|
||||
#ifndef __ASSEMBLER__
|
||||
/* Get version of the OS. */
|
||||
extern int _dl_discover_osversion (void) attribute_hidden;
|
||||
# define HAVE_DL_DISCOVER_OSVERSION 1
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2007, 2008 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,7 +24,10 @@
|
|||
int
|
||||
eventfd (int count, int flags)
|
||||
{
|
||||
/* The system call has no flag parameter which is bad. So we have
|
||||
#ifdef __NR_eventfd1
|
||||
return INLINE_SYSCALL (eventfd1, 1, flags);
|
||||
#else
|
||||
/* The old system call has no flag parameter which is bad. So we have
|
||||
to wait until we have to support to pass additional values to the
|
||||
kernel (sys_indirect) before implementing setting flags like
|
||||
O_NONBLOCK etc. */
|
||||
|
|
@ -34,10 +37,11 @@ eventfd (int count, int flags)
|
|||
return -1;
|
||||
}
|
||||
|
||||
#ifdef __NR_eventfd
|
||||
# ifdef __NR_eventfd
|
||||
return INLINE_SYSCALL (eventfd, 1, count);
|
||||
#else
|
||||
# else
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,135 @@
|
|||
/* Copyright (C) 1995-1998,2002,2003,2005,2008 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-cancel.h>
|
||||
#include <socketcall.h>
|
||||
#include <tls.h>
|
||||
|
||||
#define _NSIG 64
|
||||
|
||||
#define P(a, b) P2(a, b)
|
||||
#define P2(a, b) a##b
|
||||
|
||||
.text
|
||||
/* The socket-oriented system calls are handled unusally in Linux.
|
||||
They are all gated through the single `socketcall' system call number.
|
||||
`socketcall' takes two arguments: the first is the subcode, specifying
|
||||
which socket function is being called; and the second is a pointer to
|
||||
the arguments to the specific function. */
|
||||
|
||||
ENTRY(do_paccept)
|
||||
#ifdef SOCKOP_paccept
|
||||
subl $6*4, %esp
|
||||
cfi_adjust_cfa_offset(6*4)
|
||||
|
||||
movl (%eax), %ecx
|
||||
movl %ecx, (%esp)
|
||||
movl 4(%eax), %ecx
|
||||
movl %ecx, 4(%esp)
|
||||
movl 8(%eax), %ecx
|
||||
movl %ecx, 8(%esp)
|
||||
movl 12(%eax), %ecx
|
||||
movl %ecx, 12(%esp)
|
||||
movl $(_NSIG / 8), 16(%esp)
|
||||
movl 16(%eax), %ecx
|
||||
movl %ecx, 20(%esp)
|
||||
|
||||
movl $SYS_ify(socketcall), %eax /* System call number in %eax. */
|
||||
|
||||
movl $SOCKOP_paccept, %ebx /* Subcode is first arg to syscall. */
|
||||
movl %esp, %ecx /* Address of args is 2nd arg. */
|
||||
|
||||
/* Do the system call trap. */
|
||||
ENTER_KERNEL
|
||||
|
||||
addl $6*4, %esp
|
||||
cfi_adjust_cfa_offset(-6*4)
|
||||
|
||||
/* %eax is < 0 if there was an error. */
|
||||
cmpl $-125, %eax
|
||||
jae SYSCALL_ERROR_LABEL
|
||||
#else
|
||||
movl $-ENOSYS, %eax
|
||||
jmp SYSCALL_ERROR_LABEL
|
||||
|
||||
.section .gnu.glibc-stub.paccept
|
||||
.previous
|
||||
.section .gnu.warning.paccept
|
||||
.string "warning: paccept is not implemented and will always fail"
|
||||
.previous
|
||||
#endif
|
||||
L(pseudo_end):
|
||||
ret
|
||||
PSEUDO_END(do_paccept)
|
||||
|
||||
|
||||
.globl paccept
|
||||
ENTRY (paccept)
|
||||
#ifdef CENABLE
|
||||
SINGLE_THREAD_P
|
||||
jne 1f
|
||||
#endif
|
||||
|
||||
/* Save registers. */
|
||||
movl %ebx, %edx
|
||||
cfi_register (3, 2)
|
||||
|
||||
lea 4(%esp), %eax
|
||||
call do_paccept
|
||||
|
||||
/* Restore registers. */
|
||||
movl %edx, %ebx
|
||||
cfi_restore (3)
|
||||
|
||||
ret
|
||||
|
||||
#ifdef CENABLE
|
||||
/* We need one more register. */
|
||||
1: pushl %esi
|
||||
cfi_adjust_cfa_offset(4)
|
||||
|
||||
/* Enable asynchronous cancellation. */
|
||||
CENABLE
|
||||
movl %eax, %esi
|
||||
cfi_offset(6, -8) /* %esi */
|
||||
|
||||
/* Save registers. */
|
||||
movl %ebx, %edx
|
||||
cfi_register (3, 2)
|
||||
|
||||
lea 8(%esp), %eax
|
||||
call do_paccept
|
||||
|
||||
/* Restore registers. */
|
||||
movl %edx, %ebx
|
||||
cfi_restore (3)
|
||||
|
||||
/* Restore the cancellation. */
|
||||
xchgl %esi, %eax
|
||||
CDISABLE
|
||||
|
||||
/* Restore registers. */
|
||||
movl %esi, %eax
|
||||
popl %esi
|
||||
cfi_restore (6)
|
||||
cfi_adjust_cfa_offset(-4)
|
||||
|
||||
/* Successful; return the syscall's value. */
|
||||
ret
|
||||
#endif
|
||||
PSEUDO_END (paccept)
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/* Set flags signalling availability of kernel features based on given
|
||||
kernel version number.
|
||||
Copyright (C) 1999-2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2006, 2007, 2008 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
|
||||
|
|
@ -492,3 +492,18 @@
|
|||
#if __LINUX_KERNEL_VERSION >= 0x020618
|
||||
# define __ASSUME_ADJ_OFFSET_SS_READ 1
|
||||
#endif
|
||||
|
||||
/* Support for AT_EXECFN was added in 2.6.27. */
|
||||
#if __LINUX_KERNEL_VERSION >= 0x02061b
|
||||
# define __ASSUME_AT_EXECFN 1
|
||||
#endif
|
||||
|
||||
/* Support for various CLOEXEC and NONBLOCK flags was added for x86,
|
||||
x86-64, PPC, IA-64, and SPARC in 2.6.27. */
|
||||
#if __LINUX_KERNEL_VERSION >= 0x02061b \
|
||||
&& (defined __i386__ || defined __x86_64__ || defined __powerpc__ \
|
||||
|| defined __ia64__ || defined __sparc__)
|
||||
# define __ASSUME_SOCK_CLOEXEC 1
|
||||
# define __ASSUME_IN_NONBLOCK 1
|
||||
# define __ASSUME_PIPE2 1
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1999, 2001, 2002, 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1999, 2001, 2002, 2007, 2008 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
|
||||
|
|
@ -22,6 +22,7 @@
|
|||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
/* Return a socket of any type. The socket can be used in subsequent
|
||||
ioctl calls to talk to the kernel. */
|
||||
|
|
@ -70,7 +71,24 @@ __opensock (void)
|
|||
{
|
||||
assert (last_type != 0);
|
||||
|
||||
result = __socket (last_family, last_type, 0);
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec >= 0)
|
||||
# endif
|
||||
{
|
||||
result = __socket (last_family, last_type | SOCK_CLOEXEC, 0);
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec == 0)
|
||||
__have_sock_cloexec = result != -1 || errno != EINVAL ? 1 : -1;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
result = __socket (last_family, last_type, 0);
|
||||
#endif
|
||||
if (result != -1 || errno != EAFNOSUPPORT)
|
||||
/* Maybe the socket type isn't supported anymore (module is
|
||||
unloaded). In this case again try to find the type. */
|
||||
|
|
@ -105,7 +123,24 @@ __opensock (void)
|
|||
if (afs[cnt].family == AF_NETROM || afs[cnt].family == AF_X25)
|
||||
type = SOCK_SEQPACKET;
|
||||
|
||||
result = __socket (afs[cnt].family, type, 0);
|
||||
#ifdef SOCK_CLOEXEC
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec >= 0)
|
||||
# endif
|
||||
{
|
||||
result = __socket (afs[cnt].family, type | SOCK_CLOEXEC, 0);
|
||||
# ifndef __ASSUME_SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec == 0)
|
||||
__have_sock_cloexec = result != -1 || errno != EINVAL ? 1 : -1;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSUME_SOCK_CLOEXEC
|
||||
# ifdef SOCK_CLOEXEC
|
||||
if (__have_sock_cloexec < 0)
|
||||
# endif
|
||||
result = __socket (afs[cnt].family, type, 0);
|
||||
#endif
|
||||
if (result != -1)
|
||||
{
|
||||
/* Found an available family. */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2008.
|
||||
|
||||
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 <signal.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <sysdep-cancel.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#ifdef __NR_paccept
|
||||
int
|
||||
paccept (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len,
|
||||
const __sigset_t *ss, int flags)
|
||||
{
|
||||
if (SINGLE_THREAD_P)
|
||||
return INLINE_SYSCALL (paccept, 6, fd, addr, addr_len, ss,
|
||||
_NSIG / 8, flags);
|
||||
|
||||
int oldtype = LIBC_CANCEL_ASYNC ();
|
||||
|
||||
int result = INLINE_SYSCALL (paccept, 6, fd, addr, addr_len, ss,
|
||||
_NSIG / 8, flags);
|
||||
|
||||
LIBC_CANCEL_RESET (oldtype);
|
||||
|
||||
return result;
|
||||
}
|
||||
#else
|
||||
int
|
||||
paccept (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len,
|
||||
const __sigset_t *ss, int flags)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
stub_warning (epoll_pwait)
|
||||
}
|
||||
#endif
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
/* The `struct utmp' type, describing entries in the utmp file. GNU version.
|
||||
Copyright (C) 1993, 1996, 1997, 1998, 1999, 2002, 2008
|
||||
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 _UTMP_H
|
||||
# error "Never include <bits/utmp.h> directly; use <utmp.h> instead."
|
||||
#endif
|
||||
|
||||
#include <paths.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <bits/wordsize.h>
|
||||
|
||||
|
||||
#define UT_LINESIZE 32
|
||||
#define UT_NAMESIZE 32
|
||||
#define UT_HOSTSIZE 256
|
||||
|
||||
|
||||
/* The structure describing an entry in the database of
|
||||
previous logins. */
|
||||
struct lastlog
|
||||
{
|
||||
#if __WORDSIZE == 32
|
||||
int64_t ll_time;
|
||||
#else
|
||||
__time_t ll_time;
|
||||
#endif
|
||||
char ll_line[UT_LINESIZE];
|
||||
char ll_host[UT_HOSTSIZE];
|
||||
};
|
||||
|
||||
|
||||
/* The structure describing the status of a terminated process. This
|
||||
type is used in `struct utmp' below. */
|
||||
struct exit_status
|
||||
{
|
||||
short int e_termination; /* Process termination status. */
|
||||
short int e_exit; /* Process exit status. */
|
||||
};
|
||||
|
||||
|
||||
/* The structure describing an entry in the user accounting database. */
|
||||
struct utmp
|
||||
{
|
||||
short int ut_type; /* Type of login. */
|
||||
pid_t ut_pid; /* Process ID of login process. */
|
||||
char ut_line[UT_LINESIZE]; /* Devicename. */
|
||||
char ut_id[4]; /* Inittab ID. */
|
||||
char ut_user[UT_NAMESIZE]; /* Username. */
|
||||
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
|
||||
struct exit_status ut_exit; /* Exit status of a process marked
|
||||
as DEAD_PROCESS. */
|
||||
/* The ut_session and ut_tv fields must be the same size when compiled
|
||||
32- and 64-bit. This allows data files and shared memory to be
|
||||
shared between 32- and 64-bit applications. */
|
||||
#if __WORDSIZE == 32
|
||||
int64_t ut_session; /* Session ID, used for windowing. */
|
||||
struct
|
||||
{
|
||||
int64_t tv_sec; /* Seconds. */
|
||||
int64_t tv_usec; /* Microseconds. */
|
||||
} ut_tv; /* Time entry was made. */
|
||||
#else
|
||||
long int ut_session; /* Session ID, used for windowing. */
|
||||
struct timeval ut_tv; /* Time entry was made. */
|
||||
#endif
|
||||
|
||||
int32_t ut_addr_v6[4]; /* Internet address of remote host. */
|
||||
char __unused[20]; /* Reserved for future use. */
|
||||
};
|
||||
|
||||
/* Backwards compatibility hacks. */
|
||||
#define ut_name ut_user
|
||||
#ifndef _NO_UT_TIME
|
||||
/* We have a problem here: `ut_time' is also used otherwise. Define
|
||||
_NO_UT_TIME if the compiler complains. */
|
||||
# define ut_time ut_tv.tv_sec
|
||||
#endif
|
||||
#define ut_xtime ut_tv.tv_sec
|
||||
#define ut_addr ut_addr_v6[0]
|
||||
|
||||
|
||||
/* Values for the `ut_type' field of a `struct utmp'. */
|
||||
#define EMPTY 0 /* No valid user accounting information. */
|
||||
|
||||
#define RUN_LVL 1 /* The system's runlevel. */
|
||||
#define BOOT_TIME 2 /* Time of system boot. */
|
||||
#define NEW_TIME 3 /* Time after system clock changed. */
|
||||
#define OLD_TIME 4 /* Time when system clock changed. */
|
||||
|
||||
#define INIT_PROCESS 5 /* Process spawned by the init process. */
|
||||
#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
|
||||
#define USER_PROCESS 7 /* Normal process. */
|
||||
#define DEAD_PROCESS 8 /* Terminated process. */
|
||||
|
||||
#define ACCOUNTING 9
|
||||
|
||||
/* Old Linux name for the EMPTY type. */
|
||||
#define UT_UNKNOWN EMPTY
|
||||
|
||||
|
||||
/* Tell the user that we have a modern system with UT_HOST, UT_PID,
|
||||
UT_TYPE, UT_ID and UT_TV fields. */
|
||||
#define _HAVE_UT_TYPE 1
|
||||
#define _HAVE_UT_PID 1
|
||||
#define _HAVE_UT_ID 1
|
||||
#define _HAVE_UT_TV 1
|
||||
#define _HAVE_UT_HOST 1
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
/* Structures and definitions for the user accounting database. GNU version.
|
||||
Copyright (C) 1997, 1998, 2000, 2001, 2002, 2008
|
||||
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 _UTMPX_H
|
||||
# error "Never include <bits/utmpx.h> directly; use <utmpx.h> instead."
|
||||
#endif
|
||||
|
||||
#include <bits/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <bits/wordsize.h>
|
||||
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# include <paths.h>
|
||||
# define _PATH_UTMPX _PATH_UTMP
|
||||
# define _PATH_WTMPX _PATH_WTMP
|
||||
#endif
|
||||
|
||||
|
||||
#define __UT_LINESIZE 32
|
||||
#define __UT_NAMESIZE 32
|
||||
#define __UT_HOSTSIZE 256
|
||||
|
||||
|
||||
/* The structure describing the status of a terminated process. This
|
||||
type is used in `struct utmpx' below. */
|
||||
struct __exit_status
|
||||
{
|
||||
#ifdef __USE_GNU
|
||||
short int e_termination; /* Process termination status. */
|
||||
short int e_exit; /* Process exit status. */
|
||||
#else
|
||||
short int __e_termination; /* Process termination status. */
|
||||
short int __e_exit; /* Process exit status. */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/* The structure describing an entry in the user accounting database. */
|
||||
struct utmpx
|
||||
{
|
||||
short int ut_type; /* Type of login. */
|
||||
__pid_t ut_pid; /* Process ID of login process. */
|
||||
char ut_line[__UT_LINESIZE]; /* Devicename. */
|
||||
char ut_id[4]; /* Inittab ID. */
|
||||
char ut_user[__UT_NAMESIZE]; /* Username. */
|
||||
char ut_host[__UT_HOSTSIZE]; /* Hostname for remote login. */
|
||||
struct __exit_status ut_exit; /* Exit status of a process marked
|
||||
as DEAD_PROCESS. */
|
||||
|
||||
/* The fields ut_session and ut_tv must be the same size when compiled
|
||||
32- and 64-bit. This allows files and shared memory to be shared
|
||||
between 32- and 64-bit applications. */
|
||||
#if __WORDSIZE == 32
|
||||
__int64_t ut_session; /* Session ID, used for windowing. */
|
||||
struct
|
||||
{
|
||||
__int64_t tv_sec; /* Seconds. */
|
||||
__int64_t tv_usec; /* Microseconds. */
|
||||
} ut_tv; /* Time entry was made. */
|
||||
#else
|
||||
long int ut_session; /* Session ID, used for windowing. */
|
||||
struct timeval ut_tv; /* Time entry was made. */
|
||||
#endif
|
||||
__int32_t ut_addr_v6[4]; /* Internet address of remote host. */
|
||||
char __unused[20]; /* Reserved for future use. */
|
||||
};
|
||||
|
||||
|
||||
/* Values for the `ut_type' field of a `struct utmpx'. */
|
||||
#define EMPTY 0 /* No valid user accounting information. */
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define RUN_LVL 1 /* The system's runlevel. */
|
||||
#endif
|
||||
#define BOOT_TIME 2 /* Time of system boot. */
|
||||
#define NEW_TIME 3 /* Time after system clock changed. */
|
||||
#define OLD_TIME 4 /* Time when system clock changed. */
|
||||
|
||||
#define INIT_PROCESS 5 /* Process spawned by the init process. */
|
||||
#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
|
||||
#define USER_PROCESS 7 /* Normal process. */
|
||||
#define DEAD_PROCESS 8 /* Terminated process. */
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define ACCOUNTING 9 /* System accounting. */
|
||||
#endif
|
||||
|
|
@ -1,3 +1,8 @@
|
|||
ifeq ($(subdir),login)
|
||||
sysdep_routines += utmp32 utmpx32
|
||||
libutil-routines += login32
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),misc)
|
||||
sysdep_headers += sys/elf.h
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -26,4 +26,27 @@ libc {
|
|||
GLIBC_2.3.3 {
|
||||
posix_fadvise64; posix_fallocate64;
|
||||
}
|
||||
GLIBC_2.9 {
|
||||
getutent;
|
||||
getutid;
|
||||
getutline;
|
||||
pututline;
|
||||
updwtmp;
|
||||
getutent_r;
|
||||
getutid_r;
|
||||
getutline_r;
|
||||
getutxent;
|
||||
getutxid;
|
||||
getutxline;
|
||||
pututxline;
|
||||
updwtmpx;
|
||||
getutmp;
|
||||
getutmpx;
|
||||
}
|
||||
}
|
||||
|
||||
libutil {
|
||||
GLIBC_2.9 {
|
||||
login;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutent.c"
|
||||
|
||||
default_symbol_version (__getutent, getutent, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <bits/libc-lock.h>
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
#include "utmp-private.h"
|
||||
|
||||
weak_alias (__setutent, setutent)
|
||||
weak_alias (__endutent, endutent)
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutent_r.c"
|
||||
|
||||
default_symbol_version (__getutent_r, getutent_r, UTMP_COMPAT_BASE);
|
||||
default_symbol_version (__pututline, pututline, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutid.c"
|
||||
|
||||
default_symbol_version (__getutid, getutid, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <bits/libc-lock.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
#include "utmp-private.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutid_r.c"
|
||||
|
||||
default_symbol_version (__getutid_r, getutid_r, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutline.c"
|
||||
|
||||
default_symbol_version (__getutline, getutline, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <bits/libc-lock.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
#include "utmp-private.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "login/getutline_r.c"
|
||||
|
||||
default_symbol_version (__getutline_r, getutline_r, UTMP_COMPAT_BASE);;
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <string.h>
|
||||
#include <utmp.h>
|
||||
/* This is an ugly hack but we must not see the getutmpx declaration. */
|
||||
#define getutmpx XXXgetutmpx
|
||||
#include <utmpx.h>
|
||||
#undef getutmpx
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define getutmp __getutmp
|
||||
#define getutmpx __getutmpx
|
||||
#include "sysdeps/gnu/getutmp.c"
|
||||
#undef getutmp
|
||||
#undef getutmpx
|
||||
|
||||
default_symbol_version (__getutmp, getutmp, UTMP_COMPAT_BASE);
|
||||
default_symbol_version (__getutmpx, getutmpx, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define getutxent __getutxent
|
||||
#include "login/getutxent.c"
|
||||
#undef getutxent
|
||||
|
||||
default_symbol_version (__getutxent, getutxent, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define getutxid __getutxid
|
||||
#include "login/getutxid.c"
|
||||
#undef getutxid
|
||||
|
||||
default_symbol_version (__getutxid, getutxid, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define getutxline __getutxline
|
||||
#include "login/getutxline.c"
|
||||
#undef getutxline
|
||||
|
||||
default_symbol_version (__getutxline, getutxline, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <assert.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define login __login
|
||||
#include "login/login.c"
|
||||
#undef login
|
||||
|
||||
default_symbol_version (__login, login, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <libc-symbols.h>
|
||||
|
||||
#include "utmp32.h"
|
||||
#include "utmp-convert.h"
|
||||
|
||||
/* Write the given entry into utmp and wtmp. */
|
||||
void
|
||||
login32 (const struct utmp32 *entry)
|
||||
{
|
||||
struct utmp in64;
|
||||
|
||||
utmp_convert32to64 (entry, &in64);
|
||||
login (&in64);
|
||||
}
|
||||
|
||||
symbol_version (login32, login, GLIBC_2.0);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define pututxline __pututxline
|
||||
#include "login/pututxline.c"
|
||||
#undef pututxline
|
||||
|
||||
default_symbol_version (__pututxline, pututxline, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
#include "utmp-private.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#include "sysdeps/gnu/updwtmp.c"
|
||||
|
||||
default_symbol_version (__updwtmp, updwtmp, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
#include "utmp-compat.h"
|
||||
|
||||
#undef weak_alias
|
||||
#define weak_alias(n,a)
|
||||
#define updwtmpx __updwtmpx
|
||||
#include "login/updwtmpx.c"
|
||||
#undef updwtmpx
|
||||
|
||||
default_symbol_version (__updwtmpx, updwtmpx, UTMP_COMPAT_BASE);
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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. */
|
||||
|
||||
/* This macro defines the glibc version tag at which the 64 bit struct
|
||||
utmp functions have been added to the 32 bit glibc. */
|
||||
#define UTMP_COMPAT_BASE GLIBC_2.9
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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
|
||||
|
|
@ -0,0 +1,185 @@
|
|||
/* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>.
|
||||
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 <utmp.h>
|
||||
#include <errno.h>
|
||||
#include <libc-symbols.h>
|
||||
|
||||
#include "utmp32.h"
|
||||
#include "utmp-convert.h"
|
||||
|
||||
/* Allocate a static buffer to be returned to the caller. As well as
|
||||
with the existing version of these functions the caller has to be
|
||||
aware that the contents of this buffer will change with subsequent
|
||||
calls. */
|
||||
#define ALLOCATE_UTMP32_OUT(OUT) \
|
||||
static struct utmp32 *OUT = NULL; \
|
||||
\
|
||||
if (OUT == NULL) \
|
||||
{ \
|
||||
OUT = malloc (sizeof (struct utmp32)); \
|
||||
if (OUT == NULL) \
|
||||
return NULL; \
|
||||
}
|
||||
|
||||
/* Perform a lookup for a utmp entry matching FIELD using function
|
||||
FUNC. FIELD is converted to a 64 bit utmp and the result is
|
||||
converted back to 32 bit utmp. */
|
||||
#define ACCESS_UTMP_ENTRY(FUNC, FIELD) \
|
||||
struct utmp in64; \
|
||||
struct utmp *out64; \
|
||||
ALLOCATE_UTMP32_OUT (out32); \
|
||||
\
|
||||
utmp_convert32to64 (FIELD, &in64); \
|
||||
out64 = FUNC (&in64); \
|
||||
\
|
||||
if (out64 == NULL) \
|
||||
return NULL; \
|
||||
\
|
||||
utmp_convert64to32 (out64, out32); \
|
||||
\
|
||||
return out32;
|
||||
|
||||
/* Search forward from the current point in the utmp file until the
|
||||
next entry with a ut_type matching ID->ut_type. */
|
||||
struct utmp32 *
|
||||
getutid32 (const struct utmp32 *id)
|
||||
{
|
||||
ACCESS_UTMP_ENTRY (getutid, id)
|
||||
}
|
||||
symbol_version (getutid32, getutid, GLIBC_2.0);
|
||||
|
||||
/* Search forward from the current point in the utmp file until the
|
||||
next entry with a ut_line matching LINE->ut_line. */
|
||||
struct utmp32 *
|
||||
getutline32 (const struct utmp32 *line)
|
||||
{
|
||||
ACCESS_UTMP_ENTRY (getutline, line)
|
||||
}
|
||||
symbol_version (getutline32, getutline, GLIBC_2.0);
|
||||
|
||||
/* Write out entry pointed to by UTMP_PTR into the utmp file. */
|
||||
struct utmp32 *
|
||||
pututline32 (const struct utmp32 *utmp_ptr)
|
||||
{
|
||||
ACCESS_UTMP_ENTRY (pututline, utmp_ptr)
|
||||
}
|
||||
symbol_version (pututline32, pututline, GLIBC_2.0);
|
||||
|
||||
/* Read next entry from a utmp-like file. */
|
||||
struct utmp32 *
|
||||
getutent32 (void)
|
||||
{
|
||||
struct utmp *out64;
|
||||
ALLOCATE_UTMP32_OUT (out32);
|
||||
|
||||
out64 = getutent ();
|
||||
if (!out64)
|
||||
return NULL;
|
||||
|
||||
utmp_convert64to32 (out64, out32);
|
||||
return out32;
|
||||
}
|
||||
symbol_version (getutent32, getutent, GLIBC_2.0);
|
||||
|
||||
/* Reentrant versions of the file for handling utmp files. */
|
||||
|
||||
int
|
||||
getutent32_r (struct utmp32 *buffer, struct utmp32 **result)
|
||||
{
|
||||
struct utmp out64;
|
||||
struct utmp *out64p;
|
||||
int ret;
|
||||
|
||||
ret = getutent_r (&out64, &out64p);
|
||||
if (ret == -1)
|
||||
{
|
||||
*result = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
utmp_convert64to32 (out64p, buffer);
|
||||
*result = buffer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
symbol_version (getutent32_r, getutent_r, GLIBC_2.0);
|
||||
|
||||
int
|
||||
getutid32_r (const struct utmp32 *id, struct utmp32 *buffer,
|
||||
struct utmp32 **result)
|
||||
{
|
||||
struct utmp in64;
|
||||
struct utmp out64;
|
||||
struct utmp *out64p;
|
||||
int ret;
|
||||
|
||||
utmp_convert32to64 (id, &in64);
|
||||
|
||||
ret = getutid_r (&in64, &out64, &out64p);
|
||||
if (ret == -1)
|
||||
{
|
||||
*result = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
utmp_convert64to32 (out64p, buffer);
|
||||
*result = buffer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
symbol_version (getutid32_r, getutid_r, GLIBC_2.0);
|
||||
|
||||
int
|
||||
getutline32_r (const struct utmp32 *line,
|
||||
struct utmp32 *buffer, struct utmp32 **result)
|
||||
{
|
||||
struct utmp in64;
|
||||
struct utmp out64;
|
||||
struct utmp *out64p;
|
||||
int ret;
|
||||
|
||||
utmp_convert32to64 (line, &in64);
|
||||
|
||||
ret = getutline_r (&in64, &out64, &out64p);
|
||||
if (ret == -1)
|
||||
{
|
||||
*result = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
utmp_convert64to32 (out64p, buffer);
|
||||
*result = buffer;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
symbol_version (getutline32_r, getutline_r, GLIBC_2.0);
|
||||
|
||||
/* Append entry UTMP to the wtmp-like file WTMP_FILE. */
|
||||
void
|
||||
updwtmp32 (const char *wtmp_file, const struct utmp32 *utmp)
|
||||
{
|
||||
struct utmp in32;
|
||||
|
||||
utmp_convert32to64 (utmp, &in32);
|
||||
updwtmp (wtmp_file, &in32);
|
||||
}
|
||||
symbol_version (updwtmp32, updwtmp, GLIBC_2.0);
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue