Add support for callback, Fix use of variables.
authordrepper <drepper>
Wed, 24 Sep 1997 22:35:05 +0000 (22:35 +0000)
committerdrepper <drepper>
Wed, 24 Sep 1997 22:35:05 +0000 (22:35 +0000)
(__do_niscall2): Fix multiple Server support.

nis/nis_call.c

index 6727550..fd777f5 100644 (file)
@@ -98,8 +98,7 @@ __bind_next (dir_binding *bind)
   if (bind->server_used >= bind->server_len)
     bind->server_used = 0;
 
   if (bind->server_used >= bind->server_len)
     bind->server_used = 0;
 
-  for (j = bind->current_ep + 1;
-       j < bind->server_val[bind->server_used].ep.ep_len; ++j)
+  for (j = 0; j < bind->server_val[bind->server_used].ep.ep_len; ++j)
     if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].family,
                "inet") == 0)
       if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].proto,
     if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].family,
                "inet") == 0)
       if (strcmp (bind->server_val[bind->server_used].ep.ep_val[j].proto,
@@ -280,7 +279,7 @@ __bind_create (const nis_server *serv_val, u_int serv_len, u_long flags)
 nis_error
 __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
               xdrproc_t xargs, caddr_t req, xdrproc_t xres, caddr_t resp,
 nis_error
 __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
               xdrproc_t xargs, caddr_t req, xdrproc_t xres, caddr_t resp,
-              u_long flags)
+              u_long flags, nis_cb *cb)
 {
   enum clnt_stat result;
   nis_error retcode;
 {
   enum clnt_stat result;
   nis_error retcode;
@@ -315,63 +314,83 @@ __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
        {
          switch (prog)
            {
        {
          switch (prog)
            {
+           case NIS_IBLIST:
+             if ((((nis_result *)resp)->status == NIS_CBRESULTS) &&
+                 (cb != NULL))
+               {
+                 __nis_do_callback(dbp, &((nis_result *)resp)->cookie, cb);
+                 break;
+               }
+             /* Yes, this is correct. If we doesn't have to start
+                a callback, look if we have to search another server */
            case NIS_LOOKUP:
            case NIS_ADD:
            case NIS_MODIFY:
            case NIS_REMOVE:
            case NIS_LOOKUP:
            case NIS_ADD:
            case NIS_MODIFY:
            case NIS_REMOVE:
-           case NIS_IBLIST:
            case NIS_IBADD:
            case NIS_IBMODIFY:
            case NIS_IBREMOVE:
            case NIS_IBFIRST:
            case NIS_IBNEXT:
            case NIS_IBADD:
            case NIS_IBMODIFY:
            case NIS_IBREMOVE:
            case NIS_IBFIRST:
            case NIS_IBNEXT:
-             if ((((nis_result *)xres)->status == NIS_NOTFOUND) ||
-                 (((nis_result *)xres)->status == NIS_NOSUCHNAME) ||
-                 (((nis_result *)xres)->status == NIS_NOT_ME))
+             if ((((nis_result *)resp)->status == NIS_NOTFOUND) ||
+                 (((nis_result *)resp)->status == NIS_NOSUCHNAME) ||
+                 (((nis_result *)resp)->status == NIS_NOT_ME))
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
-                   while (__bind_connect (dbp) != NIS_SUCCESS)
-                     {
-                       if (__bind_next (dbp) != NIS_SUCCESS)
-                         {
-                           __bind_destroy (dbp);
-                           return NIS_SUCCESS;
-                         }
-                     }
+                   {
+                     while (__bind_connect (dbp) != NIS_SUCCESS)
+                       {
+                         if (__bind_next (dbp) != NIS_SUCCESS)
+                           {
+                             __bind_destroy (dbp);
+                             return NIS_SUCCESS;
+                           }
+                       }
+                   }
+                 else
+                   break; /* No more servers to search in */
                  goto again;
                }
            case NIS_FINDDIRECTORY:
                  goto again;
                }
            case NIS_FINDDIRECTORY:
-             if ((((fd_result *)xres)->status == NIS_NOTFOUND) ||
-                 (((fd_result *)xres)->status == NIS_NOSUCHNAME) ||
-                 (((fd_result *)xres)->status == NIS_NOT_ME))
+             if ((((fd_result *)resp)->status == NIS_NOTFOUND) ||
+                 (((fd_result *)resp)->status == NIS_NOSUCHNAME) ||
+                 (((fd_result *)resp)->status == NIS_NOT_ME))
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
-                   while (__bind_connect (dbp) != NIS_SUCCESS)
-                     {
-                       if (__bind_next (dbp) != NIS_SUCCESS)
-                         {
-                           __bind_destroy (dbp);
-                           return NIS_SUCCESS;
-                         }
-                     }
+                   {
+                     while (__bind_connect (dbp) != NIS_SUCCESS)
+                       {
+                         if (__bind_next (dbp) != NIS_SUCCESS)
+                           {
+                             __bind_destroy (dbp);
+                             return NIS_SUCCESS;
+                           }
+                       }
+                   }
+                 else
+                   break; /* No more servers to search in */
                  goto again;
                }
              break;
            case NIS_DUMPLOG: /* log_result */
            case NIS_DUMP:
                  goto again;
                }
              break;
            case NIS_DUMPLOG: /* log_result */
            case NIS_DUMP:
-             if ((((log_result *)xres)->lr_status == NIS_NOTFOUND) ||
-                 (((log_result *)xres)->lr_status == NIS_NOSUCHNAME) ||
-                 (((log_result *)xres)->lr_status == NIS_NOT_ME))
+             if ((((log_result *)resp)->lr_status == NIS_NOTFOUND) ||
+                 (((log_result *)resp)->lr_status == NIS_NOSUCHNAME) ||
+                 (((log_result *)resp)->lr_status == NIS_NOT_ME))
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
                {
                  if (__bind_next (dbp) == NIS_SUCCESS)
-                   while (__bind_connect (dbp) != NIS_SUCCESS)
-                     {
-                       if (__bind_next (dbp) != NIS_SUCCESS)
-                         {
-                           __bind_destroy (dbp);
-                           return NIS_SUCCESS;
-                         }
-                     }
+                   {
+                     while (__bind_connect (dbp) != NIS_SUCCESS)
+                       {
+                         if (__bind_next (dbp) != NIS_SUCCESS)
+                           {
+                             __bind_destroy (dbp);
+                             return NIS_SUCCESS;
+                           }
+                       }
+                   }
+                 else
+                   break; /* No more servers to search in */
                  goto again;
                }
              break;
                  goto again;
                }
              break;
@@ -523,7 +542,8 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags,
 
 nis_error
 __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
 
 nis_error
 __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
-             caddr_t req, xdrproc_t xres, caddr_t resp, u_long flags)
+             caddr_t req, xdrproc_t xres, caddr_t resp, u_long flags,
+             nis_cb *cb)
 {
   nis_error retcode;
   directory_obj *dir = NULL;
 {
   nis_error retcode;
   directory_obj *dir = NULL;
@@ -561,7 +581,7 @@ __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
 
 
   retcode = __do_niscall2 (server, server_len, prog, xargs, req, xres, resp,
 
 
   retcode = __do_niscall2 (server, server_len, prog, xargs, req, xres, resp,
-                          flags);
+                          flags, cb);
 
   nis_free_directory (dir);
 
 
   nis_free_directory (dir);