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

glibc/2.7/grp/fgetgrent.c

    1: /* Copyright (C) 1991,1996,1997,1999,2000,2002 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 <grp.h>
   21: #include <bits/libc-lock.h>
   22: #include <stdio.h>
   23: #include <stdlib.h>
   24: 
   25: 
   26: /* We need to protect the dynamic buffer handling.  */
   27: __libc_lock_define_initialized (static, lock);
   28: 
   29: libc_freeres_ptr (static char *buffer);
   30: 
   31: /* Read one entry from the given stream.  */
   32: struct group *
   33: fgetgrent (FILE *stream)
   34: {
   35:   static size_t buffer_size;
   36:   static struct group resbuf;
   37:   fpos_t pos;
   38:   struct group *result;
   39:   int save;
   40: 
   41:   if (__builtin_expect (fgetpos (stream, &pos), 0) != 0)
   42:     return NULL;
   43: 
   44:   /* Get lock.  */
   45:   __libc_lock_lock (lock);
   46: 
   47:   /* Allocate buffer if not yet available.  */
   48:   if (buffer == NULL)
   49:     {
   50:       buffer_size = NSS_BUFLEN_GROUP;
   51:       buffer = malloc (buffer_size);
   52:     }
   53: 
   54:   while (buffer != NULL
   55:          && (__fgetgrent_r (stream, &resbuf, buffer, buffer_size, &result)
   56:              == ERANGE))
   57:     {
   58:       char *new_buf;
   59:       buffer_size += NSS_BUFLEN_GROUP;
   60:       new_buf = realloc (buffer, buffer_size);
   61:       if (__builtin_expect (new_buf == NULL, 0))
   62:         {
   63:           /* We are out of memory.  Free the current buffer so that the
   64:              process gets a chance for a normal termination.  */
   65:           save = errno;
   66:           free (buffer);
   67:           __set_errno (save);
   68:         }
   69:       buffer = new_buf;
   70: 
   71:       /* Reset the stream.  */
   72:       if (fsetpos (stream, &pos) != 0)
   73:         buffer = NULL;
   74:     }
   75: 
   76:   if (buffer == NULL)
   77:     result = NULL;
   78: 
   79:   /* Release lock.  Preserve error value.  */
   80:   save = errno;
   81:   __libc_lock_unlock (lock);
   82:   __set_errno (save);
   83: 
   84:   return result;
   85: }
Syntax (Markdown)