]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/stat.c
statd: Support IPv6 in sm_stat_1_svc()
[nfs-utils.git] / utils / statd / stat.c
index bcd3550f34d54e1dbcf5feaa24a46c507256195d..8d8b65e2f747b50cec285b0cc662a7dda81d3567 100644 (file)
@@ -12,7 +12,7 @@
 #include <netdb.h>
 #include "statd.h"
 
-/* 
+/*
  * Services SM_STAT requests.
  *
  * According the the X/Open spec's on this procedure: "Implementations
  * status."  My implementation is operative; it returns 'STAT_SUCC'
  * whenever it can resolve the hostname that it's being asked to
  * monitor, and returns 'STAT_FAIL' otherwise.
+ *
+ * sm_inter.x says the 'state' returned should be
+ *   "state number of site sm_name".  It is not clear how to get this.
+ * X/Open says:
+ *   STAT_SUCC
+ *      The NSM will monitor the given host. "sm_stat_res.state" contains
+ *      the state of the NSM.
+ * Which implies that 'state' is the state number of the *local* NSM.
+ * href=http://www.opengroup.org/onlinepubs/9629799/SM_STAT.htm
+ *
+ * We return the *local* state as
+ *   1/ We have easy access to it.
+ *   2/ It might be useful to a remote client who needs it and has no
+ *      other way to get it.
+ *   3/ That's what we always did in the past.
  */
-struct sm_stat_res * 
-sm_stat_1_svc (struct sm_name *argp, struct svc_req *rqstp)
+struct sm_stat_res *
+sm_stat_1_svc(struct sm_name *argp,
+               __attribute__ ((unused)) struct svc_req *rqstp)
 {
   static sm_stat_res result;
+  char *name;
+
+  xlog(D_CALL, "Received SM_STAT from %s", argp->mon_name);
 
-  if (gethostbyname (argp->mon_name) == NULL) {
-    note (N_WARNING, "gethostbyname error for %s", argp->mon_name);
+  name = statd_canonical_name(argp->mon_name);
+  if (name == NULL) {
     result.res_stat = STAT_FAIL;
-    dprintf (N_DEBUG, "STAT_FAIL for %s", argp->mon_name);
+    xlog (D_GENERAL, "STAT_FAIL for %s", argp->mon_name);
   } else {
     result.res_stat = STAT_SUCC;
-    dprintf (N_DEBUG, "STAT_SUCC for %s", argp->mon_name);
+    xlog (D_GENERAL, "STAT_SUCC for %s", argp->mon_name);
+    free(name);
   }
   result.state = MY_STATE;
   return(&result);