mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
* elf/Makefile (tests): Add nodlopen. Add rules to generate nodlopen. * include/dlfcn.h: Define __RTLD_DLOPEN. * elf/dl-load.c (_dl_map_object_from_fd): If DF_1_NOOPEN is set and this is a dlopen() call, do not load the binary. * dlfcn/dlopen.c: Add __RTLD_DLOPEN to mode passed down to _dl_open. * dlfcn/dlopenold.c: Likewise. * configure.in: Add test for -z nodelete option. * config.make.in: Define have-z-nodelete with libc_cv_z_nodelete. 2000-07-20 Mark Kettenis <kettenis@gnu.org> Make Hesiod NSS module thread-safe. * hesiod/README.hesiod: Update. * hesiod/Versions [GLIBC_2.2]: Add _nss_hesiod_getservbyport_r, _nss_hesiod_setprotoent, _nss_hesiod_endprotoent, _nss_hesiod_getprotobyname_r, and _nss_hesiod_getprotobynumber_r. * hesiod/Makefile (libnss_hesiod-routines): Add hesiod-init and hesiod-proto. * hesiod/nss_hesiod/hesiod-init.c: New file. * hesiod/nss_hesiod/hesiod-pwd.c: Rewritten for thread-safeness. * hesiod/nss_hesiod/hesiod-grp.c: Likewise. * hesiod/nss_hesiod/nss_hesiod.h: New file. * hesiod/nss_hesiod/hesiod-service.c (_nss_hesiod_getservbyport_r): New function. Provide support for looking up services by port number. * hesiod/nss_hesiod/hesiod-proto.c: New file. * hesiod/hesiod.c: Update from BIND 8.2.3-T5B. * hesiod/hesiod.h: Likewise. * hesiod/hesiod_p.h: Likewise. 2000-07-20 Mark Kettenis <kettenis@gnu.org> Fix problems with `struct __res_state' getting too big. * resolv/resolv.h (struct __sockaddr_in): New definition. (struct __res_state): Use __sockaddr_in instead of sockaddr_in in the private parts of the structure to save some space. * resolv/res_send.c (res_nsend): Cast &EXT(statp).nsaddrs[ns] to (struct sockaddr_in *) in call to sock_eq. Use memcpy to copy statp->nsaddr_list[ns] to &EXT(statp).nsaddrs[ns]. 2000-07-20 Ulrich Drepper <drepper@redhat.com> * sysdeps/mach/hurd/dl-sysdep.c: Likewise.cvs/glibc-2-2-branch
26 changed files with 965 additions and 721 deletions
@ -0,0 +1,39 @@ |
|||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
|||
This file is part of the GNU C Library. |
|||
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 2000. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Library General Public License as |
|||
published by the Free Software Foundation; either version 2 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 |
|||
Library General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Library General Public |
|||
License along with the GNU C Library; see the file COPYING.LIB. If not, |
|||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|||
Boston, MA 02111-1307, USA. */ |
|||
|
|||
#include <sys/cdefs.h> /* Needs to come before <hesiod.h>. */ |
|||
#include <hesiod.h> |
|||
#include <resolv.h> |
|||
#include <stddef.h> |
|||
|
|||
#include "nss_hesiod.h" |
|||
|
|||
void * |
|||
_nss_hesiod_init (void) |
|||
{ |
|||
void *context; |
|||
|
|||
if (hesiod_init (&context) == -1) |
|||
return NULL; |
|||
|
|||
/* Use the default (per-thread) resolver state. */ |
|||
__hesiod_res_set (context, &_res, NULL); |
|||
|
|||
return context; |
|||
} |
|||
@ -0,0 +1,137 @@ |
|||
/* Copyright (C) 1997, 2000 Free Software Foundation, Inc.
|
|||
This file is part of the GNU C Library. |
|||
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Library General Public License as |
|||
published by the Free Software Foundation; either version 2 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 |
|||
Library General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Library General Public |
|||
License along with the GNU C Library; see the file COPYING.LIB. If not, |
|||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|||
Boston, MA 02111-1307, USA. */ |
|||
|
|||
#include <errno.h> |
|||
#include <hesiod.h> |
|||
#include <netdb.h> |
|||
#include <netinet/in.h> |
|||
#include <nss.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
|
|||
#include "nss_hesiod.h" |
|||
|
|||
/* Declare a parser for Hesiod protocol entries. Although the format
|
|||
of the entries is identical to those in /etc/protocols, here is no |
|||
predefined parser for us to use. */ |
|||
|
|||
#define ENTNAME protoent |
|||
|
|||
struct protoent_data {}; |
|||
|
|||
#define TRAILING_LIST_MEMBER p_aliases |
|||
#define TRAILING_LIST_SEPARATOR_P isspace |
|||
#include <nss/nss_files/files-parse.c> |
|||
LINE_PARSER |
|||
("#", |
|||
STRING_FIELD (result->p_name, isspace, 1); |
|||
INT_FIELD (result->p_proto, isspace, 1, 10,); |
|||
) |
|||
|
|||
enum nss_status |
|||
_nss_hesiod_setprotoent (void) |
|||
{ |
|||
return NSS_STATUS_SUCCESS; |
|||
} |
|||
|
|||
enum nss_status |
|||
_nss_hesiod_endprotoent (void) |
|||
{ |
|||
return NSS_STATUS_SUCCESS; |
|||
} |
|||
|
|||
static enum nss_status |
|||
lookup (const char *name, const char *type, struct protoent *proto, |
|||
char *buffer, size_t buflen, int *errnop) |
|||
{ |
|||
struct parser_data *data = (void *) buffer; |
|||
size_t linebuflen; |
|||
void *context; |
|||
char **list, **item; |
|||
int parse_res; |
|||
int found; |
|||
|
|||
context = _nss_hesiod_init (); |
|||
if (context == NULL) |
|||
return NSS_STATUS_UNAVAIL; |
|||
|
|||
list = hesiod_resolve (context, name, type); |
|||
if (list == NULL) |
|||
{ |
|||
hesiod_end (context); |
|||
return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL; |
|||
} |
|||
|
|||
linebuflen = buffer + buflen - data->linebuffer; |
|||
|
|||
item = list; |
|||
found = 0; |
|||
do |
|||
{ |
|||
size_t len = strlen (*item) + 1; |
|||
|
|||
if (linebuflen < len) |
|||
{ |
|||
hesiod_free_list (context, list); |
|||
hesiod_end (context); |
|||
*errnop = ERANGE; |
|||
return NSS_STATUS_TRYAGAIN; |
|||
} |
|||
|
|||
memcpy (data->linebuffer, *item, len); |
|||
|
|||
parse_res = parse_line (buffer, proto, data, buflen, errnop); |
|||
if (parse_res == -1) |
|||
{ |
|||
hesiod_free_list (context, list); |
|||
hesiod_end (context); |
|||
return NSS_STATUS_TRYAGAIN; |
|||
} |
|||
|
|||
if (parse_res > 0) |
|||
found = 1; |
|||
|
|||
++item; |
|||
} |
|||
while (*item != NULL && !found); |
|||
|
|||
hesiod_free_list (context, list); |
|||
hesiod_end (context); |
|||
|
|||
return found ? NSS_STATUS_SUCCESS : NSS_STATUS_NOTFOUND; |
|||
} |
|||
|
|||
enum nss_status |
|||
_nss_hesiod_getprotobyname_r (const char *name, struct protoent *proto, |
|||
char *buffer, size_t buflen, int *errnop) |
|||
{ |
|||
return lookup (name, "protocol", proto, buffer, buflen, errnop); |
|||
} |
|||
|
|||
enum nss_status |
|||
_nss_hesiod_getprotobynumber_r (const int protocol, struct protoent *proto, |
|||
char *buffer, size_t buflen, int *errnop) |
|||
{ |
|||
char protostr[21]; |
|||
|
|||
snprintf (protostr, sizeof protostr, "%d", protocol); |
|||
|
|||
return lookup (protostr, "protonum", proto, buffer, buflen, errnop); |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
|||
This file is part of the GNU C Library. |
|||
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 2000. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Library General Public License as |
|||
published by the Free Software Foundation; either version 2 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 |
|||
Library General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Library General Public |
|||
License along with the GNU C Library; see the file COPYING.LIB. If not, |
|||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|||
Boston, MA 02111-1307, USA. */ |
|||
|
|||
/* Initialize a Hesiod context. */ |
|||
extern void *_nss_hesiod_init (void); |
|||
Loading…
Reference in new issue