Mark compat code with attribute_compat_text_section.
[kopensolaris-gnu/glibc.git] / nss / getXXent.c
1 /* Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <bits/libc-lock.h>
21 #include <stdlib.h>
22
23 #include "nsswitch.h"
24
25 /*******************************************************************\
26 |* Here we assume several symbols to be defined:                   *|
27 |*                                                                 *|
28 |* LOOKUP_TYPE   - the return type of the function                 *|
29 |*                                                                 *|
30 |* GETFUNC_NAME  - name of the non-reentrant getXXXent function    *|
31 |*                                                                 *|
32 |* BUFLEN        - size of static buffer                           *|
33 |*                                                                 *|
34 |* Optionally the following vars can be defined:                   *|
35 |*                                                                 *|
36 |* NEED_H_ERRNO  - an extra parameter will be passed to point to   *|
37 |*                 the global `h_errno' variable.                  *|
38 |*                                                                 *|
39 \*******************************************************************/
40
41 /* To make the real sources a bit prettier.  */
42 #define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME)
43 #define APPEND_R(name) APPEND_R1 (name)
44 #define APPEND_R1(name) name##_r
45 #define INTERNAL(name) INTERNAL1 (name)
46 #define INTERNAL1(name) __##name
47
48 /* Sometimes we need to store error codes in the `h_errno' variable.  */
49 #ifdef NEED_H_ERRNO
50 # define H_ERRNO_PARM , int *h_errnop
51 # define H_ERRNO_VAR &h_errno
52 #else
53 # define H_ERRNO_PARM
54 # define H_ERRNO_VAR NULL
55 #endif
56
57 /* Prototype of the reentrant version.  */
58 extern int INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer,
59                                          size_t buflen, LOOKUP_TYPE **result
60                                          H_ERRNO_PARM);
61
62 /* We need to protect the dynamic buffer handling.  */
63 __libc_lock_define_initialized (static, lock);
64
65 /* This points to the static buffer used.  */
66 libc_freeres_ptr (static char *buffer);
67
68
69 LOOKUP_TYPE *
70 GETFUNC_NAME (void)
71 {
72   static size_t buffer_size;
73   static union
74   {
75     LOOKUP_TYPE l;
76     void *ptr;
77   } resbuf;
78   LOOKUP_TYPE *result;
79   int save;
80
81   /* Get lock.  */
82   __libc_lock_lock (lock);
83
84   result = (LOOKUP_TYPE *)
85     __nss_getent ((getent_r_function) INTERNAL (REENTRANT_GETNAME),
86                   &resbuf.ptr, &buffer, BUFLEN, &buffer_size,
87                   H_ERRNO_VAR);
88
89   save = errno;
90   __libc_lock_unlock (lock);
91   __set_errno (save);
92   return result;
93 }
94
95 static_link_warning (GETFUNC_NAME)