res = nis_list (name, newflags, callback, userdata);
if ((c = strchr(name, ']')) != NULL) {  int index_len = c - name + 2; char buf[index_len + strlen (ntable) + 1];  c = __stpncpy (buf, name, index_len); strcpy (c, ntable); res = nis_list (buf, newflags, callback,userdata); } else res = nis_list (ntable, newflags, callback, userdata);
nis_list (const_nis_name name, u_long flags,	  int (*callback) (const_nis_name name,			   const nis_object *object,			   const void *userdata),	  const void *userdata){  nis_result *res = NULL;  ib_request *ibreq = calloc (1, sizeof (ib_request));  int 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;  res = calloc (1, sizeof (nis_result));  if (__create_ib_request (name, ibreq, flags) == NULL)    {      res->status = NIS_BADNAME;      return res;    }  if (flags & EXPAND_NAME)    {      names = nis_getnames (ibreq->ibr_name);      free (ibreq->ibr_name);      ibreq->ibr_name = NULL;      if (names == NULL)	{	  res->status = NIS_BADNAME;	  return res;	}      ibreq->ibr_name = strdup (names[name_nr]);    }  else    {      names = namebuf;      names[name_nr] = ibreq->ibr_name;    }  cb = NULL;  if (flags & FOLLOW_PATH)    {      nis_result *lres;      u_long newflags = flags & ~FOLLOW_PATH;      char table_path[NIS_MAXPATH + 1];      char *ntable, *p;      u_long done = 0, failures = 0;      memset (res, '\0', sizeof (nis_result));      while (names[name_nr] != NULL && !done)	{	  lres = nis_lookup (names[name_nr], newflags);	  if (lres == NULL || lres->status != NIS_SUCCESS)	    {	      res->status = lres->status;	      nis_freeresult (lres);	      ++name_nr;	      continue;	      }	  /* nis_lookup handles FOLLOW_LINKS,	     so we must have a table object.  */	  if (__type_of (NIS_RES_OBJECT (lres)) != NIS_TABLE_OBJ)	    {	      nis_freeresult (lres);	      res->status = NIS_INVALIDOBJ;	      break;	    }	  /* Save the path, discard everything else.  */	  snprintf (table_path, NIS_MAXPATH, "%s:%s", names[name_nr],		    NIS_RES_OBJECT (lres)->TA_data.ta_path);	  nis_freeresult (lres);	  free (res);	  p = table_path;	  while (((ntable = strsep (&p, ":")) != NULL) && !done)	    {	      /* Do the job recursive here!  */	      res = nis_list (name, newflags, callback, userdata);	      if (res == NULL)		return NULL;	      switch (res->status)		{		case NIS_SUCCESS:		case NIS_CBRESULTS:		  if (!(flags & ALL_RESULTS))		    done = 1;		  break;		default:		  if (flags & ALL_RESULTS)		    failures++;		  else		    done = 1;		  break;		  }	    }	  if (res->status == NIS_SUCCESS && failures)	    res->status = NIS_S_SUCCESS;	  if (res->status == NIS_NOTFOUND && failures)	    res->status = NIS_S_NOTFOUND;	  break;	}    }  else    {      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;	  }      while (!done)	{	  memset (res, '\0', sizeof (nis_result));	  status = __do_niscall (ibreq->ibr_name, NIS_IBLIST,				 (xdrproc_t) xdr_ib_request,				 (caddr_t) ibreq, (xdrproc_t) xdr_nis_result,				 (caddr_t) res, flags, cb);	  if (status != NIS_SUCCESS)	    res->status = status;	  switch (res->status)	    {	    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.  */		{		  /* If we hit the link limit, bail.  */		  if (count_links > NIS_MAXLINKS)		    {		      res->status = NIS_LINKNAMEERROR;		      ++done;		      break;		    }		  if (count_links)		    free (ibreq->ibr_name);		  ++count_links;		  free (ibreq->ibr_name);		  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));		}	      else		++done;	      break;	    case NIS_CBRESULTS:	      /* Calback is handled in nis_call.c (__do_niscall2).  */	      ++done;	      break;	    case NIS_UNAVAIL:	      /* NIS+ is not installed, or all servers are down.  */	      ++done;	      break;	    default:	      /* Try the next domainname if we don't follow a link.  */	      if (count_links)		{		  free (ibreq->ibr_name);		  res->status = NIS_LINKNAMEERROR;		  ++done;		  break;		}	      ++name_nr;	      if (names[name_nr] == NULL)		{		  ++done;		  break;		}	      ibreq->ibr_name = names[name_nr];	      break;	    }	}    }				/* End of not FOLLOW_PATH.  */  if (names != namebuf)    nis_freenames (names);  if (cb)    {      __nis_destroy_callback (cb);      ibreq->ibr_cbhost.ibr_cbhost_len = 0;      ibreq->ibr_cbhost.ibr_cbhost_val = NULL;    }  nis_free_request (ibreq);  return res;}