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

glibc/2.7/nss/getnssent.c

    1: /* Copyright (C) 2000, 2004 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 <stdlib.h>
   21: #include <netdb.h>
   22: #include "nsswitch.h"
   23: 
   24: void *
   25: __nss_getent (getent_r_function func, void **resbuf, char **buffer,
   26:               size_t buflen, size_t *buffer_size, int *h_errnop)
   27: {
   28:   void *result;
   29: 
   30:   if (*buffer == NULL)
   31:     {
   32:       *buffer_size = buflen;
   33:       *buffer = malloc (*buffer_size);
   34:     }
   35: 
   36:   while (buffer != NULL
   37:          && func (resbuf, *buffer, *buffer_size, &result, h_errnop) == ERANGE
   38:          && (h_errnop == NULL || *h_errnop == NETDB_INTERNAL))
   39:     {
   40:       char *new_buf;
   41:       *buffer_size *= 2;
   42:       new_buf = realloc (*buffer, *buffer_size);
   43:       if (new_buf == NULL)
   44:         {
   45:           /* We are out of memory.  Free the current buffer so that the
   46:              process gets a chance for a normal termination.  */
   47:           int save = errno;
   48:           free (*buffer);
   49:           __set_errno (save);
   50:         }
   51:       *buffer = new_buf;
   52:     }
   53: 
   54:   if (*buffer == NULL)
   55:     result = NULL;
   56: 
   57:   return result;
   58: }
Syntax (Markdown)