(linenum→info "unix/slp.c:2238")

glibc/2.7/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)
Syntax (Markdown)