ds2.9a10/bin/
ds2.9a10/extra/
ds2.9a10/extra/crat/
ds2.9a10/extra/creremote/
ds2.9a10/extra/mingw/
ds2.9a10/extra/wolfpaw/
ds2.9a10/fluffos-2.14-ds06/
ds2.9a10/fluffos-2.14-ds06/Win32/
ds2.9a10/fluffos-2.14-ds06/compat/
ds2.9a10/fluffos-2.14-ds06/compat/simuls/
ds2.9a10/fluffos-2.14-ds06/include/
ds2.9a10/fluffos-2.14-ds06/testsuite/
ds2.9a10/fluffos-2.14-ds06/testsuite/clone/
ds2.9a10/fluffos-2.14-ds06/testsuite/command/
ds2.9a10/fluffos-2.14-ds06/testsuite/data/
ds2.9a10/fluffos-2.14-ds06/testsuite/etc/
ds2.9a10/fluffos-2.14-ds06/testsuite/include/
ds2.9a10/fluffos-2.14-ds06/testsuite/inherit/
ds2.9a10/fluffos-2.14-ds06/testsuite/inherit/master/
ds2.9a10/fluffos-2.14-ds06/testsuite/log/
ds2.9a10/fluffos-2.14-ds06/testsuite/single/
ds2.9a10/fluffos-2.14-ds06/testsuite/single/tests/compiler/
ds2.9a10/fluffos-2.14-ds06/testsuite/single/tests/efuns/
ds2.9a10/fluffos-2.14-ds06/testsuite/single/tests/operators/
ds2.9a10/fluffos-2.14-ds06/testsuite/u/
ds2.9a10/lib/cmds/admins/
ds2.9a10/lib/cmds/common/
ds2.9a10/lib/cmds/creators/include/
ds2.9a10/lib/daemon/services/
ds2.9a10/lib/daemon/tmp/
ds2.9a10/lib/doc/
ds2.9a10/lib/doc/bguide/
ds2.9a10/lib/doc/efun/all/
ds2.9a10/lib/doc/efun/arrays/
ds2.9a10/lib/doc/efun/buffers/
ds2.9a10/lib/doc/efun/compile/
ds2.9a10/lib/doc/efun/floats/
ds2.9a10/lib/doc/efun/functions/
ds2.9a10/lib/doc/efun/general/
ds2.9a10/lib/doc/efun/mixed/
ds2.9a10/lib/doc/efun/numbers/
ds2.9a10/lib/doc/efun/parsing/
ds2.9a10/lib/doc/hbook/
ds2.9a10/lib/doc/help/classes/
ds2.9a10/lib/doc/help/races/
ds2.9a10/lib/doc/lfun/
ds2.9a10/lib/doc/lfun/all/
ds2.9a10/lib/doc/lfun/lib/abilities/
ds2.9a10/lib/doc/lfun/lib/armor/
ds2.9a10/lib/doc/lfun/lib/bank/
ds2.9a10/lib/doc/lfun/lib/bot/
ds2.9a10/lib/doc/lfun/lib/clay/
ds2.9a10/lib/doc/lfun/lib/clean/
ds2.9a10/lib/doc/lfun/lib/clerk/
ds2.9a10/lib/doc/lfun/lib/client/
ds2.9a10/lib/doc/lfun/lib/combat/
ds2.9a10/lib/doc/lfun/lib/connect/
ds2.9a10/lib/doc/lfun/lib/container/
ds2.9a10/lib/doc/lfun/lib/corpse/
ds2.9a10/lib/doc/lfun/lib/creator/
ds2.9a10/lib/doc/lfun/lib/daemon/
ds2.9a10/lib/doc/lfun/lib/damage/
ds2.9a10/lib/doc/lfun/lib/deterioration/
ds2.9a10/lib/doc/lfun/lib/donate/
ds2.9a10/lib/doc/lfun/lib/door/
ds2.9a10/lib/doc/lfun/lib/equip/
ds2.9a10/lib/doc/lfun/lib/file/
ds2.9a10/lib/doc/lfun/lib/fish/
ds2.9a10/lib/doc/lfun/lib/fishing/
ds2.9a10/lib/doc/lfun/lib/flashlight/
ds2.9a10/lib/doc/lfun/lib/follow/
ds2.9a10/lib/doc/lfun/lib/ftp_client/
ds2.9a10/lib/doc/lfun/lib/ftp_data_connection/
ds2.9a10/lib/doc/lfun/lib/fuel/
ds2.9a10/lib/doc/lfun/lib/furnace/
ds2.9a10/lib/doc/lfun/lib/genetics/
ds2.9a10/lib/doc/lfun/lib/holder/
ds2.9a10/lib/doc/lfun/lib/id/
ds2.9a10/lib/doc/lfun/lib/interactive/
ds2.9a10/lib/doc/lfun/lib/lamp/
ds2.9a10/lib/doc/lfun/lib/leader/
ds2.9a10/lib/doc/lfun/lib/light/
ds2.9a10/lib/doc/lfun/lib/limb/
ds2.9a10/lib/doc/lfun/lib/living/
ds2.9a10/lib/doc/lfun/lib/load/
ds2.9a10/lib/doc/lfun/lib/look/
ds2.9a10/lib/doc/lfun/lib/manipulate/
ds2.9a10/lib/doc/lfun/lib/meal/
ds2.9a10/lib/doc/lfun/lib/messages/
ds2.9a10/lib/doc/lfun/lib/player/
ds2.9a10/lib/doc/lfun/lib/poison/
ds2.9a10/lib/doc/lfun/lib/position/
ds2.9a10/lib/doc/lfun/lib/post_office/
ds2.9a10/lib/doc/lfun/lib/potion/
ds2.9a10/lib/doc/lfun/lib/room/
ds2.9a10/lib/doc/lfun/lib/server/
ds2.9a10/lib/doc/lfun/lib/spell/
ds2.9a10/lib/doc/lfun/lib/torch/
ds2.9a10/lib/doc/lfun/lib/vendor/
ds2.9a10/lib/doc/lfun/lib/virt_sky/
ds2.9a10/lib/doc/lfun/lib/weapon/
ds2.9a10/lib/doc/lfun/lib/worn_storage/
ds2.9a10/lib/doc/lpc/basic/
ds2.9a10/lib/doc/lpc/concepts/
ds2.9a10/lib/doc/lpc/constructs/
ds2.9a10/lib/doc/lpc/etc/
ds2.9a10/lib/doc/lpc/intermediate/
ds2.9a10/lib/doc/lpc/types/
ds2.9a10/lib/doc/misc/
ds2.9a10/lib/doc/old/
ds2.9a10/lib/domains/
ds2.9a10/lib/domains/Praxis/adm/
ds2.9a10/lib/domains/Praxis/attic/
ds2.9a10/lib/domains/Praxis/cemetery/mon/
ds2.9a10/lib/domains/Praxis/data/
ds2.9a10/lib/domains/Praxis/death/
ds2.9a10/lib/domains/Praxis/mountains/
ds2.9a10/lib/domains/Praxis/obj/armour/
ds2.9a10/lib/domains/Praxis/obj/magic/
ds2.9a10/lib/domains/Praxis/obj/weapon/
ds2.9a10/lib/domains/Praxis/orc_valley/
ds2.9a10/lib/domains/Ylsrim/
ds2.9a10/lib/domains/Ylsrim/adm/
ds2.9a10/lib/domains/Ylsrim/armor/
ds2.9a10/lib/domains/Ylsrim/broken/
ds2.9a10/lib/domains/Ylsrim/fish/
ds2.9a10/lib/domains/Ylsrim/meal/
ds2.9a10/lib/domains/Ylsrim/npc/
ds2.9a10/lib/domains/Ylsrim/obj/
ds2.9a10/lib/domains/Ylsrim/virtual/
ds2.9a10/lib/domains/Ylsrim/weapon/
ds2.9a10/lib/domains/campus/adm/
ds2.9a10/lib/domains/campus/etc/
ds2.9a10/lib/domains/campus/meals/
ds2.9a10/lib/domains/campus/save/
ds2.9a10/lib/domains/campus/txt/ai/charles/
ds2.9a10/lib/domains/campus/txt/ai/charles/bak2/
ds2.9a10/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.9a10/lib/domains/campus/txt/ai/charly/
ds2.9a10/lib/domains/campus/txt/ai/charly/bak/
ds2.9a10/lib/domains/campus/txt/jenny/
ds2.9a10/lib/domains/default/creator/
ds2.9a10/lib/domains/default/doors/
ds2.9a10/lib/domains/default/etc/
ds2.9a10/lib/domains/default/vehicles/
ds2.9a10/lib/domains/default/virtual/
ds2.9a10/lib/domains/default/weap/
ds2.9a10/lib/domains/town/txt/shame/
ds2.9a10/lib/domains/town/virtual/
ds2.9a10/lib/domains/town/virtual/bottom/
ds2.9a10/lib/domains/town/virtual/space/
ds2.9a10/lib/estates/
ds2.9a10/lib/ftp/
ds2.9a10/lib/lib/comp/
ds2.9a10/lib/lib/daemons/
ds2.9a10/lib/lib/daemons/include/
ds2.9a10/lib/lib/lvs/
ds2.9a10/lib/lib/user/
ds2.9a10/lib/lib/virtual/
ds2.9a10/lib/log/
ds2.9a10/lib/log/adm/
ds2.9a10/lib/log/archive/
ds2.9a10/lib/log/chan/
ds2.9a10/lib/log/errors/
ds2.9a10/lib/log/law/adm/
ds2.9a10/lib/log/law/email/
ds2.9a10/lib/log/law/names/
ds2.9a10/lib/log/law/sites-misc/
ds2.9a10/lib/log/law/sites-register/
ds2.9a10/lib/log/law/sites-tempban/
ds2.9a10/lib/log/law/sites-watch/
ds2.9a10/lib/log/open/
ds2.9a10/lib/log/reports/
ds2.9a10/lib/log/router/
ds2.9a10/lib/log/secure/
ds2.9a10/lib/log/watch/
ds2.9a10/lib/obj/book_source/
ds2.9a10/lib/obj/include/
ds2.9a10/lib/powers/prayers/
ds2.9a10/lib/powers/spells/
ds2.9a10/lib/realms/template/adm/
ds2.9a10/lib/realms/template/area/armor/
ds2.9a10/lib/realms/template/area/npc/
ds2.9a10/lib/realms/template/area/obj/
ds2.9a10/lib/realms/template/area/room/
ds2.9a10/lib/realms/template/area/weap/
ds2.9a10/lib/realms/template/bak/
ds2.9a10/lib/realms/template/cmds/
ds2.9a10/lib/save/kills/o/
ds2.9a10/lib/secure/cfg/classes/
ds2.9a10/lib/secure/cmds/builders/
ds2.9a10/lib/secure/cmds/creators/include/
ds2.9a10/lib/secure/cmds/players/
ds2.9a10/lib/secure/cmds/players/include/
ds2.9a10/lib/secure/daemon/imc2server/
ds2.9a10/lib/secure/daemon/include/
ds2.9a10/lib/secure/lib/
ds2.9a10/lib/secure/lib/include/
ds2.9a10/lib/secure/lib/net/include/
ds2.9a10/lib/secure/lib/std/
ds2.9a10/lib/secure/log/adm/
ds2.9a10/lib/secure/log/bak/
ds2.9a10/lib/secure/log/intermud/
ds2.9a10/lib/secure/log/network/
ds2.9a10/lib/secure/modules/
ds2.9a10/lib/secure/npc/
ds2.9a10/lib/secure/obj/include/
ds2.9a10/lib/secure/room/
ds2.9a10/lib/secure/save/
ds2.9a10/lib/secure/save/backup/
ds2.9a10/lib/secure/save/boards/
ds2.9a10/lib/secure/tmp/
ds2.9a10/lib/secure/upgrades/files/
ds2.9a10/lib/secure/verbs/creators/
ds2.9a10/lib/std/board/
ds2.9a10/lib/std/lib/
ds2.9a10/lib/tmp/
ds2.9a10/lib/verbs/admins/include/
ds2.9a10/lib/verbs/builders/
ds2.9a10/lib/verbs/common/
ds2.9a10/lib/verbs/common/include/
ds2.9a10/lib/verbs/creators/
ds2.9a10/lib/verbs/creators/include/
ds2.9a10/lib/verbs/rooms/
ds2.9a10/lib/verbs/rooms/include/
ds2.9a10/lib/www/client/
ds2.9a10/lib/www/errors/
ds2.9a10/lib/www/images/
ds2.9a10/lib/www/lpmuds/downloads_files/
ds2.9a10/lib/www/lpmuds/intermud_files/
ds2.9a10/lib/www/lpmuds/links_files/
ds2.9a10/win32/
diff -rNu fluffos-2.12-ic-patched/ChangeLog.fluffos-2.x fluffos/ChangeLog.fluffos-2.x
--- fluffos-2.12-ic-patched/ChangeLog.fluffos-2.x	2008-07-08 09:45:15.166943000 -0400
+++ fluffos/ChangeLog.fluffos-2.x	2008-07-08 01:01:20.254753000 -0400
@@ -1,5 +1,10 @@
 As MudOS is moving too slow to keep our driver hacks apart, we now call our own
 FluffOS :)
+FluffOS 2.13:
+Added a console, mostly for debugging use.  If driver is started directly
+	 rather than through a script, add argument -C and it has a 
+        command-line.  try 'help'.  HAS_CONSOLE must be defined in
+        local_options. (hamlet)
 FluffOS 2.12:
 rework of ed to do larger output chunks, more configurability, and bugfixes:
 	mixed receive_ed(string msg, string fname) apply in playerob to 
diff -rNu fluffos-2.12-ic-patched/GNUmakefile fluffos/GNUmakefile
--- fluffos-2.12-ic-patched/GNUmakefile	2008-07-08 09:41:55.351273000 -0400
+++ fluffos/GNUmakefile	2008-07-08 09:33:49.665213000 -0400
@@ -74,7 +74,7 @@
   socket_efuns.c socket_ctrl.c qsort.c eoperators.c socket_err.c md.c \
   disassembler.c binaries.c uvalarm.c $(STRFUNCS) \
   replace_program.c master.c function.c \
-  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c
+  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c console.c
 
 all: $(OBJDIR) cc.h main_build
 main_build2: $(DRIVER_BIN) addr_server portbind
diff -rNu fluffos-2.12-ic-patched/GNUmakefile.in fluffos/GNUmakefile.in
--- fluffos-2.12-ic-patched/GNUmakefile.in	2008-07-08 09:41:58.184937000 -0400
+++ fluffos/GNUmakefile.in	2008-04-30 12:56:34.077917000 -0400
@@ -58,7 +58,7 @@
   socket_efuns.c socket_ctrl.c qsort.c eoperators.c socket_err.c md.c \
   disassembler.c binaries.c uvalarm.c $(STRFUNCS) \
   replace_program.c master.c function.c \
-  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c
+  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c console.c
 
 all: $(OBJDIR) cc.h main_build
 main_build2: $(DRIVER_BIN) addr_server portbind
diff -rNu fluffos-2.12-ic-patched/Makefile.in fluffos/Makefile.in
--- fluffos-2.12-ic-patched/Makefile.in	2008-07-08 09:41:56.456057000 -0400
+++ fluffos/Makefile.in	2008-04-30 12:56:18.734113000 -0400
@@ -61,7 +61,7 @@
   socket_efuns.c socket_ctrl.c qsort.c eoperators.c socket_err.c md.c \
   disassembler.c binaries.c uvalarm.c $(STRFUNCS) \
   replace_program.c ccode.c cfuns.c compile_file.c master.c function.c \
-  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c
+  debug.c crypt.c applies_table.c add_action.c eval.c fliconv.c console.c
 
 all: cc.h files main_build
 
diff -rNu fluffos-2.12-ic-patched/add_action.c fluffos/add_action.c
--- fluffos-2.12-ic-patched/add_action.c	2008-07-08 09:41:54.060489000 -0400
+++ fluffos/add_action.c	2008-04-17 14:40:52.740606000 -0400
@@ -227,7 +227,7 @@
 	return;
 
     debug(d_flag, ("Enable commands /%s (ref %d)",
-		   current_object->name, current_object->ref));
+		   current_object->obname, current_object->ref));
 
     if (num) {
 	current_object->flags |= O_ENABLE_COMMANDS;
@@ -266,7 +266,7 @@
     int where;
     int save_illegal_sentence_action;
     
-    debug(d_flag, ("cmd [/%s]: %s\n", command_giver->name, buff));
+    debug(d_flag, ("cmd [/%s]: %s\n", command_giver->obname, buff));
 
     /* strip trailing spaces. */
     for (p = buff + strlen(buff) - 1; p >= buff; p--) {
diff -rNu fluffos-2.12-ic-patched/comm.c fluffos/comm.c
--- fluffos-2.12-ic-patched/comm.c	2008-07-08 09:45:15.177956000 -0400
+++ fluffos/comm.c	2008-07-08 00:09:03.250964000 -0400
@@ -14,6 +14,7 @@
 #include "master.h"
 #include "add_action.h"
 #include "eval.h"
+#include "console.h"
 
 #define TELOPT_COMPRESS 85
 #define TELOPT_COMPRESS2 86
@@ -87,7 +88,7 @@
 static void start_compression (interactive_t *);
 static int send_compressed (interactive_t *ip, unsigned char* data, int length);
 
-
+extern void restore_sigttin(void);
 
 #ifdef NO_SNOOP
 #  define handle_snoop(str, len, who)
@@ -128,6 +129,10 @@
 interactive_t **all_users = 0;
 int max_users = 0;
 
+#ifdef HAS_CONSOLE
+int has_console = -1;
+#endif
+
 /*
  * private local variables.
  */
@@ -1400,6 +1405,11 @@
      */
     FD_ZERO(&readmask);
     FD_ZERO(&writemask);
+#ifdef HAS_CONSOLE
+    /* set up a console */
+    if(has_console > 0)
+      FD_SET(STDIN_FILENO, &readmask);
+#endif
     /*
      * set new user accept fd in readmask.
      */
@@ -1501,6 +1511,31 @@
             hname_handler();
         }
     }
+    
+#ifdef HAS_CONSOLE
+    /* Process console input */
+    /* Note: need the has_console on the next line because linux (at least)
+             recycles fds, even STDIN_FILENO
+    */
+    if((has_console > 0) && FD_ISSET(STDIN_FILENO, &readmask)) {
+      char s[1024];
+      int sz;
+
+      if((sz = read(STDIN_FILENO, s, 1023)) > 0) {
+        s[sz-1] = '\0';
+        console_command(s);
+      }
+      else if(sz == 0) {
+        printf("Console exiting.  The MUD remains.\n");
+        has_console = 0;
+      }
+      else {
+        printf("Console read error: %d %d.  Closing console.\n", sz, errno);
+        has_console = 0;
+        restore_sigttin();
+      }
+    }
+#endif
 }
 
 /*
diff -rNu fluffos-2.12-ic-patched/comm.h fluffos/comm.h
--- fluffos-2.12-ic-patched/comm.h	2008-07-08 09:41:57.099058000 -0400
+++ fluffos/comm.h	2008-07-08 00:07:46.486919000 -0400
@@ -177,6 +177,9 @@
 
 extern interactive_t **all_users;
 extern int max_users;
+#ifdef HAS_CONSOLE
+extern int has_console;
+#endif
 
 void CDECL add_vmessage (object_t *, const char *, ...);
 void add_message (object_t *, const char *, int);
diff -rNu fluffos-2.12-ic-patched/compiler.h fluffos/compiler.h
--- fluffos-2.12-ic-patched/compiler.h	2008-07-08 09:41:56.256204000 -0400
+++ fluffos/compiler.h	2008-04-27 14:26:14.173427000 -0400
@@ -109,7 +110,7 @@
 extern unsigned short *comp_def_index_map;
 extern unsigned short *func_index_map;
 
-typedef struct compiler_temp_t {
+typedef struct compiler_temp_s {
     unsigned short flags;
     unsigned short offset;
     unsigned short function_index_offset;
@@ -118,7 +119,7 @@
         function_t *func;
         long index;
     } u;
-    struct compiler_temp_t *next;
+    struct compiler_temp_s *next;
 } compiler_temp_t;
 
 /*
diff -rNu fluffos-2.12-ic-patched/console.c fluffos/console.c
--- fluffos-2.12-ic-patched/console.c	1969-12-31 19:00:00.000000000 -0500
+++ fluffos/console.c	2008-07-08 00:53:05.431408000 -0400
@@ -0,0 +1,292 @@
+/*
+ *  console.c -- implements a command-line for the driver.
+ *               Separate file because this is likely to grow with time.
+ *               Note that the intent is NOT to have a full scripting language,
+ *               since that's, er, what LPC is.  This is to implement driver
+ *               inspection that is difficult or impossible from inside the
+ *               mud.  Because of this, explicit allocation of things is
+ *               probably a bad idea: use automatic stack variables as much
+ *               as is possible.
+ *               Isaac Charles (Hamlet@Discworld, etc) -- Jul 2008
+ */
+
+#include "std.h"
+
+#ifdef HAS_CONSOLE
+#include "comm.h"
+#include "object.h"
+#include "dumpstat.h"
+
+#define NAME_LEN 50
+
+typedef struct {
+  char name[NAME_LEN + 1];
+  int cpy;
+  int ref;
+  long mem;
+  long idle;
+} ITEMS;
+  
+static int strcmpalpha(const char *aname, const char *bname);
+static int objcmpalpha(const void *, const void *);
+static int itemcmpsize(const void *, const void *);
+static int objcmpsize(const void *, const void *);
+static int objcmpidle(const void *, const void *);
+
+static INLINE void print_obj(int refs, int cpy, const char *obname, long lastref, 
+                             long sz) {
+  printf("%4d %4d %-*s %5ld %10ld\n", refs, cpy, NAME_LEN, 
+                                    obname, ((long)time(0) - lastref), sz);
+}
+
+void console_command(char *s) {
+  char verb[11];
+  char args[2][11];
+  int numargs, num[2];
+  
+  if(strlen(s) > 0) {
+    if(strncmp(s, "quit", strlen(s)) == 0) {
+      (void) puts("Console closing.  The mud remains.");
+      //(void) fclose(stdin);
+      has_console = 0;
+      restore_sigttin();
+    }
+    else if(strncmp(s, "shutdown", ((strlen(s) > 4) ? strlen(s) : 4)) == 0) {
+      (void) puts("Mud ending now.");
+      shutdownMudOS(0);
+      return;
+    }
+    else if(strncmp(s, "help", strlen(s)) == 0) {
+      (void) puts(
+"Console Help\n\
+    quit       Close the console (the MUD remains)\n\
+    shutdown   End the mud (rapidly)\n\
+    help       This.\n\
+    objects    Show a listing of all active objects.  Format:\n\
+               objects [qualifier] [val|range]\n\
+               qualifiers are:\n\
+                 alpha    sort objects alphabetically\n\
+                 size     sort objects by (reverse) size\n\
+                 idle     sort objects by (reverse) idle time\n\
+                 totals   sum together usage of all clones of an obj and\n\
+                          display in reverse order of size\n\
+               val is a number, specifying number of objects to show,\n\
+               from the beginning (positive) or from the end (negative).\n\
+               range is st..fin where st and fin can be number of objects\n\
+               from the beginning (positive) or from the end (negative.)\
+");
+    }
+    else { // commands that can be followed by args
+      num[0] = 0;
+      num[1] = INT_MAX;
+      
+      if((numargs = sscanf(s, "%10s %10s %10s", verb, args[0], args[1]) - 1) 
+         >= 1) {
+        int tmp;
+        char *pos = args[numargs-1];
+        
+        while((pos = strchr(pos, '<')) != NULL)
+          *pos++ = '-';
+        
+        if((tmp = sscanf(args[numargs-1], "%d..%d", &num[0], &num[1])) == 2) {
+        }
+        else if(tmp == 1) {
+          if(args[numargs-1][strlen(args[numargs-1])-1] != '.') {
+            if(num[0] == 0) {
+              num[0] = num[1] = 0;
+            }
+            else if(num[0] > 0) {
+              num[1] = num[0] - 1;
+              num[0] = 0;
+            }
+          }
+        }
+        
+        if(tmp)
+          numargs--;              
+      }
+        
+      if(strncmp(verb, "objects", strlen(verb)) == 0) {
+        object_t **list;
+        int count;
+        int i;
+        long totsz = 0, sz;
+        char TOTALS = (char) 0;
+  
+        // get_objects() allocates a string and pushes it onto the stack.
+        // probably not a problem here as long as we remember to pop it.
+        get_objects(&list, &count, 0, 0);
+
+        if(numargs) {
+          if(strncmp("alpha", args[0], strlen(args[0])) == 0)
+            qsort(list, (size_t) count, sizeof(object_t *), objcmpalpha);
+          else if(strncmp("size", args[0], strlen(args[0])) == 0)
+            qsort(list, (size_t) count, sizeof(object_t *), objcmpsize);
+          else if(strncmp("idle", args[0], strlen(args[0])) == 0)
+            qsort(list, (size_t) count, sizeof(object_t *), objcmpidle);
+          else { /* This should be "totals" */
+            TOTALS = (char) 1;
+            qsort(list, (size_t) count, sizeof(object_t *), objcmpalpha);
+          }
+        }
+        
+        printf("%4s %4s %-*s %5s %10s\n", "Rf", "Cpy", NAME_LEN, "Obj", 
+                                          "Idle", "Size");
+          
+        if(TOTALS && (count > 1)) {
+          ITEMS it[count+1];
+          int lst = 0;
+          char *pound;
+          //char tmpnam[NAME_LEN + 1];
+          
+          memset(it, 0, (count+1) * sizeof(ITEMS));
+
+          for(i=0; i < count; i++) {
+            if(strcmpalpha(it[lst].name, list[i]->obname)
+               != 0) {
+              lst++;
+            
+              strncpy(it[lst].name, list[i]->obname + 
+                                    ((strlen(list[i]->obname) > NAME_LEN) ?
+                                     (strlen(list[i]->obname) - NAME_LEN) : 0)
+                                  , NAME_LEN);
+              pound = strchr(it[lst].name, '#');
+              if(pound != NULL)
+                *pound = '\0';
+            }
+              
+            it[lst].cpy++;
+            it[lst].ref += list[i]->ref;
+            it[lst].mem += list[i]->prog->total_size + data_size(list[i]) +
+                           sizeof(object_t);
+            if(((long)list[i]->time_of_ref < it[lst].idle) || !it[lst].idle)
+              it[lst].idle = (long) list[i]->time_of_ref;
+          }
+          
+          qsort(it+1, (size_t) lst, sizeof(ITEMS), itemcmpsize);
+
+          if(num[0] >= lst)
+            num[0] = lst - 1;
+          else if(num[0] < 0) {
+            num[0] = lst + num[0];
+            if(num[0] < 0)
+              num[0] = 0;
+          }
+          num[0]++;
+          
+          if(num[1] >= lst)
+            num[1] = lst - 1;
+          else if(num[1] < 0) {
+            num[1] = lst + num[1];
+            if(num[1] < 0)
+              num[1] = 0;
+          }
+          num[1]++;
+          
+          for(i=num[0]; i<=num[1]; i++) {
+            print_obj(it[i].ref, it[i].cpy, it[i].name, it[i].idle, 
+                       it[i].mem);
+            totsz += it[i].mem;
+          }
+        }
+        else { // no totals needed
+          if(num[0] >= count)
+            num[0] = count - 1;
+          else if(num[0] < 0) {
+            num[0] = count + num[0];
+            if(num[0] < 0)
+              num[0] = 0;
+          }
+          if(num[1] >= count)
+            num[1] = count - 1;
+          else if(num[1] < 0) {
+            num[1] = count + num[1];
+            if(num[1] < 0)
+              num[1] = 0;
+          }
+        
+          for(i = num[0]; i <= num[1]; i++) {
+            print_obj((int)list[i]->ref, 1, list[i]->obname, 
+                      (long) list[i]->time_of_ref,
+                      sz = (long) list[i]->prog->total_size + 
+                           (long)data_size(list[i]) +
+                           (long)sizeof(object_t));
+            totsz += sz;
+          }
+        }
+
+        printf("%4s %4s %-*s %5s %10s\n", "", "", NAME_LEN, "-----", "-----", 
+                                           "----------");
+        printf("%4s %4s %*d %-5s %10ld\n", "", "", NAME_LEN, 1+num[1]-num[0], 
+                                          "objs", totsz);
+        pop_stack();
+      }
+      else {
+        (void) puts("Unknown command.");
+      }
+    }
+  }
+  
+  if(has_console > 0) {
+    (void) putchar('?'); (void) putchar(' ');
+    (void) fflush(stdout);
+  }
+}
+
+static int strcmpalpha(const char *aname, const char *bname) {
+  for(;(*aname == *bname) && (*aname != '#') && (*bname != '#') &&
+       (*aname != '\0') && (*bname != '\0'); aname++, bname++); /* ; */
+  
+  if(*aname == '#') {
+    if((*bname != '#') && (*bname != '\0'))
+      return 1;
+    return 0;
+  }
+  if(*bname == '#') {
+    if(*aname == '\0')
+      return 0;
+    return -1;
+  }
+  
+  return (int) (*aname - *bname);
+}
+
+static int objcmpalpha(const void *a, const void *b) {
+  const char *aname = (*((object_t **) a))->obname;
+  const char *bname = (*((object_t **) b))->obname;
+
+  return strcmpalpha(aname, bname);
+}
+
+static int itemcmpsize(const void *a, const void *b) {
+  long asz = (*((ITEMS *) a)).mem;
+  long bsz = (*((ITEMS *) b)).mem;
+  
+  if(asz == bsz)
+    return strcmpalpha((*((ITEMS *) a)).name, (*((ITEMS *) b)).name);
+  
+  return (int) (bsz - asz);
+}
+
+static int objcmpsize(const void *a, const void *b) {
+  object_t *aobj = (*((object_t **) a));
+  object_t *bobj = (*((object_t **) b));
+  int asz = aobj->prog->total_size + data_size(aobj);
+  int bsz = bobj->prog->total_size + data_size(bobj);
+  
+  if(asz == bsz)
+    return objcmpalpha(a, b);
+    
+  return bsz - asz;
+}
+
+static int objcmpidle(const void *a, const void *b) {
+  int arft = (*((object_t **) a))->time_of_ref;
+  int brft = (*((object_t **) b))->time_of_ref;
+  
+  if(arft == brft)
+    return objcmpalpha(a, b);
+    
+  return arft - brft;
+}
+#endif
diff -rNu fluffos-2.12-ic-patched/console.h fluffos/console.h
--- fluffos-2.12-ic-patched/console.h	1969-12-31 19:00:00.000000000 -0500
+++ fluffos/console.h	2008-07-08 00:48:27.206602000 -0400
@@ -0,0 +1,16 @@
+/*
+ * console.h -- definitions and prototypes for console.c
+ *
+ */
+
+#ifndef CONSOLE_H
+#define CONSOLE_H
+
+#include "options_incl.h"
+
+#ifdef HAS_CONSOLE
+extern void console_command(char *);
+#endif
+
+#endif
+
diff -rNu fluffos-2.12-ic-patched/ed.c fluffos/ed.c
--- fluffos-2.12-ic-patched/ed.c	2008-07-08 09:45:15.328942000 -0400
+++ fluffos/ed.c	2008-05-12 23:53:03.393042000 -0400
@@ -498,7 +498,7 @@
 
 /*      doprnt.c        */
 static int doprnt (int from, int to)
-{   svalue_t *ret;
+{   
 #if (BUFFER_SIZE) > (ED_MAXLINE)
     char outbf[BUFFER_SIZE];
 #else
diff -rNu fluffos-2.12-ic-patched/local_options fluffos/local_options
--- fluffos-2.12-ic-patched/local_options	2008-07-08 09:41:58.538775000 -0400
+++ fluffos/local_options	2008-07-08 00:37:11.483780000 -0400
@@ -593,6 +593,16 @@
  */
 #define REF_RESERVED_WORD
 
+/* HAS_CONSOLE: If defined, the driver can take the argument -C
+ *   which will give the driver an interactive console (you can type
+ *   commands at the terminal.)  Backgrounding the driver will turn off
+ *   the console, but sending signal SIGTTIN (kill -21) to the driver can
+ *   turn it back on.  Typing 'help' will display commands available.
+ *   The intent is to allow the inspection of things that are difficult
+ *   to inspect from inside the mud.
+ */
+#define HAS_CONSOLE
+
 /****************************************************************************
  *                              PACKAGES                                    *
  *                              --------                                    *
diff -rNu fluffos-2.12-ic-patched/macros.h fluffos/macros.h
--- fluffos-2.12-ic-patched/macros.h	2008-07-08 09:41:58.138920000 -0400
+++ fluffos/macros.h	2008-05-19 15:16:10.450235000 -0400
@@ -216,7 +216,7 @@
 #endif
 
 #ifndef _FUNC_SPEC_
-   char *xalloc (int);
+   char *xalloc (size_t);
 #  ifdef DEBUGMALLOC
       char *int_string_copy (const char * const, char *);
       char *int_string_unlink (const char *, char *);
diff -rNu fluffos-2.12-ic-patched/main.c fluffos/main.c
--- fluffos-2.12-ic-patched/main.c      2008-07-08 09:41:55.659199000 -0400
+++ fluffos/main.c      2008-07-08 10:53:16.080149000 -0400
@@ -24,11 +24,11 @@
 int max_cost;
 int time_to_clean_up;
 const char *default_fail_message;
-int boot_time;
+long boot_time;
 int max_array_size;
 int max_buffer_size;
 int max_string_length;
-static int reserved_size;
+static size_t reserved_size;
 char *reserved_area;    /* reserved for MALLOC() */
 static char *mud_lib;

@@ -49,6 +49,9 @@

 static void CDECL sig_fpe SIGPROT;
 static void CDECL sig_cld SIGPROT;
+#ifdef HAS_CONSOLE
+static void CDECL sig_ttin SIGPROT;
+#endif

 #ifdef TRAP_CRASHES
 static void CDECL sig_usr1 SIGPROT;
@@ -127,8 +130,8 @@
      * Check that the definition of EXTRACT_UCHAR() is correct.
      */
     p = (char *) &i;
-    *p = -10;
-    if (EXTRACT_UCHAR(p) != 0x100 - 10) {
+    *p = (char) -10;
+    if (EXTRACT_UCHAR(p) != (unsigned char) (0x100 - 10)) {
   fprintf(stderr, "Bad definition of EXTRACT_UCHAR() in interpret.h.\n");
   exit(-1);
     }
@@ -234,7 +237,7 @@
 #endif
     time_to_clean_up = TIME_TO_CLEAN_UP;
     max_cost = MAX_COST;
-    reserved_size = RESERVED_SIZE;
+    reserved_size = (size_t) RESERVED_SIZE;
     max_array_size = MAX_ARRAY_SIZE;
     if(max_array_size > 65535){
       fprintf(stderr, "Maximum array size can not exceed 65535");
@@ -246,7 +249,7 @@
     set_inc_list(INCLUDE_DIRS);
     if (reserved_size > 0)
   reserved_area = (char *) DMALLOC(reserved_size, TAG_RESERVED, "main.c: reserved_area");
-    for (i = 0; i < sizeof consts / sizeof consts[0]; i++)
+    for (i = 0; i < (int) (sizeof consts / sizeof consts[0]); i++)
   consts[i] = exp(-i / 900.0);
     reset_machine(1);
     /*
@@ -272,6 +275,11 @@
   case 'N':
       no_ip_demon++;
       continue;
+#ifdef HAS_CONSOLE
+  case 'C':
+      has_console = 1;
+      continue;
+#endif
 #ifdef YYDEBUG
   case 'y':
       yydebug = 1;
@@ -332,6 +340,7 @@
       case 'N':
       case 'm':
       case 'y':
+      case 'C':
     continue;
       case 'f':
     save_context(&econ);
@@ -425,6 +434,13 @@
     signal(SIGCLD, sig_cld);
 #endif
 #endif
+
+#ifdef HAS_CONSOLE
+    if(has_console >= 0)
+      signal(SIGTTIN, sig_ttin);
+    signal(SIGTTOU, SIG_IGN);
+#endif
+
     backend();
     return 0;
 }
@@ -439,7 +455,7 @@
     int len;

     DEBUG_CHECK(!str, "Null string passed to string_copy.\n");
-    len = strlen(str);
+    len = (int) strlen(str);
     if (len > max_string_length) {
   len = max_string_length;
   p = new_string(len, desc);
@@ -464,7 +480,7 @@
     mbt->ref--;

     if (mbt->size == USHRT_MAX) {
-  int l = strlen(str + USHRT_MAX) + USHRT_MAX; /* ouch */
+  size_t l = strlen(str + USHRT_MAX) + USHRT_MAX; /* ouch */

   newmbt = (malloc_block_t *)DXALLOC(l + sizeof(malloc_block_t) + 1, TAG_MALLOC_STRING, desc);
   memcpy((char *)(newmbt + 1), (char *)(mbt + 1), l+1);
@@ -495,9 +511,10 @@
    * check whether config file specified this option
    */
   if (strlen(DEBUG_LOG_FILE))
-      sprintf(deb, "%s/%s", LOG_DIR, DEBUG_LOG_FILE);
+      snprintf(deb, 1023, "%s/%s", LOG_DIR, DEBUG_LOG_FILE);
   else
-      sprintf(deb, "%s/debug.log", LOG_DIR);
+      snprintf(deb, 1023, "%s/debug.log", LOG_DIR);
+  deb[1023] = '\0';
   while (*deb == '/')
       deb++;
   debug_message_fp = fopen(deb, "w");
@@ -522,7 +539,8 @@

 int slow_shut_down_to_do = 0;

-char *xalloc (int size)
+/*@null@*/
+char *xalloc (size_t size)
 {
     char *p;
     const char *t;
@@ -570,6 +588,38 @@
     signal(SIGFPE, sig_fpe);
 }

+#ifdef HAS_CONSOLE
+void restore_sigttin(void) {
+  if(has_console >= 0)
+    signal(SIGTTIN, sig_ttin);
+}
+
+/* The console goes to sleep when backgrounded and can
+ * be woken back up with kill -SIGTTIN <pid>
+ */
+static void CDECL PSIG(sig_ttin)
+{   char junk[1024];
+    int fl;
+
+    has_console = !has_console;
+
+    signal(SIGTTIN, SIG_IGN);
+
+    if(has_console) {
+      /* now eat all the gibberish they typed in the console when it was dead */
+      fl = fcntl(STDIN_FILENO, F_GETFL);
+      fcntl(STDIN_FILENO, F_SETFL, fl | O_NONBLOCK);
+
+      while(read(STDIN_FILENO, junk, 1023) > 0);  /* ; */
+
+      /* leaving the output nonblocking is a bad idea.  large outputs tend
+         to get truncated.
+      */
+      fcntl(STDIN_FILENO, F_SETFL, fl);
+    }
+}
+#endif
+
 #ifdef TRAP_CRASHES

 /* send this signal when the machine is about to reboot.  The script
diff -rNu fluffos-2.12-ic-patched/main.h fluffos/main.h
--- fluffos-2.12-ic-patched/main.h	2008-07-08 09:41:56.429057000 -0400
+++ fluffos/main.h	2008-05-19 14:53:02.984152000 -0400
@@ -34,7 +34,7 @@
 extern int comp_flag;
 extern int time_to_clean_up;
 extern const char *default_fail_message;
-extern int boot_time;
+extern long boot_time;
 extern int max_cost;
 extern int max_array_size;
 extern int max_buffer_size;
diff -rNu fluffos-2.12-ic-patched/mapping.h fluffos/mapping.h
--- fluffos-2.12-ic-patched/mapping.h	2008-07-08 09:41:54.464345000 -0400
+++ fluffos/mapping.h	2008-05-19 14:14:01.085058000 -0400
@@ -10,17 +10,17 @@
 #include "hash.h"
 #include "stralloc.h"
 //#define MAP_SVAL_HASH(x) (((POINTER_INT)((x).u.number)) >> 5)
-static long sval_hash(svalue_t x){
+static unsigned long sval_hash(svalue_t x){
     switch(x.type)
     {
         case T_STRING:
             return HASH(BLOCK(x.u.string));
         case T_NUMBER:
-            return x.u.number;
+            return (unsigned long) x.u.number;
         case T_OBJECT:
             //return HASH(BLOCK(x.u.ob->obname));
         default:
-            return (((POINTER_INT)((x).u.number)) >> 5);
+            return ((unsigned long)((POINTER_INT)((x).u.number)) >> 5);
     }
 }
 
diff -rNu fluffos-2.12-ic-patched/md.c fluffos/md.c
--- fluffos-2.12-ic-patched/md.c	2008-07-08 09:41:54.211486000 -0400
+++ fluffos/md.c	2008-05-05 12:21:05.303808000 -0400
@@ -8,6 +8,7 @@
 #include "simul_efun.h"
 #include "call_out.h"
 #include "mapping.h"
+#include "simulate.h"
 #if defined(PACKAGE_SOCKETS) || defined(PACKAGE_EXTERNAL)
 #include "socket_efuns.h"
 #endif
diff -rNu fluffos-2.12-ic-patched/object.c fluffos/object.c
--- fluffos-2.12-ic-patched/object.c	2008-07-08 09:41:56.288199000 -0400
+++ fluffos/object.c	2008-06-27 00:02:43.466401000 -0400
@@ -1880,6 +1880,7 @@
     tot_alloc_object++;
     tot_alloc_object_size += size;
     ob = (object_t *) DXALLOC(size, TAG_OBJECT, "get_empty_object");
+
     /*
      * marion Don't initialize via memset, this is incorrect. E.g. the bull
      * machines have a (char *)0 which is not zero. We have structure
diff -rNu fluffos-2.12-ic-patched/options.h fluffos/options.h
--- fluffos-2.12-ic-patched/options.h	2008-07-08 09:45:15.378944000 -0400
+++ fluffos/options.h	2008-07-08 00:36:41.822008000 -0400
@@ -592,6 +592,16 @@
  */
 #define REF_RESERVED_WORD
 
+/* HAS_CONSOLE: If defined, the driver can take the argument -C
+ *   which will give the driver an interactive console (you can type
+ *   commands at the terminal.)  Backgrounding the driver will turn off
+ *   the console, but sending signal SIGTTIN (kill -21) to the driver can
+ *   turn it back on.  Typing 'help' will display commands available.
+ *   The intent is to allow the inspection of things that are difficult
+ *   to inspect from inside the mud.
+ */
+#define HAS_CONSOLE
+ 
 /****************************************************************************
  *                              PACKAGES                                    *
  *                              --------                                    *
diff -rNu fluffos-2.12-ic-patched/packages/parser.c fluffos/packages/parser.c
--- fluffos-2.12-ic-patched/packages/parser.c	2008-07-08 09:41:54.763349000 -0400
+++ fluffos/packages/parser.c	2008-05-05 12:10:08.755911000 -0400
@@ -1014,7 +1014,7 @@
     return he;
 }
 
-void mark_hash_entry (char * str) {
+void mark_hash_entry (const char * str) {
     int h = DO_HASH(str, HASH_SIZE);
     hash_entry_t *he;
 
diff -rNu fluffos-2.12-ic-patched/program.h fluffos/program.h
--- fluffos-2.12-ic-patched/program.h	2008-07-08 09:41:57.734914000 -0400
+++ fluffos/program.h	2008-06-26 17:25:04.514186000 -0400
@@ -200,7 +200,7 @@
     unsigned short flags;
     unsigned short last_inherited;
     unsigned short ref;                 /* Reference count */
-    unsigned short func_ref;
+    unsigned int func_ref;
 #ifdef DEBUG
     int extra_ref;              /* Used to verify ref count */
     int extra_func_ref;
diff -rNu fluffos-2.12-ic-patched/simulate.c fluffos/simulate.c
--- fluffos-2.12-ic-patched/simulate.c	2008-07-08 09:45:15.405946000 -0400
+++ fluffos/simulate.c	2008-06-26 17:04:32.928304000 -0400
@@ -525,10 +525,10 @@
 
 static char *make_new_name (const char * str)
 {
-    static int i;
-    char *p = (char *)DXALLOC(strlen(str) + 10, TAG_OBJ_NAME, "make_new_name");
+    static unsigned int i;
+    char *p = (char *)DXALLOC(strlen(str) + 12, TAG_OBJ_NAME, "make_new_name");
 
-    (void) sprintf(p, "%s#%d", str, i);
+    (void) sprintf(p, "%s#%u", str, i);
     i++;
     return p;
 }
diff -rNu fluffos-2.12-ic-patched/smalloc.c fluffos/smalloc.c
--- fluffos-2.12-ic-patched/smalloc.c	2008-07-08 09:41:56.428059000 -0400
+++ fluffos/smalloc.c	2008-05-17 12:22:44.890022000 -0400
@@ -108,7 +108,7 @@
 static char *esbrk (u);
 static int resort_free_list (void);
 #ifdef DEBUG
-static void walk_new_small_malloced (void (* ()));
+static void walk_new_small_malloced (void (*func) (POINTER, int));
 #endif
 
 #define s_size_ptr(p)	(p)
@@ -1041,7 +1041,7 @@
     static char *current_break = 0;
 
     if (current_break == 0)
-	current_break = sbrkx(0);
+	current_break = (char *) sbrkx(0);
     if (brk(current_break + size) == -1)
 	return 0;
 
@@ -1414,7 +1414,6 @@
 /*
  * Functions below can be used to debug malloc.
  */
-
 static void walk_new_small_malloced(func)
     void (*func) (POINTER, int);
 {
diff -rNu fluffos-2.12-ic-patched/sprintf.c fluffos/sprintf.c
--- fluffos-2.12-ic-patched/sprintf.c	2008-07-08 09:41:55.685199000 -0400
+++ fluffos/sprintf.c	2008-05-22 09:57:25.466973000 -0400
@@ -509,7 +509,7 @@
             break;
         }
     default:
-        outbuf_add(outbuf, "!ERROR: GARBAGE SVALUE!");
+        outbuf_addv(outbuf, "!ERROR: GARBAGE SVALUE: %x!", obj->type);
     }                           /* end of switch (obj->type) */
     if (trailing)
         outbuf_add(outbuf, ",\n");
diff -rNu fluffos-2.12-ic-patched/std.h fluffos/std.h
--- fluffos-2.12-ic-patched/std.h	2008-07-08 09:41:57.412928000 -0400
+++ fluffos/std.h	2008-05-05 14:12:43.754910000 -0400
@@ -31,6 +31,10 @@
 #endif
 #include "debug.h"
 
+#ifdef DEBUGMALLOC_EXTENSIONS
+#   define DEBUG
+#endif
+
 #endif
 
 
diff -rNu fluffos-2.12-ic-patched/std_incl.h fluffos/std_incl.h
--- fluffos-2.12-ic-patched/std_incl.h	2008-07-08 09:41:50.550910000 -0400
+++ fluffos/std_incl.h	2008-05-19 15:04:50.054760000 -0400
@@ -1,6 +1,8 @@
 #if !defined(STD_INCL_H) && !defined(_FUNC_SPEC_)
 #define STD_INCL_H
 
+#include "configure.h"
+
 #ifdef INCL_STDLIB_H
 #  include <stdlib.h>
 #endif
@@ -117,7 +119,7 @@
 
 /* Note: This is now only used if _both_ USHRT_MAX and MAXSHORT fail to exist*/
 #ifndef USHRT_MAX
-#define USHRT_MAX ((1 << (sizeof(short)*8)) - 1)
+#define USHRT_MAX ((unsigned short)((1 << (sizeof(unsigned short)*8)) - 1))
 #endif
 
 #endif