blob: f1d0bf886f3dfb5caf87ebdeb38406a75db4b329 [file] [log] [blame]
/*
* Copyright (C) 1995, 1997-1999 Jeffrey A. Uphoff
*
* NSM for Linux.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <netdb.h>
#include <arpa/inet.h>
#include "sockaddr.h"
#include "rpcmisc.h"
#include "statd.h"
#include "notlist.h"
extern void my_svc_exit (void);
/*
* Services SM_SIMU_CRASH requests.
*
* Although the kernel contacts the statd service via only IPv4
* transports, the statd service can receive other requests, such
* as SM_NOTIFY, from remote peers via IPv6.
*/
void *
sm_simu_crash_1_svc (__attribute__ ((unused)) void *argp, struct svc_req *rqstp)
{
struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
char buf[INET6_ADDRSTRLEN];
static char *result = NULL;
xlog(D_CALL, "Received SM_SIMU_CRASH");
if (!nfs_is_v4_loopback(sap))
goto out_nonlocal;
if ((int)nfs_get_port(sap) >= IPPORT_RESERVED) {
xlog_warn("SM_SIMU_CRASH call from unprivileged port");
goto failure;
}
my_svc_exit ();
if (rtnl)
nlist_kill (&rtnl);
failure:
return ((void *)&result);
out_nonlocal:
if (!statd_present_address(sap, buf, sizeof(buf)))
buf[0] = '\0';
xlog_warn("SM_SIMU_CRASH call from non-local host %s", buf);
goto failure;
}