121 lines
2.3 KiB
Diff
121 lines
2.3 KiB
Diff
--- lib/libc/yp/yplib.c.orig
|
|
+++ lib/libc/yp/yplib.c
|
|
@@ -655,7 +655,7 @@
|
|
struct timeval tv;
|
|
struct ypreq_key yprk;
|
|
int r;
|
|
-
|
|
+ int retries = 0;
|
|
*outval = NULL;
|
|
*outvallen = 0;
|
|
|
|
@@ -700,6 +700,11 @@
|
|
#endif
|
|
|
|
again:
|
|
+ if (retries > MAX_RETRIES) {
|
|
+ YPUNLOCK();
|
|
+ return (YPERR_RPC);
|
|
+ }
|
|
+
|
|
if (_yp_dobind(indomain, &ysd) != 0) {
|
|
YPUNLOCK();
|
|
return (YPERR_DOMAIN);
|
|
@@ -716,6 +721,7 @@
|
|
if (r != RPC_SUCCESS) {
|
|
clnt_perror(ysd->dom_client, "yp_match: clnt_call");
|
|
_yp_unbind(ysd);
|
|
+ retries++;
|
|
goto again;
|
|
}
|
|
|
|
@@ -772,7 +778,7 @@
|
|
struct dom_binding *ysd;
|
|
struct timeval tv;
|
|
int r;
|
|
-
|
|
+ int retries = 0;
|
|
/* Sanity check */
|
|
|
|
if (indomain == NULL || !strlen(indomain) ||
|
|
@@ -784,6 +790,11 @@
|
|
|
|
YPLOCK();
|
|
again:
|
|
+ if (retries > MAX_RETRIES) {
|
|
+ YPUNLOCK();
|
|
+ return (YPERR_RPC);
|
|
+ }
|
|
+
|
|
if (_yp_dobind(indomain, &ysd) != 0) {
|
|
YPUNLOCK();
|
|
return (YPERR_DOMAIN);
|
|
@@ -802,6 +813,7 @@
|
|
if (r != RPC_SUCCESS) {
|
|
clnt_perror(ysd->dom_client, "yp_first: clnt_call");
|
|
_yp_unbind(ysd);
|
|
+ retries++;
|
|
goto again;
|
|
}
|
|
if (!(r = ypprot_err(yprkv.stat))) {
|
|
@@ -844,7 +856,7 @@
|
|
struct dom_binding *ysd;
|
|
struct timeval tv;
|
|
int r;
|
|
-
|
|
+ int retries = 0;
|
|
/* Sanity check */
|
|
|
|
if (inkey == NULL || !strlen(inkey) || inkeylen <= 0 ||
|
|
@@ -857,6 +869,11 @@
|
|
|
|
YPLOCK();
|
|
again:
|
|
+ if (retries > MAX_RETRIES) {
|
|
+ YPUNLOCK();
|
|
+ return (YPERR_RPC);
|
|
+ }
|
|
+
|
|
if (_yp_dobind(indomain, &ysd) != 0) {
|
|
YPUNLOCK();
|
|
return (YPERR_DOMAIN);
|
|
@@ -877,6 +894,7 @@
|
|
if (r != RPC_SUCCESS) {
|
|
clnt_perror(ysd->dom_client, "yp_next: clnt_call");
|
|
_yp_unbind(ysd);
|
|
+ retries++;
|
|
goto again;
|
|
}
|
|
if (!(r = ypprot_err(yprkv.stat))) {
|
|
@@ -920,7 +938,7 @@
|
|
CLIENT *clnt;
|
|
u_long status, savstat;
|
|
int clnt_sock;
|
|
-
|
|
+ int retries = 0;
|
|
/* Sanity check */
|
|
|
|
if (indomain == NULL || !strlen(indomain) ||
|
|
@@ -929,6 +947,10 @@
|
|
|
|
YPLOCK();
|
|
again:
|
|
+ if (retries > MAX_RETRIES) {
|
|
+ YPUNLOCK();
|
|
+ return (YPERR_RPC);
|
|
+ }
|
|
|
|
if (_yp_dobind(indomain, &ysd) != 0) {
|
|
YPUNLOCK();
|
|
@@ -958,9 +980,10 @@
|
|
if (clnt_call(clnt, YPPROC_ALL,
|
|
(xdrproc_t)xdr_ypreq_nokey, &yprnk,
|
|
(xdrproc_t)xdr_ypresp_all_seq, &status, tv) != RPC_SUCCESS) {
|
|
- clnt_perror(ysd->dom_client, "yp_all: clnt_call");
|
|
+ clnt_perror(clnt, "yp_all: clnt_call");
|
|
clnt_destroy(clnt);
|
|
_yp_unbind(ysd);
|
|
+ retries++;
|
|
goto again;
|
|
}
|
|
|