/* * Copyright (C) 1995, 1997-1999 Jeffrey A. Uphoff * * NSM for Linux. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #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; }