mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 21:23:52 +08:00
ec999b8e5e
It was noted in <https://sourceware.org/ml/libc-alpha/2012-09/msg00305.html> that the bits/*.h naming scheme should only be used for installed headers. This patch renames bits/libc-lock.h to plain libc-lock.h and bits/libc-lockP.h to plain libc-lockP.h to follow that convention. Note that I don't know where libc-lockP.h comes from for Hurd (the Hurd libc-lock.h includes libc-lockP.h, but the only libc-lockP.h in the glibc source tree is for NPTL) - some unmerged patch? - but I updated the #include in the Hurd libc-lock.h anyway. Tested for x86_64 (testsuite, and that installed stripped shared libraries are unchanged by the patch). [BZ #14912] * bits/libc-lock.h: Move to ... * sysdeps/generic/libc-lock.h: ...here. (_BITS_LIBC_LOCK_H): Rename macro to _LIBC_LOCK_H. * sysdeps/mach/hurd/bits/libc-lock.h: Move to ... * sysdeps/mach/hurd/libc-lock.h: ...here. (_BITS_LIBC_LOCK_H): Rename macro to _LIBC_LOCK_H. [_LIBC]: Include <libc-lockP.h> instead of <bits/libc-lockP.h>. * sysdeps/mach/bits/libc-lock.h: Move to ... * sysdeps/mach/libc-lock.h: ...here. (_BITS_LIBC_LOCK_H): Rename macro to _LIBC_LOCK_H. * sysdeps/nptl/bits/libc-lock.h: Move to ... * sysdeps/nptl/libc-lock.h: ...here. (_BITS_LIBC_LOCK_H): Rename macro to _LIBC_LOCK_H. * sysdeps/nptl/bits/libc-lockP.h: Move to ... * sysdeps/nptl/libc-lockP.h: ...here. (_BITS_LIBC_LOCKP_H): Rename macro to _LIBC_LOCKP_H. * crypt/crypt_util.c: Include <libc-lock.h> instead of <bits/libc-lock.h>. * dirent/scandir-tail.c: Likewise. * dlfcn/dlerror.c: Likewise. * elf/dl-close.c: Likewise. * elf/dl-iteratephdr.c: Likewise. * elf/dl-lookup.c: Likewise. * elf/dl-open.c: Likewise. * elf/dl-support.c: Likewise. * elf/dl-writev.h: Likewise. * elf/rtld.c: Likewise. * grp/fgetgrent.c: Likewise. * gshadow/fgetsgent.c: Likewise. * gshadow/sgetsgent.c: Likewise. * iconv/gconv_conf.c: Likewise. * iconv/gconv_db.c: Likewise. * iconv/gconv_dl.c: Likewise. * iconv/gconv_int.h: Likewise. * iconv/gconv_trans.c: Likewise. * include/link.h: Likewise. * inet/getnameinfo.c: Likewise. * inet/getnetgrent.c: Likewise. * inet/getnetgrent_r.c: Likewise. * intl/bindtextdom.c: Likewise. * intl/dcigettext.c: Likewise. * intl/finddomain.c: Likewise. * intl/gettextP.h: Likewise. * intl/loadmsgcat.c: Likewise. * intl/localealias.c: Likewise. * intl/textdomain.c: Likewise. * libidn/idn-stub.c: Likewise. * libio/libioP.h: Likewise. * locale/duplocale.c: Likewise. * locale/freelocale.c: Likewise. * locale/newlocale.c: Likewise. * locale/setlocale.c: Likewise. * login/getutent_r.c: Likewise. * login/getutid_r.c: Likewise. * login/getutline_r.c: Likewise. * login/utmp-private.h: Likewise. * login/utmpname.c: Likewise. * malloc/mtrace.c: Likewise. * misc/efgcvt.c: Likewise. * misc/error.c: Likewise. * misc/fstab.c: Likewise. * misc/getpass.c: Likewise. * misc/mntent.c: Likewise. * misc/syslog.c: Likewise. * nis/nis_call.c: Likewise. * nis/nis_callback.c: Likewise. * nis/nss-default.c: Likewise. * nis/nss_compat/compat-grp.c: Likewise. * nis/nss_compat/compat-initgroups.c: Likewise. * nis/nss_compat/compat-pwd.c: Likewise. * nis/nss_compat/compat-spwd.c: Likewise. * nis/nss_nis/nis-alias.c: Likewise. * nis/nss_nis/nis-ethers.c: Likewise. * nis/nss_nis/nis-grp.c: Likewise. * nis/nss_nis/nis-hosts.c: Likewise. * nis/nss_nis/nis-network.c: Likewise. * nis/nss_nis/nis-proto.c: Likewise. * nis/nss_nis/nis-pwd.c: Likewise. * nis/nss_nis/nis-rpc.c: Likewise. * nis/nss_nis/nis-service.c: Likewise. * nis/nss_nis/nis-spwd.c: Likewise. * nis/nss_nisplus/nisplus-alias.c: Likewise. * nis/nss_nisplus/nisplus-ethers.c: Likewise. * nis/nss_nisplus/nisplus-grp.c: Likewise. * nis/nss_nisplus/nisplus-hosts.c: Likewise. * nis/nss_nisplus/nisplus-initgroups.c: Likewise. * nis/nss_nisplus/nisplus-network.c: Likewise. * nis/nss_nisplus/nisplus-proto.c: Likewise. * nis/nss_nisplus/nisplus-pwd.c: Likewise. * nis/nss_nisplus/nisplus-rpc.c: Likewise. * nis/nss_nisplus/nisplus-service.c: Likewise. * nis/nss_nisplus/nisplus-spwd.c: Likewise. * nis/ypclnt.c: Likewise. * nptl/libc_pthread_init.c: Likewise. * nss/getXXbyYY.c: Likewise. * nss/getXXent.c: Likewise. * nss/getXXent_r.c: Likewise. * nss/nss_db/db-XXX.c: Likewise. * nss/nss_db/db-netgrp.c: Likewise. * nss/nss_db/nss_db.h: Likewise. * nss/nss_files/files-XXX.c: Likewise. * nss/nss_files/files-alias.c: Likewise. * nss/nsswitch.c: Likewise. * posix/regex_internal.h: Likewise. * posix/wordexp.c: Likewise. * pwd/fgetpwent.c: Likewise. * resolv/res_hconf.c: Likewise. * resolv/res_libc.c: Likewise. * shadow/fgetspent.c: Likewise. * shadow/lckpwdf.c: Likewise. * shadow/sgetspent.c: Likewise. * socket/opensock.c: Likewise. * stdio-common/reg-modifier.c: Likewise. * stdio-common/reg-printf.c: Likewise. * stdio-common/reg-type.c: Likewise. * stdio-common/vfprintf.c: Likewise. * stdio-common/vfscanf.c: Likewise. * stdlib/abort.c: Likewise. * stdlib/cxa_atexit.c: Likewise. * stdlib/fmtmsg.c: Likewise. * stdlib/random.c: Likewise. * stdlib/setenv.c: Likewise. * string/strsignal.c: Likewise. * sunrpc/auth_none.c: Likewise. * sunrpc/bindrsvprt.c: Likewise. * sunrpc/create_xid.c: Likewise. * sunrpc/key_call.c: Likewise. * sunrpc/rpc_thread.c: Likewise. * sysdeps/arm/backtrace.c: Likewise. * sysdeps/generic/ldsodefs.h: Likewise. * sysdeps/generic/stdio-lock.h: Likewise. * sysdeps/generic/unwind-dw2-fde.c: Likewise. * sysdeps/i386/backtrace.c: Likewise. * sysdeps/ieee754/ldbl-opt/nldbl-compat.c: Likewise. * sysdeps/m68k/backtrace.c: Likewise. * sysdeps/mach/hurd/cthreads.c: Likewise. * sysdeps/mach/hurd/dirstream.h: Likewise. * sysdeps/mach/hurd/malloc-machine.h: Likewise. * sysdeps/nptl/malloc-machine.h: Likewise. * sysdeps/nptl/stdio-lock.h: Likewise. * sysdeps/posix/dirstream.h: Likewise. * sysdeps/posix/getaddrinfo.c: Likewise. * sysdeps/posix/system.c: Likewise. * sysdeps/pthread/aio_suspend.c: Likewise. * sysdeps/s390/s390-32/backtrace.c: Likewise. * sysdeps/s390/s390-64/backtrace.c: Likewise. * sysdeps/unix/sysv/linux/check_pf.c: Likewise. * sysdeps/unix/sysv/linux/if_index.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/getutent_r.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/getutid_r.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/getutline_r.c: Likewise. * sysdeps/unix/sysv/linux/shm-directory.c: Likewise. * sysdeps/unix/sysv/linux/system.c: Likewise. * sysdeps/x86_64/backtrace.c: Likewise. * time/alt_digit.c: Likewise. * time/era.c: Likewise. * time/tzset.c: Likewise. * wcsmbs/wcsmbsload.c: Likewise. * nptl/tst-initializers1.c (do_test): Refer to <libc-lock.h> instead of <bits/libc-lock.h> in comment.
213 lines
6.5 KiB
C
213 lines
6.5 KiB
C
/* Copyright (C) 1996-2015 Free Software Foundation, Inc.
|
||
This file is part of the GNU C Library.
|
||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||
|
||
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, see
|
||
<http://www.gnu.org/licenses/>. */
|
||
|
||
#include <errno.h>
|
||
#include <libc-lock.h>
|
||
|
||
#include "nsswitch.h"
|
||
|
||
/*******************************************************************\
|
||
|* Here we assume several symbols to be defined: *|
|
||
|* *|
|
||
|* LOOKUP_TYPE - the return type of the function *|
|
||
|* *|
|
||
|* SETFUNC_NAME - name of the non-reentrant setXXXent function *|
|
||
|* *|
|
||
|* GETFUNC_NAME - name of the non-reentrant getXXXent function *|
|
||
|* *|
|
||
|* ENDFUNC_NAME - name of the non-reentrant endXXXent function *|
|
||
|* *|
|
||
|* DATABASE_NAME - name of the database the function accesses *|
|
||
|* (e.g., host, services, ...) *|
|
||
|* *|
|
||
|* Optionally the following vars can be defined: *|
|
||
|* *|
|
||
|* STAYOPEN - variable declaration for setXXXent function *|
|
||
|* *|
|
||
|* STAYOPEN_VAR - variable name for setXXXent function *|
|
||
|* *|
|
||
|* NEED_H_ERRNO - an extra parameter will be passed to point to *|
|
||
|* the global `h_errno' variable. *|
|
||
|* *|
|
||
\*******************************************************************/
|
||
|
||
/* To make the real sources a bit prettier. */
|
||
#define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME)
|
||
#define APPEND_R(Name) CONCAT2_2 (Name, _r)
|
||
#define INTERNAL(Name) CONCAT2_2 (__, Name)
|
||
#define CONCAT2_1(Pre, Post) CONCAT2_2 (Pre, Post)
|
||
#define CONCAT2_2(Pre, Post) Pre##Post
|
||
#define NEW(name) NEW1 (name)
|
||
#define NEW1(name) __new_##name
|
||
|
||
#define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME)
|
||
#define GETFUNC_NAME_STRING STRINGIZE (REENTRANT_GETNAME)
|
||
#define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME)
|
||
#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
|
||
#define STRINGIZE(Name) STRINGIZE1 (Name)
|
||
#define STRINGIZE1(Name) #Name
|
||
|
||
#ifndef DB_LOOKUP_FCT
|
||
# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2)
|
||
# define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
|
||
# define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
|
||
#endif
|
||
|
||
/* Sometimes we need to store error codes in the `h_errno' variable. */
|
||
#ifdef NEED_H_ERRNO
|
||
# define H_ERRNO_PARM , int *h_errnop
|
||
# define H_ERRNO_VAR , &h_errno
|
||
# define H_ERRNO_VAR_P &h_errno
|
||
#else
|
||
# define H_ERRNO_PARM
|
||
# define H_ERRNO_VAR
|
||
# define H_ERRNO_VAR_P NULL
|
||
#endif
|
||
|
||
/* Some databases take the `stayopen' flag. */
|
||
#ifdef STAYOPEN
|
||
# define STAYOPEN_TMP CONCAT2_1 (STAYOPEN, _tmp)
|
||
# define STAYOPEN_TMPVAR &CONCAT2_1 (STAYOPEN_VAR, _tmp)
|
||
#else
|
||
# define STAYOPEN void
|
||
# define STAYOPEN_VAR 0
|
||
# define STAYOPEN_TMPVAR NULL
|
||
#endif
|
||
|
||
#ifndef NEED__RES
|
||
# define NEED__RES 0
|
||
#endif
|
||
|
||
/* This handle for the NSS data base is shared between all
|
||
set/get/endXXXent functions. */
|
||
static service_user *nip;
|
||
/* Remember the last service used since the last call to `endXXent'. */
|
||
static service_user *last_nip;
|
||
/* Remember the first service_entry, it's always the same. */
|
||
static service_user *startp;
|
||
|
||
#ifdef STAYOPEN_TMP
|
||
/* We need to remember the last `stayopen' flag given by the user
|
||
since the `setent' function is only called for the first available
|
||
service. */
|
||
static STAYOPEN_TMP;
|
||
#endif
|
||
|
||
/* Protect above variable against multiple uses at the same time. */
|
||
__libc_lock_define_initialized (static, lock)
|
||
|
||
/* The lookup function for the first entry of this service. */
|
||
extern int DB_LOOKUP_FCT (service_user **nip, const char *name,
|
||
const char *name2, void **fctp)
|
||
internal_function;
|
||
libc_hidden_proto (DB_LOOKUP_FCT)
|
||
|
||
void
|
||
SETFUNC_NAME (STAYOPEN)
|
||
{
|
||
int save;
|
||
|
||
__libc_lock_lock (lock);
|
||
__nss_setent (SETFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp,
|
||
&last_nip, STAYOPEN_VAR, STAYOPEN_TMPVAR, NEED__RES);
|
||
|
||
save = errno;
|
||
__libc_lock_unlock (lock);
|
||
__set_errno (save);
|
||
}
|
||
|
||
|
||
void
|
||
ENDFUNC_NAME (void)
|
||
{
|
||
int save;
|
||
|
||
/* If the service has not been used before do not do anything. */
|
||
if (startp != NULL)
|
||
{
|
||
__libc_lock_lock (lock);
|
||
__nss_endent (ENDFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp,
|
||
&last_nip, NEED__RES);
|
||
save = errno;
|
||
__libc_lock_unlock (lock);
|
||
__set_errno (save);
|
||
}
|
||
}
|
||
|
||
|
||
int
|
||
INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
|
||
LOOKUP_TYPE **result H_ERRNO_PARM)
|
||
{
|
||
int status;
|
||
int save;
|
||
|
||
__libc_lock_lock (lock);
|
||
status = __nss_getent_r (GETFUNC_NAME_STRING, SETFUNC_NAME_STRING,
|
||
DB_LOOKUP_FCT, &nip, &startp, &last_nip,
|
||
STAYOPEN_TMPVAR, NEED__RES, resbuf, buffer,
|
||
buflen, (void **) result, H_ERRNO_VAR_P);
|
||
save = errno;
|
||
__libc_lock_unlock (lock);
|
||
__set_errno (save);
|
||
return status;
|
||
}
|
||
|
||
|
||
#ifdef NO_COMPAT_NEEDED
|
||
strong_alias (INTERNAL (REENTRANT_GETNAME), REENTRANT_GETNAME);
|
||
#else
|
||
# include <shlib-compat.h>
|
||
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2)
|
||
# define OLD(name) OLD1 (name)
|
||
# define OLD1(name) __old_##name
|
||
|
||
int
|
||
attribute_compat_text_section
|
||
OLD (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
|
||
LOOKUP_TYPE **result H_ERRNO_PARM)
|
||
{
|
||
int ret = INTERNAL (REENTRANT_GETNAME) (resbuf, buffer, buflen,
|
||
result H_ERRNO_VAR);
|
||
|
||
if (ret != 0)
|
||
ret = -1;
|
||
|
||
return ret;
|
||
}
|
||
|
||
# define do_symbol_version(real, name, version) \
|
||
compat_symbol (libc, real, name, version)
|
||
do_symbol_version (OLD (REENTRANT_GETNAME), REENTRANT_GETNAME, GLIBC_2_0);
|
||
# endif
|
||
|
||
/* As INTERNAL (REENTRANT_GETNAME) may be hidden, we need an alias
|
||
in between so that the REENTRANT_GETNAME@@GLIBC_2.1.2 is not
|
||
hidden too. */
|
||
strong_alias (INTERNAL (REENTRANT_GETNAME), NEW (REENTRANT_GETNAME));
|
||
|
||
# define do_default_symbol_version(real, name, version) \
|
||
versioned_symbol (libc, real, name, version)
|
||
do_default_symbol_version (NEW (REENTRANT_GETNAME),
|
||
REENTRANT_GETNAME, GLIBC_2_1_2);
|
||
#endif
|
||
|
||
nss_interface_function (SETFUNC_NAME)
|
||
nss_interface_function (ENDFUNC_NAME)
|
||
nss_interface_function (REENTRANT_GETNAME)
|