dmuck0.15-beta/docs/muf/
dmuck0.15-beta/game/
dmuck0.15-beta/game/logs/
dmuck0.15-beta/game/muf/
dmuck0.15-beta/game/muf/text/
/*  Define a few local routines inside and outside of the MUCK stuff.         */
#include "config.h"
#include "interface.h"
#include "externs.h"
#include "params.h"

extern time_t time_started;

void do_fortune(__DO_PROTO)
{              
char *cmd = "/usr/data/pa1/af/games/fortune /usr/data/pa1/af/games/lib/dat";
char buf[BUFFER_LEN];
FILE *ptr;

  if ((ptr = popen(cmd, "r")) != NULL) {
     notify(player, player, "Your fortune is ........");
     while (fgets(buf, BUFFER_LEN, ptr) != NULL) {
           buf[strlen(buf) -1] = '\0';
           notify_nolisten(player, buf);
      }
      pclose(ptr); 
    }
}

void do_load(__DO_PROTO)
{
 char *cmd = "w", cmd2[BUFFER_LEN], buf[BUFFER_LEN];
 FILE *ptr, *ptr2;

if(!Wizard(player)) {
   notify(player, player, "Wizard command only. Take off eh!");
   return;
   }

 sprintf (cmd2, "%s%d", "ps -v", getpid());
    if ((ptr2 = popen(cmd2, "r")) != NULL) {
       notify(player, player, "MUCK process stats................. ");
       while (fgets(buf, BUFFER_LEN, ptr2) != NULL)  {
              buf[strlen(buf) -1] = '\0';
              notify_nolisten(player, buf);
            }
       pclose(ptr2);  
    }

   notify(player, player, " ");
   if ((ptr = popen(cmd, "r")) != NULL) {
      notify(player, player, "Overall host load.....");
      while (fgets(buf, BUFFER_LEN, ptr) != NULL) {
              buf[strlen(buf) -1] = '\0';
              notify_nolisten(player, buf);
            }
     pclose(ptr);  
    }
}

void do_prop_load(__DO_PROTO)
{
 int i;

  if(!God(player)) {
     notify(player, player, "Wizard command only. Take off eh!");
     return;
  }
#ifndef USE_DBP_STR

  for (i = 0; i < db_top; i++) {
     if (Typeof(i) != TYPE_GARBAGE) {

  DBFETCHPROP(i);

  if(GET_DESC(i))
     add_property(i, "desc", GET_DESC(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_SUCC(i))
     add_property(i, "succ", GET_SUCC(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_FAIL(i))
     add_property(i, "fail", GET_FAIL(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_DROP(i))
     add_property(i, "drop", GET_DROP(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_OSUCC(i))
     add_property(i, "osucc", GET_OSUCC(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_OFAIL(i))
     add_property(i, "ofail", GET_OFAIL(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

  if(GET_ODROP(i))
     add_property(i, "odrop", GET_ODROP(i), PERMS_COREAD | PERMS_COWRITE |
                  PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO); 

    }
  }
#endif
}

void dump_stats_on_close()
{
  int rooms = 0, exits = 0, things = 0, players = 0, programs = 0,
      total = 0, garbage = 0, frames = 0, pid = 0, psize = 0;
  dbref i;
  char *sitename;
  time_t downtime;

#ifdef HAVE_GETRUSAGE
  struct rusage usage;
#endif

    for (i = 0; i < db_top; i++)
    {
      switch(Typeof(i))
      {
        case TYPE_ROOM: total++; rooms++; break;
        case TYPE_EXIT: total++; exits++; break;
        case TYPE_THING: total++; things++;
          break;
        case TYPE_PLAYER: total++; players++;
          break;
        case TYPE_PROGRAM: total++; programs++; break;
        case TYPE_GARBAGE: total++; garbage++; break;
      }
    }

    fprintf(stderr,"Start time: %s", asctime(localtime(&time_started)));
    time(&downtime); 
    fprintf(stderr,"Down time : %s", asctime(localtime(&downtime)));

    fprintf(stderr, "\n%s stats at shutdown:\n", (sitename =
      get_property_data((dbref) 0, RWHO_NAME, ACCESS_WI)) ?
      sitename : "Universe");

    fprintf(stderr, " Rooms   : (%6.2f%%) %5d   Exits    : (%6.2f%%) %5d\n",
		DO_PERCENT(rooms),DO_PERCENT(exits));

    fprintf(stderr, " Things  : (%6.2f%%) %5d   Programs : (%6.2f%%) %5d\n",
		DO_PERCENT(things),DO_PERCENT(programs));

    fprintf(stderr, " Players : (%6.2f%%) %5d   Processes: (       ) %5d\n",
		DO_PERCENT(players), frames);

    fprintf(stderr, " Garbage : (%6.2f%%) %5d   Total    : (100.00%%) %5d\n\n",
		DO_PERCENT(garbage),total);

      pid=getpid();
#ifdef HAVE_GETPAGESIZE
      psize=getpagesize();
#endif
        fprintf(stderr, "Peak number of players...........%d\n", maxplayer);
	fprintf(stderr, "Process ID.......................%d\n", pid);

#ifdef HAVE_GETRUSAGE 
      if(getrusage(RUSAGE_SELF, &usage) != -1)
      {
	fprintf(stderr, "User time used (CPU secs)........%ld.%ld\n",
          usage.ru_utime.tv_sec, usage.ru_utime.tv_usec / 10000);
	fprintf(stderr, "System time used(CPU secs).......%ld.%ld\n",
          usage.ru_stime.tv_sec, usage.ru_stime.tv_usec / 10000);
#ifdef HAVE_GETPAGESIZE
	fprintf(stderr, "Resident memory (bytes)..........%ld\n",
          usage.ru_maxrss * psize);
#endif
	fprintf(stderr, "Page faults (No I/O).............%ld\n", 
                usage.ru_minflt);
	fprintf(stderr, "Page faults (I/O)................%ld\n", 
                usage.ru_majflt);
	fprintf(stderr, "Swapped..........................%ld\n", 
                usage.ru_nswap);
	fprintf(stderr, "Input services...................%ld\n", 
                usage.ru_inblock);
	fprintf(stderr, "Output services..................%ld\n", 
                usage.ru_oublock);
	fprintf(stderr, "Messages/Bytes sent..............%ld/%d\n", 
                usage.ru_msgsnd, 0);
	fprintf(stderr, "Messages/Bytes received..........%ld/%d\n", 
                usage.ru_msgrcv, 0);
	fprintf(stderr, "Signals received.................%ld\n", 
                usage.ru_nsignals);
	fprintf(stderr, "Voluntarily context switches.....%ld\n", 
                usage.ru_nvcsw);
	fprintf(stderr, "Involuntarily context switches...%ld\n", 
                usage.ru_nivcsw);
      }
#endif
}

void profile_users()
{
 descriptor_data *d;
 int i=0;

    for(d = descriptor_list; d; d = d->next) {
      if (d->connected)
          log_users("%s\n", d->hostname);
          i++;
    }

    log_status("USERS %d\n", i); 
}

#ifdef XEVENTS

#define MALLOC(result, type, number) \
  if (!((result) = (type *) malloc ((number) * sizeof (type)))) \
    panic("Out of memory"); \

void free_queue(descriptor_data *d)
{
  xque *tmp;

   if(!d->q) return;
   d->qcnt --;
   if (d->q->comm) free(d->q->comm);
   tmp = d->q->next;
   free(d->q);
   d->q = tmp;
}

void add_queue(descriptor_data *d, char *command)
{
  xque *tmp, *tmp2;      /* This code is HORRIBLY inefficient! */

    if(d->qcnt > MAX_XEVENTS)         /* Flush if we overfill */
      while(d->q) free_queue(d);

    if(d->connected) {        /* Don't let em spam us */
      while(*command && !isspace(*command)) command ++;
      command++;
      if(!*command) return;

      MALLOC(tmp, xque, 1);
      tmp->comm = dup_string(command);
      tmp->next = NULL;
    
      d->qcnt ++;
      if (d->q) {
       for (tmp2 = d->q; tmp2->next != NULL; tmp2 = tmp2->next)
           ; /* do nothing */
        tmp2->next = tmp;
      } else
        d->q = tmp;
    }
}

void do_xqueue (__DO_PROTO)
{
 descriptor_data *d;

    for(d = descriptor_list; d; d = d->next) {
      if (d->connected && d->q && d->q->comm && d->player == player) {
         notify(player, player, d->q->comm);
         free_queue(d);
     }
    }
}


void check_xevents(frame *fr)
{
 descriptor_data *d;

    for(d = descriptor_list; d; d = d->next) {  
      if(d->player == fr->player && d->q && d->q->comm) {
          if (fr->argument.top >= STACK_SIZE) {
               notify(fr->player, fr->player, "Program stack overflow.");
               fr->status = STATUS_DEAD;
               free_queue(d);
               return;
             }
             fr->argument.st[fr->argument.top].type = PROG_STRING;
             fr->argument.st[fr->argument.top++].data.string = 
                 dup_string(d->q->comm);
             fr->status = STATUS_RUN;
             free_queue(d);
             return;
         }
    }
}

#endif