pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/************************************************************************
 * iDIRT Exit Handler 1.02.00						*
 * 1995 by Illusion							*
 ************************************************************************/

/************************************************************************
 * The following functions handle all exit() calls from the MUD and 	*
 * handle them itself making sure that the MUD shuts down nicely and 	*
 * with as little problems as possible.					*
 * - Adjusted the code here and there to allow it to work with Dyrtcode *
 *   based muds like this mudcode - Marty                               *
 ************************************************************************/
#define EXIT_C

#include <signal.h>
#include <unistd.h>
#include <string.h>
#include "kernel.h"
#include "mobile.h"
#include "sendsys.h"
#include "timing.h"
#include "time.h"
#include "exit.h"
#include "mudmacros.h"
#include "pflags.h"
#include "log.h"
#include "uaf.h"
#include "parse.h"
#include "main.h"
#include "bprintf.h"
#include "mud.h"
#include "commands.h"
#include "rooms.h"
#ifdef INTERMUD
#include "InterMud/intermud.h"
#endif

#define COREDUMP

/* __exit(): Handles the shutdown of the MUD. */
void __exit (int status)
{ mudlog ("SYSTEM: __exit(%d) called", status);

  send_msg (DEST_ALL, MODE_BRACKET, LVL_MIN, LVL_MAX, NOBODY, NOBODY,
	    "&+wInternal error has occured");

  autosave ();
  debug ();
  numcrashes++;

#ifdef INTERMUD
  imShutdown(1);
#endif

  sysreboot(True,True);
  _exit (1);
}

/* sig_exit(): Handles the shutdown of the MUD due to signal error. */
void sig_exit (char *sig, int signal)
{
  if (signal == SIGUSR1) 
  {  send_msg (DEST_ALL, 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY,
	      "\001f" SIGNAL1 "\003");
  } else if (signal == SIGUSR2) 
  {  send_msg (DEST_ALL, 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY,
	      "\001f" SIGNAL2 "\003");
  } else 
  {  send_msg (DEST_ALL, MODE_BRACKET, LVL_WIZARD, LVL_MAX, NOBODY, NOBODY,
	      "&+wSignal Error: &+w%s", sig);

     send_msg (DEST_ALL, MODE_BRACKET, LVL_GUEST, (LVL_WIZARD - 1), NOBODY, NOBODY,
	      "&+wInternal error has occured");
  }

  autosave ();
  debug ();

#ifdef INTERMUD
  imShutdown(1);
#endif

#ifdef COREDUMP
  if (fork())
  {  kill(getpid(), SIGTRAP);
  } 
  else
  {  numcrashes++;
     sysreboot(True,True);
  }
#else
  numcrashes++;
  sysreboot(True,True);
#endif
  _exit (2);
}

/* autosave(): Saves all players. */
void autosave (void)
{ int plx;
  PERSONA d;

  for (plx = 0; plx < max_players; ++plx) 
  { if (is_in_game (plx)) 
    { if (players[plx].aliased || players[plx].polymorphed >= 0) 
      { unalias (plx);
	unpolymorph (plx);
	setup_globals (plx);
	sendf (plx, "&+w[&+wUnaliasing You&+w]&*\n");
      }
      sendf (plx, "&+w[&+wSaving Character&+w]&*\n");
      player2pers (&d, &global_clock, plx);
      bflush ();
      putuaf (&d);
    }
  }
}

/* debug(): Write last commands entered to system logs */
void debug (void)
{ int plx;
  int i;
  char *t;
  char nt[100];

  for (plx = 0; plx < max_players; ++plx)
    if (is_in_game (plx)) 
    { t = ctime (&plast_cmd (plx));

      t[19] = '\0';
      for (i = 0; i < 8; ++i)
	nt[i] = t[i + 11];

      nt[8] = '\0';

      mudlog ("DEBUG: Last Command (%s) %s@%s: %s",
	      nt, pname (plx), showname(ploc(plx)), players[plx].prev_com);
     
    }
}