while (status == NSS_STATUS_SUCCESS);
internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,		     char *buffer, size_t buflen, int *errnop){  struct parser_data *data = (void *) buffer;  while (1)    {      fpos_t pos;      char *p;      int parse_res;      do	{	  fgetpos (ent->stream, &pos);	  buffer[buflen - 1] = '\xff';	  p = fgets_unlocked (buffer, buflen, ent->stream);	  if (p == NULL && feof_unlocked (ent->stream))	    return NSS_STATUS_NOTFOUND;	  if (p == NULL || buffer[buflen - 1] != '\xff')	    {	      fsetpos (ent->stream, &pos);	      *errnop = ERANGE;	      return NSS_STATUS_TRYAGAIN;	    }	  /* Skip leading blanks.  */	  while (isspace (*p))	    ++p;	}      while (*p == '\0' || *p == '#' ||	/* Ignore empty and comment lines.  */	     /* Parse the line.  If it is invalid, loop to	        get the next line of the file to parse.  */	     !(parse_res = _nss_files_parse_spent (p, result, data, buflen,						   errnop)));      if (parse_res == -1)	{	  /* The parser ran out of space.  */	  fsetpos (ent->stream, &pos);	  *errnop = ERANGE;	  return NSS_STATUS_TRYAGAIN;	}      /* This is a real entry.  */      if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-')	{	  if (strcmp (result->sp_namp, name) == 0)	    return NSS_STATUS_SUCCESS;	  else	    continue;	}      /* -@netgroup */      /* If the loaded NSS module does not support this service, add         all users from a +@netgroup entry to the blacklist, too.  */      if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@'	  && result->sp_namp[2] != '\0')	{	  /* XXX Do not use fixed length buffers.  */	  char buf2[1024];	  char *user, *host, *domain;	  struct __netgrent netgrdata;	  bzero (&netgrdata, sizeof (struct __netgrent));	  __internal_setnetgrent (&result->sp_namp[2], &netgrdata);	  while (__internal_getnetgrent_r (&host, &user, &domain, &netgrdata,					   buf2, sizeof (buf2), errnop))	    {	      if (user != NULL && user[0] != '-')		if (strcmp (user, name) == 0)		  return NSS_STATUS_NOTFOUND;	    }	  __internal_endnetgrent (&netgrdata);	  continue;	}      /* +@netgroup */      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@'	  && result->sp_namp[2] != '\0')	{	  char *buf = strdupa (&result->sp_namp[2]);	  int status;	  ent->netgroup = TRUE;	  ent->first = TRUE;	  copy_spwd_changes (&ent->pwd, result, NULL, 0);	  do	    {	      status = getspent_next_nss_netgr (name, result, ent, buf,						buffer, buflen, errnop);	      if (status == NSS_STATUS_RETURN)		continue;	      if (status == NSS_STATUS_SUCCESS		  && strcmp (result->sp_namp, name) == 0)		return NSS_STATUS_SUCCESS;	    }	  while (status == NSS_STATUS_SUCCESS);	  continue;	}      /* -user */      if (result->sp_namp[0] == '-' && result->sp_namp[1] != '\0'	  && result->sp_namp[1] != '@')	{	  if (strcmp (&result->sp_namp[1], name) == 0)	    return NSS_STATUS_NOTFOUND;	  else	    continue;	}      /* +user */      if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'	  && result->sp_namp[1] != '@')	{	  if (strcmp (name, &result->sp_namp[1]) == 0)	    {	      enum nss_status status;	      status = getspnam_plususer (name, result, ent,					  buffer, buflen, errnop);	      if (status == NSS_STATUS_RETURN)		/* We couldn't parse the entry */		return NSS_STATUS_NOTFOUND;	      else		return status;	    }	}      /* +:... */      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '\0')	{	  enum nss_status status;	  status = getspnam_plususer (name, result, ent,				      buffer, buflen, errnop);	  if (status == NSS_STATUS_RETURN)	/* We couldn't parse the entry */	    return NSS_STATUS_NOTFOUND;	  else	    return status;	}    }  return NSS_STATUS_SUCCESS;}