-
- 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;
+
+ if (!(run_mode & MODE_NODAEMON)) {
+ 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);
+ /* WARNING: the following works on Linux and SysV, but not BSD! */
+ signal(SIGCHLD, SIG_IGN);
+
+ for (;;) {
+ pmap_unset (SM_PROG, SM_VERS);
+ change_state ();
+ shuffle_dirs (); /* Move directory names around */
+ notify_hosts (); /* Send out notify requests */
+ ++restart;
+
+ /* future: IP aliasing
+ if (!(run_mode & MODE_NOTIFY_ONLY)) {
+ do_regist (SM_PROG, sm_prog_1);
+ } */
+ do_regist(SM_PROG,sm_prog_1);
+
+ /*
+ * Handle incoming requests: SM_NOTIFY socket requests, as
+ * well as callbacks from lockd.
+ */
+ my_svc_run(); /* I rolled my own, Olaf made it better... */
+ }
+ return 0;