/*
 * Copyright (C) 1995, 1997, 1999 Jeffrey A. Uphoff
 * Modified by Olaf Kirch, 1996.
 *
 * NSM for Linux.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <netdb.h>
#include "statd.h"

/*
 * Services SM_STAT requests.
 *
 * According the the X/Open spec's on this procedure: "Implementations
 * should not rely on this procedure being operative.  In many current
 * implementations of the NSM it will always return a 'STAT_FAIL'
 * 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,
		__attribute__ ((unused)) struct svc_req *rqstp)
{
  static sm_stat_res result;
  char *name;

  xlog(D_CALL, "Received SM_STAT from %s", argp->mon_name);

  name = statd_canonical_name(argp->mon_name);
  if (name == NULL) {
    result.res_stat = STAT_FAIL;
    xlog (D_GENERAL, "STAT_FAIL for %s", argp->mon_name);
  } else {
    result.res_stat = STAT_SUCC;
    xlog (D_GENERAL, "STAT_SUCC for %s", argp->mon_name);
    free(name);
  }
  result.state = MY_STATE;
  return(&result);
}
