1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/*
* Copyright (C) 1995, 1997-1999 Jeffrey A. Uphoff
* Modified by Olaf Kirch, Oct. 1996.
* Modified by H.J. Lu, 1998.
*
* NSM for Linux.
*/
#include "config.h"
#include <limits.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
#include "statd.h"
#include "version.h"
short int restart = 0;
int _rpcpmstart = 0; /* flags for tirpc rpcgen */
int _rpcfdtype = 0;
int _rpcsvcdirty = 0;
extern void sm_prog_1 (struct svc_req *, register SVCXPRT);
#ifdef SIMULATIONS
extern void simulator (int, char **);
#endif
/*
* Signal handler.
*/
static void
killer (int sig)
{
log (L_FATAL, "Caught signal %d, un-registering and exiting.", sig);
pmap_unset (SM_PROG, SM_VERS);
exit (0);
}
/*
* Entry routine/main loop.
*/
int
main (int argc, char **argv)
{
int pid;
int foreground = 0;
log_init (argv[0]);
if (argc == 2 && strcmp (argv [1], "-F") == 0) {
foreground = 1;
argc--;
argv++;
}
#ifdef SIMULATIONS
if (argc > 1)
simulator (--argc, ++argv); /* simulator() does exit() */
#endif
if (!foreground) {
int filedes;
if ((pid = fork ()) < 0) {
perror ("Could not fork");
exit (1);
} else if (pid != 0) {
/* Parent. */
exit (0);
}
/* Child. */
setsid ();
chdir (DIR_BASE);
for (filedes = 0; filedes < sysconf (_SC_OPEN_MAX); filedes++) {
close (filedes);
}
}
/* Child. */
signal (SIGHUP, killer);
signal (SIGINT, killer);
signal (SIGTERM, killer);
for (;;) {
pmap_unset (SM_PROG, SM_VERS);
change_state ();
shuffle_dirs ();
notify_hosts ();
++restart;
do_regist (SM_PROG, sm_prog_1);
my_svc_run (); /* I rolled my own, Olaf made it better... */
}
return 0;
}
/*
* Register services.
*/
void
do_regist(u_long prog, void (*sm_prog_1)())
/* do_regist(u_long prog, __dispatch_fn_t sm_prog_1) */
{
SVCXPRT *transp;
if ((transp = svcudp_create(RPC_ANYSOCK)) == NULL)
die("cannot create udp service.");
if (!svc_register(transp, prog, SM_VERS, sm_prog_1, IPPROTO_UDP))
die("unable to register (SM_PROG, SM_VERS, udp).");
if ((transp = svctcp_create(RPC_ANYSOCK, 0, 0)) == NULL)
die("cannot create tcp service.");
if (!svc_register(transp, prog, SM_VERS, sm_prog_1, IPPROTO_TCP))
die("unable to register (SM_PROG, SM_VERS, tcp).");
}
|