summary refs log tree commit diff
path: root/nis/ypclnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/ypclnt.c')
-rw-r--r--nis/ypclnt.c311
1 files changed, 121 insertions, 190 deletions
diff --git a/nis/ypclnt.c b/nis/ypclnt.c
index ae04ee9212..85292b62d9 100644
--- a/nis/ypclnt.c
+++ b/nis/ypclnt.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1996-2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
+/* Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
 
@@ -46,12 +45,12 @@ struct dom_binding
   };
 typedef struct dom_binding dom_binding;
 
-static const struct timeval RPCTIMEOUT = {25, 0};
-static const struct timeval UDPTIMEOUT = {5, 0};
+static struct timeval RPCTIMEOUT = {25, 0};
+static struct timeval UDPTIMEOUT = {5, 0};
 static int const MAXTRIES = 2;
-static char ypdomainname[NIS_MAXNAMELEN + 1];
+static char __ypdomainname[NIS_MAXNAMELEN + 1] = "\0";
 __libc_lock_define_initialized (static, ypbindlist_lock)
-static dom_binding *ypbindlist = NULL;
+static dom_binding *__ypbindlist = NULL;
 
 
 static void
@@ -111,8 +110,8 @@ yp_bind_ypbindprog (const char *domain, dom_binding *ysd)
   int clnt_sock;
   CLIENT *client;
 
+  memset (&clnt_saddr, '\0', sizeof clnt_saddr);
   clnt_saddr.sin_family = AF_INET;
-  clnt_saddr.sin_port = 0;
   clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   clnt_sock = RPC_ANYSOCK;
   client = clnttcp_create (&clnt_saddr, YPBINDPROG, YPBINDVERS,
@@ -142,7 +141,7 @@ yp_bind_ypbindprog (const char *domain, dom_binding *ysd)
 
   if (ypbr.ypbind_status != YPBIND_SUCC_VAL)
     {
-      fprintf (stderr, "YPBINDPROC_DOMAIN: %s\n",
+      fprintf (stderr, _("YPBINDPROC_DOMAIN: %s\n"),
 	       ypbinderr_string (ypbr.ypbind_resp_u.ypbind_error));
       return YPERR_DOMAIN;
     }
@@ -225,7 +224,7 @@ yp_bind (const char *indomain)
 
   __libc_lock_lock (ypbindlist_lock);
 
-  status = __yp_bind (indomain, &ypbindlist);
+  status = __yp_bind (indomain, &__ypbindlist);
 
   __libc_lock_unlock (ypbindlist_lock);
 
@@ -239,7 +238,7 @@ yp_unbind_locked (const char *indomain)
   dom_binding *ydbptr, *ydbptr2;
 
   ydbptr2 = NULL;
-  ydbptr = ypbindlist;
+  ydbptr = __ypbindlist;
 
   while (ydbptr != NULL)
     {
@@ -249,7 +248,7 @@ yp_unbind_locked (const char *indomain)
 
 	  work = ydbptr;
 	  if (ydbptr2 == NULL)
-	    ypbindlist = ypbindlist->dom_pnext;
+	    __ypbindlist = __ypbindlist->dom_pnext;
 	  else
 	    ydbptr2 = ydbptr->dom_pnext;
 	  __yp_unbind (work);
@@ -306,7 +305,7 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
   status = YPERR_YPERR;
 
   __libc_lock_lock (ypbindlist_lock);
-  ydb = ypbindlist;
+  ydb = __ypbindlist;
   while (ydb != NULL)
     {
       if (strcmp (domain, ydb->dom_domain) == 0)
@@ -349,7 +348,7 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
   if (status != YPERR_SUCCESS)
     {
       ydb = calloc (1, sizeof (dom_binding));
-      if (ydb != NULL && yp_bind_ypbindprog (domain, ydb) == YPERR_SUCCESS)
+      if (yp_bind_ypbindprog (domain, ydb) == YPERR_SUCCESS)
 	{
 	  status = __ypclnt_call (domain, prog, xargs, req, xres,
 				  resp, &ydb, 1);
@@ -365,21 +364,6 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
   return status;
 }
 
-/* Like do_ypcall, but translate the status value if necessary.  */
-static int
-do_ypcall_tr (const char *domain, u_long prog, xdrproc_t xargs,
-	      caddr_t req, xdrproc_t xres, caddr_t resp)
-{
-  int status = do_ypcall (domain, prog, xargs, req, xres, resp);
-  if (status == YPERR_SUCCESS)
-    /* We cast to ypresp_val although the pointer could also be of
-       type ypresp_key_val or ypresp_master or ypresp_order or
-       ypresp_maplist.  But the stat element is in a common prefix so
-       this does not matter.  */
-    status = ypprot_err (((struct ypresp_val *) resp)->stat);
-  return status;
-}
-
 
 __libc_lock_define_initialized (static, domainname_lock)
 
@@ -391,21 +375,21 @@ yp_get_default_domain (char **outdomain)
 
   __libc_lock_lock (domainname_lock);
 
-  if (ypdomainname[0] == '\0')
+  if (__ypdomainname[0] == '\0')
     {
-      if (getdomainname (ypdomainname, NIS_MAXNAMELEN))
+      if (getdomainname (__ypdomainname, NIS_MAXNAMELEN))
 	result = YPERR_NODOM;
-      else if (strcmp (ypdomainname, "(none)") == 0)
+      else if (strcmp (__ypdomainname, "(none)") == 0)
 	{
 	  /* If domainname is not set, some systems will return "(none)" */
-	  ypdomainname[0] = '\0';
+	  __ypdomainname[0] = '\0';
 	  result = YPERR_NODOM;
 	}
       else
-	*outdomain = ypdomainname;
+	*outdomain = __ypdomainname;
     }
   else
-    *outdomain = ypdomainname;
+    *outdomain = __ypdomainname;
 
   __libc_lock_unlock (domainname_lock);
 
@@ -418,14 +402,14 @@ __yp_check (char **domain)
 {
   char *unused;
 
-  if (ypdomainname[0] == '\0')
+  if (__ypdomainname[0] == '\0')
     if (yp_get_default_domain (&unused))
       return 0;
 
   if (domain)
-    *domain = ypdomainname;
+    *domain = __ypdomainname;
 
-  if (yp_bind (ypdomainname) == 0)
+  if (yp_bind (__ypdomainname) == 0)
     return 1;
   return 0;
 }
@@ -452,26 +436,25 @@ yp_match (const char *indomain, const char *inmap, const char *inkey,
   *outvallen = 0;
   memset (&resp, '\0', sizeof (resp));
 
-  result = do_ypcall_tr (indomain, YPPROC_MATCH, (xdrproc_t) xdr_ypreq_key,
-			 (caddr_t) &req, (xdrproc_t) xdr_ypresp_val,
-			 (caddr_t) &resp);
+  result = do_ypcall (indomain, YPPROC_MATCH, (xdrproc_t) xdr_ypreq_key,
+		      (caddr_t) & req, (xdrproc_t) xdr_ypresp_val,
+		      (caddr_t) & resp);
 
   if (result != YPERR_SUCCESS)
     return result;
+  if (resp.stat != YP_TRUE)
+    return ypprot_err (resp.stat);
 
   *outvallen = resp.val.valdat_len;
   *outval = malloc (*outvallen + 1);
-  int status = YPERR_RESRC;
-  if (__builtin_expect (*outval != NULL, 1))
-    {
-      memcpy (*outval, resp.val.valdat_val, *outvallen);
-      (*outval)[*outvallen] = '\0';
-      status = YPERR_SUCCESS;
-    }
+  if (__builtin_expect (*outval == NULL, 0))
+    return YPERR_RESRC;
+  memcpy (*outval, resp.val.valdat_val, *outvallen);
+  (*outval)[*outvallen] = '\0';
 
   xdr_free ((xdrproc_t) xdr_ypresp_val, (char *) &resp);
 
-  return status;
+  return YPERR_SUCCESS;
 }
 
 int
@@ -494,38 +477,30 @@ yp_first (const char *indomain, const char *inmap, char **outkey,
   memset (&resp, '\0', sizeof (resp));
 
   result = do_ypcall (indomain, YPPROC_FIRST, (xdrproc_t) xdr_ypreq_nokey,
-		      (caddr_t) &req, (xdrproc_t) xdr_ypresp_key_val,
-		      (caddr_t) &resp);
+		      (caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val,
+		      (caddr_t) & resp);
 
   if (result != RPC_SUCCESS)
     return YPERR_RPC;
   if (resp.stat != YP_TRUE)
     return ypprot_err (resp.stat);
 
-  int status;
-  if (__builtin_expect ((*outkey  = malloc (resp.key.keydat_len + 1)) != NULL
-			&& (*outval = malloc (resp.val.valdat_len
-					      + 1)) != NULL, 1))
-    {
-      *outkeylen = resp.key.keydat_len;
-      memcpy (*outkey, resp.key.keydat_val, *outkeylen);
-      (*outkey)[*outkeylen] = '\0';
-
-      *outvallen = resp.val.valdat_len;
-      memcpy (*outval, resp.val.valdat_val, *outvallen);
-      (*outval)[*outvallen] = '\0';
-
-      status = YPERR_SUCCESS;
-    }
-  else
-    {
-      free (*outkey);
-      status = YPERR_RESRC;
-    }
+  *outkeylen = resp.key.keydat_len;
+  *outkey = malloc (*outkeylen + 1);
+  if (__builtin_expect (*outkey == NULL, 0))
+    return YPERR_RESRC;
+  memcpy (*outkey, resp.key.keydat_val, *outkeylen);
+  (*outkey)[*outkeylen] = '\0';
+  *outvallen = resp.val.valdat_len;
+  *outval = malloc (*outvallen + 1);
+  if (__builtin_expect (*outval == NULL, 0))
+    return YPERR_RESRC;
+  memcpy (*outval, resp.val.valdat_val, *outvallen);
+  (*outval)[*outvallen] = '\0';
 
   xdr_free ((xdrproc_t) xdr_ypresp_key_val, (char *) &resp);
 
-  return status;
+  return YPERR_SUCCESS;
 }
 
 int
@@ -551,37 +526,31 @@ yp_next (const char *indomain, const char *inmap, const char *inkey,
   *outkeylen = *outvallen = 0;
   memset (&resp, '\0', sizeof (resp));
 
-  result = do_ypcall_tr (indomain, YPPROC_NEXT, (xdrproc_t) xdr_ypreq_key,
-			 (caddr_t) &req, (xdrproc_t) xdr_ypresp_key_val,
-			 (caddr_t) &resp);
+  result = do_ypcall (indomain, YPPROC_NEXT, (xdrproc_t) xdr_ypreq_key,
+		      (caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val,
+		      (caddr_t) & resp);
 
   if (result != YPERR_SUCCESS)
     return result;
+  if (resp.stat != YP_TRUE)
+    return ypprot_err (resp.stat);
 
-  int status;
-  if (__builtin_expect ((*outkey  = malloc (resp.key.keydat_len + 1)) != NULL
-			&& (*outval = malloc (resp.val.valdat_len
-					      + 1)) != NULL, 1))
-    {
-      *outkeylen = resp.key.keydat_len;
-      memcpy (*outkey, resp.key.keydat_val, *outkeylen);
-      (*outkey)[*outkeylen] = '\0';
-
-      *outvallen = resp.val.valdat_len;
-      memcpy (*outval, resp.val.valdat_val, *outvallen);
-      (*outval)[*outvallen] = '\0';
-
-      status = YPERR_SUCCESS;
-    }
-  else
-    {
-      free (*outkey);
-      status = YPERR_RESRC;
-    }
+  *outkeylen = resp.key.keydat_len;
+  *outkey = malloc (*outkeylen + 1);
+  if (__builtin_expect (*outkey == NULL, 0))
+    return YPERR_RESRC;
+  memcpy (*outkey, resp.key.keydat_val, *outkeylen);
+  (*outkey)[*outkeylen] = '\0';
+  *outvallen = resp.val.valdat_len;
+  *outval = malloc (*outvallen + 1);
+  if (__builtin_expect (*outval == NULL, 0))
+    return YPERR_RESRC;
+  memcpy (*outval, resp.val.valdat_val, *outvallen);
+  (*outval)[*outvallen] = '\0';
 
   xdr_free ((xdrproc_t) xdr_ypresp_key_val, (char *) &resp);
 
-  return status;
+  return YPERR_SUCCESS;
 }
 
 int
@@ -600,12 +569,13 @@ yp_master (const char *indomain, const char *inmap, char **outname)
 
   memset (&resp, '\0', sizeof (ypresp_master));
 
-  result = do_ypcall_tr (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey,
-			 (caddr_t) &req, (xdrproc_t) xdr_ypresp_master,
-			 (caddr_t) &resp);
+  result = do_ypcall (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey,
+	  (caddr_t) & req, (xdrproc_t) xdr_ypresp_master, (caddr_t) & resp);
 
   if (result != YPERR_SUCCESS)
     return result;
+  if (resp.stat != YP_TRUE)
+    return ypprot_err (resp.stat);
 
   *outname = strdup (resp.peer);
   xdr_free ((xdrproc_t) xdr_ypresp_master, (char *) &resp);
@@ -622,7 +592,7 @@ yp_order (const char *indomain, const char *inmap, unsigned int *outorder)
   enum clnt_stat result;
 
   if (indomain == NULL || indomain[0] == '\0' ||
-      inmap == NULL || inmap[0] == '\0')
+      inmap == NULL || inmap == '\0')
     return YPERR_BADARGS;
 
   req.domain = (char *) indomain;
@@ -630,17 +600,18 @@ yp_order (const char *indomain, const char *inmap, unsigned int *outorder)
 
   memset (&resp, '\0', sizeof (resp));
 
-  result = do_ypcall_tr (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey,
-			 (caddr_t) &req, (xdrproc_t) xdr_ypresp_order,
-			 (caddr_t) &resp);
+  result = do_ypcall (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey,
+	   (caddr_t) & req, (xdrproc_t) xdr_ypresp_order, (caddr_t) & resp);
 
-  if (result == YPERR_SUCCESS)
+  if (result != YPERR_SUCCESS)
     return result;
+  if (resp.stat != YP_TRUE)
+    return ypprot_err (resp.stat);
 
   *outorder = resp.ordernum;
   xdr_free ((xdrproc_t) xdr_ypresp_order, (char *) &resp);
 
-  return result;
+  return YPERR_SUCCESS;
 }
 
 struct ypresp_all_data
@@ -686,10 +657,10 @@ __xdr_ypresp_all (XDR *xdrs, struct ypresp_all_data *objp)
 	       if we don't modify the length. So add an extra NUL
 	       character to avoid trouble with broken code. */
 	    objp->status = YP_TRUE;
-	    *((char *) __mempcpy (key, resp.ypresp_all_u.val.key.keydat_val,
-				  keylen)) = '\0';
-	    *((char *) __mempcpy (val, resp.ypresp_all_u.val.val.valdat_val,
-				  vallen)) = '\0';
+	    memcpy (key, resp.ypresp_all_u.val.key.keydat_val, keylen);
+	    key[keylen] = '\0';
+	    memcpy (val, resp.ypresp_all_u.val.val.valdat_val, vallen);
+	    val[vallen] = '\0';
 	    xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
 	    if ((*objp->foreach) (objp->status, key, keylen,
 				  val, vallen, objp->data))
@@ -700,7 +671,7 @@ __xdr_ypresp_all (XDR *xdrs, struct ypresp_all_data *objp)
 	  objp->status = resp.ypresp_all_u.val.stat;
 	  xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
 	  /* Sun says we don't need to make this call, but must return
-	     immediately. Since Solaris makes this call, we will call
+	     immediatly. Since Solaris makes this call, we will call
 	     the callback function, too. */
 	  (*objp->foreach) (objp->status, NULL, 0, NULL, 0, objp->data);
 	  return TRUE;
@@ -722,8 +693,8 @@ yp_all (const char *indomain, const char *inmap,
   int clnt_sock;
   int saved_errno = errno;
 
-  if (indomain == NULL || indomain[0] == '\0'
-      || inmap == NULL || inmap[0] == '\0')
+  if (indomain == NULL || indomain[0] == '\0' ||
+      inmap == NULL || inmap == '\0')
     return YPERR_BADARGS;
 
   try = 0;
@@ -761,9 +732,9 @@ yp_all (const char *indomain, const char *inmap,
 			  (caddr_t) &req, (xdrproc_t) __xdr_ypresp_all,
 			  (caddr_t) &data, RPCTIMEOUT);
 
-      if (__builtin_expect (result != RPC_SUCCESS, 0))
+      if (result != RPC_SUCCESS)
 	{
-	  /* Print the error message only on the last try.  */
+	  /* Print the error message only on the last try */
 	  if (try == MAXTRIES - 1)
 	    clnt_perror (clnt, "yp_all: clnt_call");
 	  res = YPERR_RPC;
@@ -787,7 +758,6 @@ yp_all (const char *indomain, const char *inmap,
 }
 
 int
-
 yp_maplist (const char *indomain, struct ypmaplist **outmaplist)
 {
   struct ypresp_maplist resp;
@@ -798,92 +768,67 @@ yp_maplist (const char *indomain, struct ypmaplist **outmaplist)
 
   memset (&resp, '\0', sizeof (resp));
 
-  result = do_ypcall_tr (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname,
-			 (caddr_t) &indomain, (xdrproc_t) xdr_ypresp_maplist,
-			 (caddr_t) &resp);
+  result = do_ypcall (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname,
+    (caddr_t) & indomain, (xdrproc_t) xdr_ypresp_maplist, (caddr_t) & resp);
 
-  if (__builtin_expect (result == YPERR_SUCCESS, 1))
-    {
-      *outmaplist = resp.maps;
-      /* We don't free the list, this will be done by ypserv
-	 xdr_free((xdrproc_t)xdr_ypresp_maplist, (char *)&resp); */
-    }
+  if (result != YPERR_SUCCESS)
+    return result;
+  if (resp.stat != YP_TRUE)
+    return ypprot_err (resp.stat);
 
-  return result;
+  *outmaplist = resp.maps;
+  /* We give the list not free, this will be done by ypserv
+     xdr_free((xdrproc_t)xdr_ypresp_maplist, (char *)&resp); */
+
+  return YPERR_SUCCESS;
 }
 
 const char *
 yperr_string (const int error)
 {
-  const char *str;
   switch (error)
     {
     case YPERR_SUCCESS:
-      str = N_("Success");
-      break;
+      return _("Success");
     case YPERR_BADARGS:
-      str = N_("Request arguments bad");
-      break;
+      return _("Request arguments bad");
     case YPERR_RPC:
-      str = N_("RPC failure on NIS operation");
-      break;
+      return _("RPC failure on NIS operation");
     case YPERR_DOMAIN:
-      str = N_("Can't bind to server which serves this domain");
-      break;
+      return _("Can't bind to server which serves this domain");
     case YPERR_MAP:
-      str = N_("No such map in server's domain");
-      break;
+      return _("No such map in server's domain");
     case YPERR_KEY:
-      str = N_("No such key in map");
-      break;
+      return _("No such key in map");
     case YPERR_YPERR:
-      str = N_("Internal NIS error");
-      break;
+      return _("Internal NIS error");
     case YPERR_RESRC:
-      str = N_("Local resource allocation failure");
-      break;
+      return _("Local resource allocation failure");
     case YPERR_NOMORE:
-      str = N_("No more records in map database");
-      break;
+      return _("No more records in map database");
     case YPERR_PMAP:
-      str = N_("Can't communicate with portmapper");
-      break;
+      return _("Can't communicate with portmapper");
     case YPERR_YPBIND:
-      str = N_("Can't communicate with ypbind");
-      break;
+      return _("Can't communicate with ypbind");
     case YPERR_YPSERV:
-      str = N_("Can't communicate with ypserv");
-      break;
+      return _("Can't communicate with ypserv");
     case YPERR_NODOM:
-      str = N_("Local domain name not set");
-      break;
+      return _("Local domain name not set");
     case YPERR_BADDB:
-      str = N_("NIS map database is bad");
-      break;
+      return _("NIS map database is bad");
     case YPERR_VERS:
-      str = N_("NIS client/server version mismatch - can't supply service");
-      break;
+      return _("NIS client/server version mismatch - can't supply service");
     case YPERR_ACCESS:
-      str = N_("Permission denied");
-      break;
+      return _("Permission denied");
     case YPERR_BUSY:
-      str = N_("Database is busy");
-      break;
-    default:
-      str = N_("Unknown NIS error code");
-      break;
+      return _("Database is busy");
     }
-  return _(str);
+  return _("Unknown NIS error code");
 }
 
 static const int8_t yp_2_yperr[] =
   {
 #define YP2YPERR(yp, yperr)  [YP_##yp - YP_VERS] = YPERR_##yperr
-    YP2YPERR (TRUE, SUCCESS),
-    YP2YPERR (NOMORE, NOMORE),
-    YP2YPERR (FALSE, YPERR),
-    YP2YPERR (NOMAP, MAP),
-    YP2YPERR (NODOM, DOMAIN),
     YP2YPERR (NOKEY, KEY),
     YP2YPERR (BADOP, YPERR),
     YP2YPERR (BADDB, BADDB),
@@ -894,7 +839,7 @@ static const int8_t yp_2_yperr[] =
 int
 ypprot_err (const int code)
 {
-  if (code < YP_VERS || code > YP_NOMORE)
+  if (code < YP_VERS || code > YP_NOKEY)
     return YPERR_YPERR;
   return yp_2_yperr[code - YP_VERS];
 }
@@ -903,26 +848,19 @@ libnsl_hidden_def (ypprot_err)
 const char *
 ypbinderr_string (const int error)
 {
-  const char *str;
   switch (error)
     {
     case 0:
-      str = N_("Success");
-      break;
+      return _("Success");
     case YPBIND_ERR_ERR:
-      str = N_("Internal ypbind error");
-      break;
+      return _("Internal ypbind error");
     case YPBIND_ERR_NOSERV:
-      str = N_("Domain not bound");
-      break;
+      return _("Domain not bound");
     case YPBIND_ERR_RESC:
-      str = N_("System resource allocation failure");
-      break;
+      return _("System resource allocation failure");
     default:
-      str = N_("Unknown ypbind error");
-      break;
+      return _("Unknown ypbind error");
     }
-  return _(str);
 }
 libnsl_hidden_def (ypbinderr_string)
 
@@ -955,22 +893,16 @@ yp_update (char *domain, char *map, unsigned ypop,
   args.update_args.datum.yp_buf_len = datalen;
   args.update_args.datum.yp_buf_val = data;
 
-  if ((r = yp_master (domain, map, &master)) != YPERR_SUCCESS)
+  if ((r = yp_master (domain, map, &master)) != 0)
     return r;
 
   if (!host2netname (servername, master, domain))
     {
       fputs (_("yp_update: cannot convert host to netname\n"), stderr);
-      free (master);
       return YPERR_YPERR;
     }
 
-  clnt = clnt_create (master, YPU_PROG, YPU_VERS, "tcp");
-
-  /* We do not need the string anymore.  */
-  free (master);
-
-  if (clnt == NULL)
+  if ((clnt = clnt_create (master, YPU_PROG, YPU_VERS, "tcp")) == NULL)
     {
       clnt_pcreateerror ("yp_update: clnt_create");
       return YPERR_RPC;
@@ -1010,7 +942,6 @@ again:
     {
       if (clnt->cl_auth->ah_cred.oa_flavor == AUTH_DES)
 	{
-	  auth_destroy (clnt->cl_auth);
 	  clnt->cl_auth = authunix_create_default ();
 	  goto again;
 	}