int p2len;
size_t p2len;
getpwent_next_file (struct passwd *result, ent_t *ent,		    char *buffer, size_t buflen){  while (1)    {      char *p, *p2;      int p2len;      do	{	  p = fgets (buffer, buflen, ent->stream);	  if (p == NULL)	    return NSS_STATUS_NOTFOUND;	  /* Terminate the line for any case.  */	  buffer[buflen - 1] = '\0';	  /* 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.  */	     !_nss_files_parse_pwent (p, result, buffer, buflen));      if (result->pw_name[0] != '+' && result->pw_name[0] != '-')	/* This is a real entry.  */	break;      /* -@netgroup */      if (result->pw_name[0] == '-' && result->pw_name[1] == '@'	  && result->pw_name[2] != '\0')	{	  char *user, *host, *domain;	  setnetgrent (&result->pw_name[2]);	  while (getnetgrent (&host, &user, &domain))	    {	      if (user != NULL && user[0] != '-')		blacklist_store_name (user, ent);	    }	  endnetgrent ();	  continue;	}      /* +@netgroup */      if (result->pw_name[0] == '+' && result->pw_name[1] == '@'	  && result->pw_name[2] != '\0')	{	  int status;	  ent->netgroup = TRUE;	  ent->first = TRUE;	  copy_pwd_changes (&ent->pwd, result, NULL, 0);	  status = getpwent_next_netgr (result, ent, &result->pw_name[2],					buffer, buflen);	  if (status == NSS_STATUS_RETURN)	    continue;	  else	    return status;	}      /* -user */      if (result->pw_name[0] == '-' && result->pw_name[1] != '\0'	  && result->pw_name[1] != '@')	{	  blacklist_store_name (&result->pw_name[1], ent);	  continue;	}      /* +user */      if (result->pw_name[0] == '+' && result->pw_name[1] != '\0'	  && result->pw_name[1] != '@')	{	  char *domain;	  char *outval;	  int outvallen;	  struct passwd pwd;	  memset (&pwd, '\0', sizeof (struct passwd));	  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)	    /* XXX Should we regard this as an fatal error?  I don't	       think so.  Just continue working.  --drepper@gnu  */	    continue;	  if (yp_match (domain, "passwd.byname", &result->pw_name[1],			strlen (result->pw_name) - 1, &outval, &outvallen)	      != YPERR_SUCCESS)	    continue;	  copy_pwd_changes (&pwd, result, NULL, 0);	  p2len = pwd_need_buflen (&pwd);	  if (p2len > buflen)	    {	      __set_errno (ERANGE);	      return NSS_STATUS_TRYAGAIN;	    }	  p2 = buffer + (buflen - p2len);	  buflen -= p2len;	  p = strncpy (buffer, outval, buflen);	  while (isspace (*p))	    p++;	  free (outval);	  if (_nss_files_parse_pwent (p, result, buffer, buflen))	    {	      copy_pwd_changes (result, &pwd, p2, p2len);	      give_pwd_free (&pwd);	      /* We found the entry.  */	      break;	    }	  else	    {	      /* Give buffer the old len back */	      buflen += p2len;	      give_pwd_free (&pwd);	    }	}      /* +:... */      if (result->pw_name[0] == '+' && result->pw_name[1] == '\0')	{	  ent->nis = TRUE;	  ent->first = TRUE;	  copy_pwd_changes (&ent->pwd, result, NULL, 0);	  return getpwent_next_nis (result, ent, buffer, buflen);	}    }  return NSS_STATUS_SUCCESS;}