123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /* Copyright (C) 2000-2019 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
- #include <errno.h>
- #include <stdlib.h>
- #include <netdb.h>
- #include "nsswitch.h"
- void *
- __nss_getent (getent_r_function func, void **resbuf, char **buffer,
- size_t buflen, size_t *buffer_size, int *h_errnop)
- {
- void *result;
- if (*buffer == NULL)
- {
- *buffer_size = buflen;
- *buffer = malloc (*buffer_size);
- }
- while (*buffer != NULL
- && func (resbuf, *buffer, *buffer_size, &result, h_errnop) == ERANGE
- && (h_errnop == NULL || *h_errnop == NETDB_INTERNAL))
- {
- char *new_buf;
- *buffer_size *= 2;
- new_buf = realloc (*buffer, *buffer_size);
- if (new_buf == NULL)
- {
- /* We are out of memory. Free the current buffer so that the
- process gets a chance for a normal termination. */
- int save = errno;
- free (*buffer);
- __set_errno (save);
- }
- *buffer = new_buf;
- }
- if (*buffer == NULL)
- result = NULL;
- return result;
- }
|