about summary refs log tree commit diff
path: root/nis/nis_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/nis_table.c')
-rw-r--r--nis/nis_table.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/nis/nis_table.c b/nis/nis_table.c
index a92a4b64ce..cb25be61e2 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -215,6 +215,7 @@ nis_list (const_nis_name name, unsigned int flags,
   char *tableptr;
   char *tablepath = NULL;
   int first_try = 0; /* Do we try the old binding at first ? */
+  nis_result *allres = NULL;
 
   if (res == NULL)
     return NULL;
@@ -223,6 +224,7 @@ nis_list (const_nis_name name, unsigned int flags,
     {
       status = NIS_BADNAME;
     err_out:
+      nis_freeresult (allres);
       memset (res, '\0', sizeof (nis_result));
       NIS_RES_STATUS (res) = status;
       return res;
@@ -349,6 +351,7 @@ nis_list (const_nis_name name, unsigned int flags,
 		    if (names != namebuf)
 		      nis_freenames (names);
 		    nis_free_request (ibreq);
+		    nis_freeresult (allres);
 		    return res;
 		  }
 		if (NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_len)
@@ -392,6 +395,57 @@ nis_list (const_nis_name name, unsigned int flags,
 		    goto again;
 		  }
 	      }
+	    else if ((flags & (FOLLOW_PATH | ALL_RESULTS))
+		     == (FOLLOW_PATH | ALL_RESULTS))
+	      {
+		if (allres == NULL)
+		  {
+		    allres = res;
+		    res = malloc (sizeof (nis_result));
+		    if (res == NULL)
+		      {
+			res = allres;
+			allres = NULL;
+			NIS_RES_STATUS (res) = NIS_NOMEMORY;
+			goto fail;
+		      }
+		    NIS_RES_STATUS (res) = NIS_RES_STATUS (allres);
+		  }
+		else
+		  {
+		    nis_object *objects_val
+		      = realloc (NIS_RES_OBJECT (allres),
+				 (NIS_RES_NUMOBJ (allres)
+				  + NIS_RES_NUMOBJ (res))
+				 * sizeof (nis_object));
+		    if (objects_val == NULL)
+		      {
+			NIS_RES_STATUS (res) = NIS_NOMEMORY;
+			goto fail;
+		      }
+		    NIS_RES_OBJECT (allres) = objects_val;
+		    memcpy (NIS_RES_OBJECT (allres) + NIS_RES_NUMOBJ (allres),
+			    NIS_RES_OBJECT (res),
+			    NIS_RES_NUMOBJ (res) * sizeof (nis_object));
+		    NIS_RES_NUMOBJ (allres) += NIS_RES_NUMOBJ (res);
+		    NIS_RES_NUMOBJ (res) = 0;
+		    free (NIS_RES_OBJECT (res));
+		    NIS_RES_OBJECT (res) = NULL;
+		    NIS_RES_STATUS (allres) = NIS_RES_STATUS (res);
+		    xdr_free ((xdrproc_t) _xdr_nis_result, (char *) res);
+		  }
+		clnt_status = __follow_path (&tablepath, &tableptr, ibreq,
+					     &bptr);
+		if (clnt_status != NIS_SUCCESS)
+		  {
+		    /* Prepare for the nis_freeresult call.  */
+		    memset (res, '\0', sizeof (*res));
+
+		    if (clnt_status == NIS_NOMEMORY)
+		      NIS_RES_STATUS (allres) = clnt_status;
+		    ++done;
+		  }
+	      }
 	    else
 	      ++done;
 	    break;
@@ -485,6 +539,12 @@ nis_list (const_nis_name name, unsigned int flags,
 
   nis_free_request (ibreq);
 
+  if (allres)
+    {
+      nis_freeresult (res);
+      return allres;
+    }
+
   return res;
 }
 libnsl_hidden_def (nis_list)