res = calloc (1, sizeof (nis_result));
nis_list (const_nis_name name, unsigned int flags,	  int (*callback) (const_nis_name name,			   const nis_object *object,			   const void *userdata),	  const void *userdata){  nis_result *res = NULL;  ib_request *ibreq;  int status;  enum clnt_stat clnt_status;  int count_links = 0;		/* We will only follow NIS_MAXLINKS links! */  int done = 0;  nis_name *names;  nis_name namebuf[2] = {NULL, NULL};  int name_nr = 0;  nis_cb *cb = NULL;  char *tableptr, *tablepath = NULL;  int have_tablepath = 0;  int first_try = 0; /* Do we try the old binding at first ? */  res = calloc (1, sizeof (nis_result));  if (res == NULL)    return NULL;  if (name == NULL)    {      NIS_RES_STATUS (res) = NIS_BADNAME;      return res;    }  if ((ibreq = __create_ib_request (name, flags)) == NULL)    {      NIS_RES_STATUS (res) = NIS_BADNAME;      return res;    }  if ((flags & EXPAND_NAME) &&      ibreq->ibr_name[strlen (ibreq->ibr_name) - 1] != '.')    {      names = nis_getnames (ibreq->ibr_name);      free (ibreq->ibr_name);      ibreq->ibr_name = NULL;      if (names == NULL)	{	  NIS_RES_STATUS (res) = NIS_BADNAME;	  return res;	}      ibreq->ibr_name = strdup (names[name_nr]);    }  else    {      names = namebuf;      names[name_nr] = ibreq->ibr_name;    }  cb = NULL;  while (!done)    {      dir_binding bptr;      directory_obj *dir = NULL;      memset (res, '\0', sizeof (nis_result));      status = __nisfind_server (ibreq->ibr_name, &dir);      if (status != NIS_SUCCESS)        {          NIS_RES_STATUS (res) = status;          return res;        }      status = __nisbind_create (&bptr, dir->do_servers.do_servers_val,                                 dir->do_servers.do_servers_len, flags);      if (status != NIS_SUCCESS)        {          NIS_RES_STATUS (res) = status;          nis_free_directory (dir);          return res;        }      while (__nisbind_connect (&bptr) != NIS_SUCCESS)	if (__nisbind_next (&bptr) != NIS_SUCCESS)	  {	    __nisbind_destroy (&bptr);	    nis_free_directory (dir);	    NIS_RES_STATUS (res) = NIS_NAMEUNREACHABLE;	    return res;	  }      if (callback != NULL)	{	  cb = __nis_create_callback (callback, userdata, flags);	  ibreq->ibr_cbhost.ibr_cbhost_len = 1;	  ibreq->ibr_cbhost.ibr_cbhost_val = cb->serv;	}    again:      clnt_status = clnt_call (bptr.clnt, NIS_IBLIST,			       (xdrproc_t) _xdr_ib_request, (caddr_t) ibreq,			       (xdrproc_t) _xdr_nis_result,			       (caddr_t) res, RPCTIMEOUT);      if (clnt_status != RPC_SUCCESS)	NIS_RES_STATUS (res) = NIS_RPCERROR;      else	switch (NIS_RES_STATUS (res))	  { /* start switch */	  case NIS_PARTIAL:	  case NIS_SUCCESS:	  case NIS_S_SUCCESS:	    if (__type_of (NIS_RES_OBJECT (res)) == NIS_LINK_OBJ &&		flags & FOLLOW_LINKS)		/* We are following links.  */	      {		free (ibreq->ibr_name);		/* If we hit the link limit, bail.  */		if (count_links > NIS_MAXLINKS)		  {		    NIS_RES_STATUS (res) = NIS_LINKNAMEERROR;		    ++done;		    break;		  }		++count_links;		ibreq->ibr_name =		  strdup (NIS_RES_OBJECT (res)->LI_data.li_name);		if (NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len)		  if (ibreq->ibr_srch.ibr_srch_len == 0)		    {		      ibreq->ibr_srch.ibr_srch_len =			NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len;		      ibreq->ibr_srch.ibr_srch_val =			NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_val;		    }		nis_freeresult (res);		res = calloc (1, sizeof (nis_result));		if (res == NULL)		  {		    if (have_tablepath)		      free (tablepath);		    __nisbind_destroy (&bptr);		    nis_free_directory (dir);		    return NULL;		  }		first_try = 1; /* Try at first the old binding */		goto again;	      }	    else if ((flags & FOLLOW_PATH) &&		     NIS_RES_STATUS (res) == NIS_PARTIAL)	      {		if (!have_tablepath)		  {		    tablepath = __get_tablepath (ibreq->ibr_name, &bptr);		    tableptr = tablepath;		    have_tablepath = 1;		  }		if (tableptr == NULL)		  {		    ++done;		    break;		  }		free (ibreq->ibr_name);		ibreq->ibr_name = strsep (&tableptr, ":");		if (ibreq->ibr_name == NULL || ibreq->ibr_name[0] == '\0')		  {		    ibreq->ibr_name = strdup ("");		    ++done;		  }		else		  {		    ibreq->ibr_name = strdup (ibreq->ibr_name);		    nis_freeresult (res);		    res = calloc (1, sizeof (nis_result));		    if (res == NULL)		      {			if (have_tablepath)			  free (tablepath);			__nisbind_destroy (&bptr);			nis_free_directory (dir);			return NULL;		      }		    first_try = 1;		    goto again;		  }	      }	    else	      ++done;	    break;	  case NIS_CBRESULTS:	    if (cb != NULL)	      {		__nis_do_callback (&bptr, &res->cookie, cb);		NIS_RES_STATUS (res) = cb->result;		if (!(flags & ALL_RESULTS))		  ++done;		else		  {		    if (!have_tablepath)		      {			tablepath = __get_tablepath (ibreq->ibr_name, &bptr);			tableptr = tablepath;			have_tablepath = 1;		      }		    if (tableptr == NULL)		      {			++done;			break;		      }		    free (ibreq->ibr_name);		    ibreq->ibr_name = strsep (&tableptr, ":");		    if (ibreq->ibr_name == NULL || ibreq->ibr_name[0] == '\0')		      {			ibreq->ibr_name = strdup ("");			++done;		      }		    else		      ibreq->ibr_name = strdup (ibreq->ibr_name);		  }	      }	    break;	  case NIS_SYSTEMERROR:	  case NIS_NOSUCHNAME:	  case NIS_NOT_ME:	    /* If we had first tried the old binding, do nothing, but	       get a new binding */	    if (!first_try)	      {		if (__nisbind_next (&bptr) != NIS_SUCCESS)		  {		    ++done;		    break; /* No more servers to search */		  }		while (__nisbind_connect (&bptr) != NIS_SUCCESS)		  {		    if (__nisbind_next (&bptr) != NIS_SUCCESS)		      {			++done;			break; /* No more servers to search */		      }		  }		goto again;	      }	    break;	  default:	    if (!first_try)	      {		/* Try the next domainname if we don't follow a link.  */		if (count_links)		  {		    free (ibreq->ibr_name);		    NIS_RES_STATUS (res) = NIS_LINKNAMEERROR;		    ++done;		    break;		  }		++name_nr;		if (names[name_nr] == NULL)		  {		    ++done;		    break;		  }		ibreq->ibr_name = names[name_nr];		first_try = 1; /* Try old binding at first */		goto again;	      }	    break;	  }      first_try = 0;      if (cb)	{	  __nis_destroy_callback (cb);	  ibreq->ibr_cbhost.ibr_cbhost_len = 0;	  ibreq->ibr_cbhost.ibr_cbhost_val = NULL;	}      __nisbind_destroy (&bptr);      nis_free_directory (dir);    }  if (names != namebuf)    nis_freenames (names);  nis_free_request (ibreq);  return res;}