1  /* Generic implementation of fget*ent_r.
       2     Copyright (C) 2020-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <errno.h>
      20  #include <nss_files.h>
      21  #include <stdbool.h>
      22  
      23  int
      24  __nss_fgetent_r (FILE *fp, void *result, char *buffer, size_t buffer_length,
      25                   nss_files_parse_line parser)
      26  {
      27    int ret;
      28  
      29    _IO_flockfile (fp);
      30  
      31    while (true)
      32      {
      33        off64_t original_offset;
      34        ret = __nss_readline (fp, buffer, buffer_length, &original_offset);
      35        if (ret == 0)
      36          {
      37            /* Parse the line into *RESULT.  */
      38            ret = parser (buffer, result,
      39                          (struct parser_data *) buffer, buffer_length, &errno);
      40  
      41            /* Translate the result code from the parser into an errno
      42               value.  Also seeks back to the start of the line if
      43               necessary.  */
      44            ret = __nss_parse_line_result (fp, original_offset, ret);
      45  
      46            if (ret == EINVAL)
      47              /* Skip over malformed lines.  */
      48              continue;
      49          }
      50        break;
      51      }
      52  
      53    _IO_funlockfile (fp);
      54  
      55    return ret;
      56  }