Blame nis/nss_nisplus/nisplus-service.c

Packit Service 82fcde
/* Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <atomic.h>
Packit Service 82fcde
#include <ctype.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <netdb.h>
Packit Service 82fcde
#include <nss.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <rpcsvc/nis.h>
Packit Service 82fcde
#include <libc-lock.h>
Packit Service 82fcde
Packit Service 82fcde
#include "nss-nisplus.h"
Packit Service 82fcde
Packit Service 82fcde
__libc_lock_define_initialized (static, lock);
Packit Service 82fcde
Packit Service 82fcde
static nis_result *result;
Packit Service 82fcde
static nis_name tablename_val;
Packit Service 82fcde
static u_long tablename_len;
Packit Service 82fcde
Packit Service 82fcde
#define NISENTRYVAL(idx, col, res) \
Packit Service 82fcde
  (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val)
Packit Service 82fcde
Packit Service 82fcde
#define NISENTRYLEN(idx, col, res) \
Packit Service 82fcde
    (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
_nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
Packit Service 82fcde
			    char *buffer, size_t buflen, int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  char *first_unused = buffer;
Packit Service 82fcde
  size_t room_left = buflen;
Packit Service 82fcde
Packit Service 82fcde
  if (result == NULL)
Packit Service 82fcde
    return 0;
Packit Service 82fcde
Packit Service 82fcde
  if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS)
Packit Service 82fcde
      || __type_of (NIS_RES_OBJECT (result)) != NIS_ENTRY_OBJ
Packit Service 82fcde
      || strcmp (NIS_RES_OBJECT (result)->EN_data.en_type, "services_tbl") != 0
Packit Service 82fcde
      || NIS_RES_OBJECT (result)->EN_data.en_cols.en_cols_len < 4)
Packit Service 82fcde
    return 0;
Packit Service 82fcde
Packit Service 82fcde
  if (NISENTRYLEN (0, 0, result) >= room_left)
Packit Service 82fcde
    {
Packit Service 82fcde
    no_more_room:
Packit Service 82fcde
      *errnop = ERANGE;
Packit Service 82fcde
      return -1;
Packit Service 82fcde
    }
Packit Service 82fcde
  strncpy (first_unused, NISENTRYVAL (0, 0, result),
Packit Service 82fcde
           NISENTRYLEN (0, 0, result));
Packit Service 82fcde
  first_unused[NISENTRYLEN (0, 0, result)] = '\0';
Packit Service 82fcde
  serv->s_name = first_unused;
Packit Service 82fcde
  size_t len = strlen (first_unused) + 1;
Packit Service 82fcde
  room_left -= len;
Packit Service 82fcde
  first_unused += len;
Packit Service 82fcde
Packit Service 82fcde
  if (NISENTRYLEN (0, 2, result) >= room_left)
Packit Service 82fcde
    goto no_more_room;
Packit Service 82fcde
  strncpy (first_unused, NISENTRYVAL (0, 2, result),
Packit Service 82fcde
           NISENTRYLEN (0, 2, result));
Packit Service 82fcde
  first_unused[NISENTRYLEN (0, 2, result)] = '\0';
Packit Service 82fcde
  serv->s_proto = first_unused;
Packit Service 82fcde
  len = strlen (first_unused) + 1;
Packit Service 82fcde
  room_left -= len;
Packit Service 82fcde
  first_unused += len;
Packit Service 82fcde
Packit Service 82fcde
  serv->s_port = htons (atoi (NISENTRYVAL (0, 3, result)));
Packit Service 82fcde
Packit Service 82fcde
  /* XXX Rewrite at some point to allocate the array first and then
Packit Service 82fcde
     copy the strings.  It wasteful to first concatenate the strings
Packit Service 82fcde
     to just split them again later.  */
Packit Service 82fcde
  char *line = first_unused;
Packit Service 82fcde
  for (unsigned int i = 0; i < NIS_RES_NUMOBJ (result); ++i)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (strcmp (NISENTRYVAL (i, 1, result), serv->s_name) != 0)
Packit Service 82fcde
        {
Packit Service 82fcde
          if (NISENTRYLEN (i, 1, result) + 2 > room_left)
Packit Service 82fcde
            goto no_more_room;
Packit Service 82fcde
	  *first_unused++ = ' ';
Packit Service 82fcde
          first_unused = __stpncpy (first_unused, NISENTRYVAL (i, 1, result),
Packit Service 82fcde
				    NISENTRYLEN (i, 1, result));
Packit Service 82fcde
          room_left -= NISENTRYLEN (i, 1, result) + 1;
Packit Service 82fcde
        }
Packit Service 82fcde
    }
Packit Service 82fcde
  *first_unused++ = '\0';
Packit Service 82fcde
Packit Service 82fcde
  /* Adjust the pointer so it is aligned for
Packit Service 82fcde
     storing pointers.  */
Packit Service 82fcde
  size_t adjust = ((__alignof__ (char *)
Packit Service 82fcde
		    - (first_unused - (char *) 0) % __alignof__ (char *))
Packit Service 82fcde
		   % __alignof__ (char *));
Packit Service 82fcde
  if (room_left < adjust + sizeof (char *))
Packit Service 82fcde
    goto no_more_room;
Packit Service 82fcde
  first_unused += adjust;
Packit Service 82fcde
  room_left -= adjust;
Packit Service 82fcde
  serv->s_aliases = (char **) first_unused;
Packit Service 82fcde
Packit Service 82fcde
  /* For the terminating NULL pointer.  */
Packit Service 82fcde
  room_left -= (sizeof (char *));
Packit Service 82fcde
Packit Service 82fcde
  unsigned int i = 0;
Packit Service 82fcde
  while (*line != '\0')
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Skip leading blanks.  */
Packit Service 82fcde
      while (isspace (*line))
Packit Service 82fcde
        ++line;
Packit Service 82fcde
Packit Service 82fcde
      if (*line == '\0')
Packit Service 82fcde
        break;
Packit Service 82fcde
Packit Service 82fcde
      if (room_left < sizeof (char *))
Packit Service 82fcde
        goto no_more_room;
Packit Service 82fcde
Packit Service 82fcde
      room_left -= sizeof (char *);
Packit Service 82fcde
      serv->s_aliases[i++] = line;
Packit Service 82fcde
Packit Service 82fcde
      while (*line != '\0' && *line != ' ')
Packit Service 82fcde
        ++line;
Packit Service 82fcde
Packit Service 82fcde
      if (*line == ' ')
Packit Service 82fcde
	*line++ = '\0';
Packit Service 82fcde
    }
Packit Service 82fcde
  serv->s_aliases[i] = NULL;
Packit Service 82fcde
Packit Service 82fcde
  return 1;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static enum nss_status
Packit Service 82fcde
_nss_create_tablename (int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  if (tablename_val == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      const char *local_dir = nis_local_directory ();
Packit Service 82fcde
      size_t local_dir_len = strlen (local_dir);
Packit Service 82fcde
      static const char prefix[] = "services.org_dir.";
Packit Service 82fcde
Packit Service 82fcde
      char *p = malloc (sizeof (prefix) + local_dir_len);
Packit Service 82fcde
      if (p == NULL)
Packit Service 82fcde
	{
Packit Service 82fcde
	  *errnop = errno;
Packit Service 82fcde
	  return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      memcpy (__stpcpy (p, prefix), local_dir, local_dir_len + 1);
Packit Service 82fcde
Packit Service 82fcde
      tablename_len = sizeof (prefix) - 1 + local_dir_len;
Packit Service 82fcde
Packit Service 82fcde
      atomic_write_barrier ();
Packit Service 82fcde
Packit Service 82fcde
      tablename_val = p;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return NSS_STATUS_SUCCESS;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
enum nss_status
Packit Service 82fcde
_nss_nisplus_setservent (int stayopen)
Packit Service 82fcde
{
Packit Service 82fcde
  enum nss_status status = NSS_STATUS_SUCCESS;
Packit Service 82fcde
  int err;
Packit Service 82fcde
Packit Service 82fcde
  __libc_lock_lock (lock);
Packit Service 82fcde
Packit Service 82fcde
  if (result != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      nis_freeresult (result);
Packit Service 82fcde
      result = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (tablename_val == NULL)
Packit Service 82fcde
    status = _nss_create_tablename (&err;;
Packit Service 82fcde
Packit Service 82fcde
  __libc_lock_unlock (lock);
Packit Service 82fcde
Packit Service 82fcde
  return status;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
enum nss_status
Packit Service 82fcde
_nss_nisplus_endservent (void)
Packit Service 82fcde
{
Packit Service 82fcde
  __libc_lock_lock (lock);
Packit Service 82fcde
Packit Service 82fcde
  if (result != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      nis_freeresult (result);
Packit Service 82fcde
      result = NULL;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  __libc_lock_unlock (lock);
Packit Service 82fcde
Packit Service 82fcde
  return NSS_STATUS_SUCCESS;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static enum nss_status
Packit Service 82fcde
internal_nisplus_getservent_r (struct servent *serv, char *buffer,
Packit Service 82fcde
			       size_t buflen, int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  int parse_res;
Packit Service 82fcde
Packit Service 82fcde
  /* Get the next entry until we found a correct one. */
Packit Service 82fcde
  do
Packit Service 82fcde
    {
Packit Service 82fcde
      nis_result *saved_res;
Packit Service 82fcde
Packit Service 82fcde
      if (result == NULL)
Packit Service 82fcde
	{
Packit Service 82fcde
	  saved_res = NULL;
Packit Service 82fcde
          if (tablename_val == NULL)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      enum nss_status status = _nss_create_tablename (errnop);
Packit Service 82fcde
Packit Service 82fcde
	      if (status != NSS_STATUS_SUCCESS)
Packit Service 82fcde
		return status;
Packit Service 82fcde
	    }
Packit Service 82fcde
Packit Service 82fcde
	  result = nis_first_entry (tablename_val);
Packit Service 82fcde
	  if (result == NULL)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      *errnop = errno;
Packit Service 82fcde
	      return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
Packit Service 82fcde
	    return niserr2nss (result->status);
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  saved_res = result;
Packit Service 82fcde
	  result = nis_next_entry (tablename_val, &result->cookie);
Packit Service 82fcde
	  if (result == NULL)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      *errnop = errno;
Packit Service 82fcde
	      return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      nis_freeresult (saved_res);
Packit Service 82fcde
	      return niserr2nss (result->status);
Packit Service 82fcde
	    }
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      parse_res = _nss_nisplus_parse_servent (result, serv, buffer,
Packit Service 82fcde
					      buflen, errnop);
Packit Service 82fcde
      if (__glibc_unlikely (parse_res == -1))
Packit Service 82fcde
	{
Packit Service 82fcde
	  nis_freeresult (result);
Packit Service 82fcde
	  result = saved_res;
Packit Service 82fcde
	  *errnop = ERANGE;
Packit Service 82fcde
	  return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  if (saved_res)
Packit Service 82fcde
	    nis_freeresult (saved_res);
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  while (!parse_res);
Packit Service 82fcde
Packit Service 82fcde
  return NSS_STATUS_SUCCESS;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
enum nss_status
Packit Service 82fcde
_nss_nisplus_getservent_r (struct servent *result, char *buffer,
Packit Service 82fcde
			   size_t buflen, int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  __libc_lock_lock (lock);
Packit Service 82fcde
Packit Service 82fcde
  int status = internal_nisplus_getservent_r (result, buffer, buflen, errnop);
Packit Service 82fcde
Packit Service 82fcde
  __libc_lock_unlock (lock);
Packit Service 82fcde
Packit Service 82fcde
  return status;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
enum nss_status
Packit Service 82fcde
_nss_nisplus_getservbyname_r (const char *name, const char *protocol,
Packit Service 82fcde
			      struct servent *serv,
Packit Service 82fcde
			      char *buffer, size_t buflen, int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  if (tablename_val == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      __libc_lock_lock (lock);
Packit Service 82fcde
Packit Service 82fcde
      enum nss_status status = _nss_create_tablename (errnop);
Packit Service 82fcde
Packit Service 82fcde
      __libc_lock_unlock (lock);
Packit Service 82fcde
Packit Service 82fcde
      if (status != NSS_STATUS_SUCCESS)
Packit Service 82fcde
	return status;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (name == NULL || protocol == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      *errnop = EINVAL;
Packit Service 82fcde
      return NSS_STATUS_NOTFOUND;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  size_t protocol_len = strlen (protocol);
Packit Service 82fcde
  char buf[strlen (name) + protocol_len + 17 + tablename_len];
Packit Service 82fcde
  int olderr = errno;
Packit Service 82fcde
Packit Service 82fcde
  /* Search at first in the alias list, and use the correct name
Packit Service 82fcde
     for the next search */
Packit Service 82fcde
  snprintf (buf, sizeof (buf), "[name=%s,proto=%s],%s", name, protocol,
Packit Service 82fcde
	    tablename_val);
Packit Service 82fcde
  nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM,
Packit Service 82fcde
				 NULL, NULL);
Packit Service 82fcde
Packit Service 82fcde
  if (result != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      char *bufptr = buf;
Packit Service 82fcde
Packit Service 82fcde
      /* If we did not find it, try it as original name. But if the
Packit Service 82fcde
	 database is correct, we should find it in the first case, too */
Packit Service 82fcde
      if ((result->status != NIS_SUCCESS
Packit Service 82fcde
	   && result->status != NIS_S_SUCCESS)
Packit Service 82fcde
	  || __type_of (NIS_RES_OBJECT (result)) != NIS_ENTRY_OBJ
Packit Service 82fcde
	  || strcmp (NIS_RES_OBJECT (result)->EN_data.en_type,
Packit Service 82fcde
		     "services_tbl") != 0
Packit Service 82fcde
	  || NIS_RES_OBJECT (result)->EN_data.en_cols.en_cols_len < 4)
Packit Service 82fcde
	snprintf (buf, sizeof (buf), "[cname=%s,proto=%s],%s", name, protocol,
Packit Service 82fcde
		  tablename_val);
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* We need to allocate a new buffer since there is no
Packit Service 82fcde
	     guarantee the returned name has a length limit.  */
Packit Service 82fcde
	  const char *entryval = NISENTRYVAL(0, 0, result);
Packit Service 82fcde
	  size_t buflen = (strlen (entryval) + protocol_len + 17
Packit Service 82fcde
			   + tablename_len);
Packit Service 82fcde
	  bufptr = alloca (buflen);
Packit Service 82fcde
	  snprintf (bufptr, buflen, "[cname=%s,proto=%s],%s",
Packit Service 82fcde
		    entryval, protocol, tablename_val);
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      nis_freeresult (result);
Packit Service 82fcde
      result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM,
Packit Service 82fcde
			 NULL, NULL);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (result == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      *errnop = ENOMEM;
Packit Service 82fcde
      return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (__glibc_unlikely (niserr2nss (result->status) != NSS_STATUS_SUCCESS))
Packit Service 82fcde
    {
Packit Service 82fcde
      enum nss_status status = niserr2nss (result->status);
Packit Service 82fcde
Packit Service 82fcde
      __set_errno (olderr);
Packit Service 82fcde
Packit Service 82fcde
      nis_freeresult (result);
Packit Service 82fcde
      return status;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  int parse_res = _nss_nisplus_parse_servent (result, serv, buffer, buflen,
Packit Service 82fcde
					      errnop);
Packit Service 82fcde
  nis_freeresult (result);
Packit Service 82fcde
Packit Service 82fcde
  if (__glibc_unlikely (parse_res < 1))
Packit Service 82fcde
    {
Packit Service 82fcde
      if (parse_res == -1)
Packit Service 82fcde
	{
Packit Service 82fcde
	  *errnop = ERANGE;
Packit Service 82fcde
	  return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  __set_errno (olderr);
Packit Service 82fcde
	  return NSS_STATUS_NOTFOUND;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return NSS_STATUS_SUCCESS;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
enum nss_status
Packit Service 82fcde
_nss_nisplus_getservbyport_r (const int number, const char *protocol,
Packit Service 82fcde
			      struct servent *serv,
Packit Service 82fcde
			      char *buffer, size_t buflen, int *errnop)
Packit Service 82fcde
{
Packit Service 82fcde
  if (tablename_val == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      __libc_lock_lock (lock);
Packit Service 82fcde
Packit Service 82fcde
      enum nss_status status = _nss_create_tablename (errnop);
Packit Service 82fcde
Packit Service 82fcde
      __libc_lock_unlock (lock);
Packit Service 82fcde
Packit Service 82fcde
      if (status != NSS_STATUS_SUCCESS)
Packit Service 82fcde
	return status;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (protocol == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      *errnop = EINVAL;
Packit Service 82fcde
      return NSS_STATUS_NOTFOUND;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  char buf[17 + 3 * sizeof (int) + strlen (protocol) + tablename_len];
Packit Service 82fcde
  int olderr = errno;
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof (buf), "[port=%d,proto=%s],%s",
Packit Service 82fcde
	    number, protocol, tablename_val);
Packit Service 82fcde
Packit Service 82fcde
  nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM,
Packit Service 82fcde
				 NULL, NULL);
Packit Service 82fcde
Packit Service 82fcde
  if (result == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      *errnop = ENOMEM;
Packit Service 82fcde
      return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (__glibc_unlikely (niserr2nss (result->status) != NSS_STATUS_SUCCESS))
Packit Service 82fcde
    {
Packit Service 82fcde
      enum nss_status status = niserr2nss (result->status);
Packit Service 82fcde
Packit Service 82fcde
      __set_errno (olderr);
Packit Service 82fcde
Packit Service 82fcde
      nis_freeresult (result);
Packit Service 82fcde
      return status;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  int parse_res = _nss_nisplus_parse_servent (result, serv, buffer, buflen,
Packit Service 82fcde
					      errnop);
Packit Service 82fcde
  nis_freeresult (result);
Packit Service 82fcde
Packit Service 82fcde
  if (__glibc_unlikely (parse_res < 1))
Packit Service 82fcde
    {
Packit Service 82fcde
      if (parse_res == -1)
Packit Service 82fcde
	{
Packit Service 82fcde
	  *errnop = ERANGE;
Packit Service 82fcde
	  return NSS_STATUS_TRYAGAIN;
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  __set_errno (olderr);
Packit Service 82fcde
	  return NSS_STATUS_NOTFOUND;
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return NSS_STATUS_SUCCESS;
Packit Service 82fcde
}