summaryrefslogtreecommitdiff
path: root/nis/nis_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/nis_call.c')
-rw-r--r--nis/nis_call.c103
1 files changed, 51 insertions, 52 deletions
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 753ef77997..9769f68174 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -30,6 +30,7 @@
#include "nis_xdr.h"
#include "nis_intern.h"
+#include <libnsl.h>
static const struct timeval RPCTIMEOUT = {10, 0};
static const struct timeval UDPTIMEOUT = {5, 0};
@@ -256,6 +257,7 @@ __do_niscall3 (dir_binding *dbp, u_long prog, xdrproc_t xargs, caddr_t req,
|| ((nis_result *)resp)->status == NIS_NOSUCHNAME
|| ((nis_result *)resp)->status == NIS_NOT_ME)
{
+ next_server:
if (__nisbind_next (dbp) == NIS_SUCCESS)
{
while (__nisbind_connect (dbp) != NIS_SUCCESS)
@@ -273,38 +275,14 @@ __do_niscall3 (dir_binding *dbp, u_long prog, xdrproc_t xargs, caddr_t req,
if (((fd_result *)resp)->status == NIS_SYSTEMERROR
|| ((fd_result *)resp)->status == NIS_NOSUCHNAME
|| ((fd_result *)resp)->status == NIS_NOT_ME)
- {
- if (__nisbind_next (dbp) == NIS_SUCCESS)
- {
- while (__nisbind_connect (dbp) != NIS_SUCCESS)
- {
- if (__nisbind_next (dbp) != NIS_SUCCESS)
- return NIS_SUCCESS;
- }
- }
- else
- break; /* No more servers to search in */
- goto again;
- }
+ goto next_server;
break;
case NIS_DUMPLOG: /* log_result */
case NIS_DUMP:
if (((log_result *)resp)->lr_status == NIS_SYSTEMERROR
|| ((log_result *)resp)->lr_status == NIS_NOSUCHNAME
|| ((log_result *)resp)->lr_status == NIS_NOT_ME)
- {
- if (__nisbind_next (dbp) == NIS_SUCCESS)
- {
- while (__nisbind_connect (dbp) != NIS_SUCCESS)
- {
- if (__nisbind_next (dbp) != NIS_SUCCESS)
- return NIS_SUCCESS;
- }
- }
- else
- break; /* No more servers to search in */
- goto again;
- }
+ goto next_server;
break;
default:
break;
@@ -316,6 +294,8 @@ __do_niscall3 (dir_binding *dbp, u_long prog, xdrproc_t xargs, caddr_t req,
return retcode;
}
+libnsl_hidden_def (__do_niscall3)
+
nis_error
__do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
@@ -425,7 +405,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
++run;
}
while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME);
-
+ printf("%s: run=%u\n", __func__, run);
if (run == 1)
{
/* We have found the directory above. Use it. */
@@ -554,50 +534,69 @@ __nisfind_server (const_nis_name name, directory_obj **dir)
return result;
}
+
nis_error
-__do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
- caddr_t req, xdrproc_t xres, caddr_t resp, unsigned int flags,
- nis_cb *cb)
+__prepare_niscall (const_nis_name name, directory_obj **dirp,
+ dir_binding *bptrp, unsigned int flags)
{
- nis_error retcode;
- dir_binding bptr;
- directory_obj *dir = NULL;
+ nis_error retcode = __nisfind_server (name, dirp);
+ if (__builtin_expect (retcode != NIS_SUCCESS, 0))
+ return retcode;
+
nis_server *server;
u_int server_len;
- int saved_errno = errno;
-
- retcode = __nisfind_server (name, &dir);
- if (retcode != NIS_SUCCESS)
- return retcode;
if (flags & MASTER_ONLY)
{
- server = dir->do_servers.do_servers_val;
+ server = (*dirp)->do_servers.do_servers_val;
server_len = 1;
}
else
{
- server = dir->do_servers.do_servers_val;
- server_len = dir->do_servers.do_servers_len;
+ server = (*dirp)->do_servers.do_servers_val;
+ server_len = (*dirp)->do_servers.do_servers_len;
}
- retcode = __nisbind_create (&bptr, server, server_len, flags);
+ retcode = __nisbind_create (bptrp, server, server_len, flags);
+ if (retcode == NIS_SUCCESS)
+ {
+ do
+ if (__nisbind_connect (bptrp) == NIS_SUCCESS)
+ return NIS_SUCCESS;
+ while (__nisbind_next (bptrp) == NIS_SUCCESS);
+
+ __nisbind_destroy (bptrp);
+ memset (bptrp, '\0', sizeof (*bptrp));
+
+ retcode = NIS_NAMEUNREACHABLE;
+ }
+
+ nis_free_directory (*dirp);
+ *dirp = NULL;
+
+ return retcode;
+}
+libnsl_hidden_def (__prepare_niscall)
+
+
+nis_error
+__do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
+ caddr_t req, xdrproc_t xres, caddr_t resp, unsigned int flags,
+ nis_cb *cb)
+{
+ dir_binding bptr;
+ directory_obj *dir = NULL;
+ int saved_errno = errno;
+
+ nis_error retcode = __prepare_niscall (name, &dir, &bptr, flags);
if (retcode == NIS_SUCCESS)
{
- while (__nisbind_connect (&bptr) != NIS_SUCCESS)
- {
- if (__nisbind_next (&bptr) != NIS_SUCCESS)
- {
- nis_free_directory (dir);
- return NIS_NAMEUNREACHABLE;
- }
- }
retcode = __do_niscall3 (&bptr, prog, xargs, req, xres, resp, flags, cb);
__nisbind_destroy (&bptr);
- }
- nis_free_directory (dir);
+ nis_free_directory (dir);
+ }
__set_errno (saved_errno);