]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/callback.c
NFS man page: update nfs(5) with details about IPv6 support
[nfs-utils.git] / utils / statd / callback.c
index e3fad6a4e87a1a1c99a719fbd598d49f04a03550..2f98aeb2adb468ae6e6d79a38a11d2a4a8346f8c 100644 (file)
@@ -1,16 +1,24 @@
 /*
  * Copyright (C) 1995, 1997-1999 Jeffrey A. Uphoff
  * Modified by Olaf Kirch, Oct. 1996.
+ * Modified by Lon Hohberger, Oct. 2000.
  *
  * NSM for Linux.
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <arpa/inet.h>
+
+#include "rpcmisc.h"
+#include "misc.h"
 #include "statd.h"
 #include "notlist.h"
 
 /* Callback notify list. */
-notify_list *cbnl = NULL;
+/* notify_list *cbnl = NULL; ... never used */
 
 
 /* 
@@ -24,13 +32,16 @@ sm_notify_1_svc(struct stat_chge *argp, struct svc_req *rqstp)
 {
        notify_list    *lp, *call;
        static char    *result = NULL;
+       struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt);
+       char *ip_addr = xstrdup(inet_ntoa(sin->sin_addr));
 
-       dprintf(L_DEBUG, "Received SM_NOTIFY from %s, state: %d",
+       xlog(D_CALL, "Received SM_NOTIFY from %s, state: %d",
                                argp->mon_name, argp->state);
 
-       if ((lp = rtnl) != NULL) {
-               log(L_WARNING, "SM_NOTIFY from %s--nobody looking!",
-                               argp->mon_name, argp->state);
+       /* quick check - don't bother if we're not monitoring anyone */
+       if (rtnl == NULL) {
+               xlog_warn("SM_NOTIFY from %s while not monitoring any hosts",
+                               argp->mon_name);
                return ((void *) &result);
        }
 
@@ -39,15 +50,15 @@ sm_notify_1_svc(struct stat_chge *argp, struct svc_req *rqstp)
         * it. Lockd will want to continue monitoring the remote host
         * until it issues an SM_UNMON call.
         */
-       while ((lp = nlist_gethost(lp, argp->mon_name, 0)) != NULL) {
-               if (NL_STATE(lp) != argp->state) {
+       for (lp = rtnl ; lp ; lp = lp->next)
+               if (NL_STATE(lp) != argp->state &&
+                   (matchhostname(argp->mon_name, lp->dns_name) ||
+                    matchhostname(ip_addr, lp->dns_name))) {
                        NL_STATE(lp) = argp->state;
                        call = nlist_clone(lp);
-                       NL_TYPE(call) = NOTIFY_CALLBACK;
                        nlist_insert(&notify, call);
                }
-               lp = NL_NEXT(lp);
-       }
+
 
        return ((void *) &result);
 }