_nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv, char *buffer, size_t buflen, int *errnop)
_nss_nis_getservbyport_r (int port, const char *protocol, struct servent *serv, char *buffer, size_t buflen, int *errnop)
_nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv,			  char *buffer, size_t buflen, int *errnop){  intern_t data = { NULL, NULL };  enum nss_status status;  int found;  /* If the protocol is given, we only need one query */  if (protocol != NULL)    {      char key[100 + strlen (protocol) + 2];      char *domain, *result;      size_t keylen, len;      int int_len;      /* If this fails, the other solution will also fail. */      if (yp_get_default_domain (&domain))	return NSS_STATUS_UNAVAIL;      /* key is: "port/protocol" */      keylen = snprintf (key, sizeof (key), "%d/%s", port, protocol);      status = yperr2nss (yp_match (domain, "services.byname", key,				    keylen, &result, &int_len));      len = int_len;      /* If we found the key, it's ok and parse the result. If not,	 fall through and parse the complete table. */      if (status == NSS_STATUS_SUCCESS)	{	  struct parser_data *pdata = (void *) buffer;	  int parse_res;	  char *p;	  if ((size_t) (len + 1) > buflen)	    {	      free (result);	      *errnop = ERANGE;	      return NSS_STATUS_TRYAGAIN;	    }	  p = strncpy (buffer, result, len);	  buffer[len] = '\0';	  while (isspace (*p))	    ++p;	  free (result);	  parse_res = _nss_files_parse_servent (p, serv, pdata,						buflen, errnop);	  if (parse_res < 0)	    {	      if (parse_res == -1)		return NSS_STATUS_TRYAGAIN;	      else		{		  *errnop = ENOENT;		  return NSS_STATUS_NOTFOUND;		}	    }	  else	    return NSS_STATUS_SUCCESS;	}    }  status = internal_nis_setservent (&data);  if (status != NSS_STATUS_SUCCESS)    return status;  found = 0;  while (!found &&         ((status = internal_nis_getservent_r (serv, buffer, buflen, errnop,					       &data)) == NSS_STATUS_SUCCESS))    if (serv->s_port == port &&	(protocol == NULL || strcmp (serv->s_proto, protocol) == 0))      found = 1;  internal_nis_endservent (&data);  if (!found && status == NSS_STATUS_SUCCESS)    {      *errnop = ENOENT;      return NSS_STATUS_NOTFOUND;    }  else    return status;}