blob: 8d8b65e2f747b50cec285b0cc662a7dda81d3567 [file] [log] [blame]
/*
* 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);
}