Only in circle30bpl14/src: .old
diff -p circle30bpl14.orig/src/Makefile circle30bpl14/src/Makefile
*** circle30bpl14.orig/src/Makefile	Wed Jun  2 03:00:57 1999
--- circle30bpl14/src/Makefile	Tue May 18 19:04:21 1999
*************** LIBS =   
*** 26,39 ****
  
  OBJFILES = comm.o act.comm.o act.informative.o act.movement.o act.item.o \
  	act.offensive.o act.other.o act.social.o act.wizard.o ban.o boards.o \
! 	castle.o class.o config.o constants.o db.o fight.o graph.o handler.o \
  	house.o interpreter.o limits.o magic.o mail.o mobact.o modify.o \
  	objsave.o olc.o random.o shop.o spec_assign.o spec_procs.o \
  	spell_parser.o spells.o utils.o weather.o
  
  CXREF_FILES = act.comm.c act.informative.c act.item.c act.movement.c \
  	act.offensive.c act.other.c act.social.c act.wizard.c ban.c boards.c \
! 	castle.c class.c comm.c config.c constants.c db.c fight.c graph.c \
  	handler.c house.c interpreter.c limits.c magic.c mail.c mobact.c \
  	modify.c objsave.c olc.c random.c shop.c spec_assign.c spec_procs.c \
  	spell_parser.c spells.c utils.c weather.c
--- 26,41 ----
  
  OBJFILES = comm.o act.comm.o act.informative.o act.movement.o act.item.o \
  	act.offensive.o act.other.o act.social.o act.wizard.o ban.o boards.o \
! 	castle.o class.o config.o constants.o db.o fight.o \
! 	gcomm.o graph.o handler.o \
  	house.o interpreter.o limits.o magic.o mail.o mobact.o modify.o \
  	objsave.o olc.o random.o shop.o spec_assign.o spec_procs.o \
  	spell_parser.o spells.o utils.o weather.o
  
  CXREF_FILES = act.comm.c act.informative.c act.item.c act.movement.c \
  	act.offensive.c act.other.c act.social.c act.wizard.c ban.c boards.c \
! 	castle.c class.c comm.c config.c constants.c db.c fight.c \
! 	gcomm.c graph.c \
  	handler.c house.c interpreter.c limits.c magic.c mail.c mobact.c \
  	modify.c objsave.c olc.c random.c shop.c spec_assign.c spec_procs.c \
  	spell_parser.c spells.c utils.c weather.c
*************** db.o: db.c conf.h sysdep.h structs.h uti
*** 142,147 ****
--- 144,152 ----
  fight.o: fight.c conf.h sysdep.h structs.h utils.h comm.h handler.h interpreter.h \
    db.h spells.h screen.h
  	$(CC) -c $(CFLAGS) fight.c
+ gcomm.o: gcomm.c conf.h sysdep.h structs.h utils.c comm.h \
+   handler.h interpreter.h utils.h db.h screen.h gcomm.h
+ 	$(CC) -c $(CFLAGS) gcomm.c
  graph.o: graph.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h \
    db.h spells.h
  	$(CC) -c $(CFLAGS) graph.c
diff -p circle30bpl14.orig/src/act.other.c circle30bpl14/src/act.other.c
*** circle30bpl14.orig/src/act.other.c	Tue Jun 16 16:08:57 1998
--- circle30bpl14/src/act.other.c	Sat May 15 00:50:56 1999
*************** ACMD(do_gen_tog)
*** 859,868 ****
      {"Nameserver_is_slow changed to NO; IP addresses will now be resolved.\r\n",
      "Nameserver_is_slow changed to YES; sitenames will no longer be resolved.\r\n"},
      {"Autoexits disabled.\r\n",
!     "Autoexits enabled.\r\n"}
    };
  
- 
    if (IS_NPC(ch))
      return;
  
--- 859,869 ----
      {"Nameserver_is_slow changed to NO; IP addresses will now be resolved.\r\n",
      "Nameserver_is_slow changed to YES; sitenames will no longer be resolved.\r\n"},
      {"Autoexits disabled.\r\n",
!     "Autoexits enabled.\r\n"},
!     {"You can now hear the global channel.\r\n",
!     "You are now deaf to the global channel.\r\n"}
    };
  
    if (IS_NPC(ch))
      return;
  
*************** ACMD(do_gen_tog)
*** 914,919 ****
--- 915,923 ----
      break;
    case SCMD_AUTOEXIT:
      result = PRF_TOG_CHK(ch, PRF_AUTOEXIT);
+     break;
+   case SCMD_NOGCOMM:
+     result = PRF_TOG_CHK(ch, PRF_NOGCOMM);
      break;
    default:
      log("SYSERR: Unknown subcmd %d in do_gen_toggle.", subcmd);
diff -p circle30bpl14.orig/src/comm.c circle30bpl14/src/comm.c
*** circle30bpl14.orig/src/comm.c	Fri Jul  3 13:07:39 1998
--- circle30bpl14/src/comm.c	Wed Jun  2 11:19:17 1999
***************
*** 55,60 ****
--- 55,61 ----
  #include "handler.h"
  #include "db.h"
  #include "house.h"
+ #include "gcomm.h"
  
  #ifdef HAVE_ARPA_TELNET_H
  #include <arpa/telnet.h>
*************** extern struct room_data *world;	/* In db
*** 85,90 ****
--- 86,92 ----
  extern int top_of_world;	/* In db.c */
  extern struct time_info_data time_info;		/* In db.c */
  extern char help[];
+ extern struct gconf_info gconf;
  
  /* local globals */
  struct descriptor_data *descriptor_list = NULL;		/* master desc list */
*************** ssize_t perform_socket_write(socket_t de
*** 115,120 ****
--- 117,125 ----
  void echo_off(struct descriptor_data *d);
  void echo_on(struct descriptor_data *d);
  void sanity_check(void);
+ void gcomm_queue_req(int *sk);
+ void gcomm_queue_send(int *sk);
+ int gcomm_connect(void);
  int get_from_q(struct txt_q *queue, char *dest, int *aliased);
  void init_game(int port);
  void signal_setup(void);
*************** void game_loop(int mother_desc)
*** 529,535 ****
    struct timeval last_time, before_sleep, opt_time, process_time, now, timeout;
    char comm[MAX_INPUT_LENGTH];
    struct descriptor_data *d, *next_d;
!   int pulse = 0, missed_pulses, maxdesc, aliased;
  
    /* initialize various time values */
    null_time.tv_sec = 0;
--- 534,540 ----
    struct timeval last_time, before_sleep, opt_time, process_time, now, timeout;
    char comm[MAX_INPUT_LENGTH];
    struct descriptor_data *d, *next_d;
!   int pulse = 0, missed_pulses, maxdesc, aliased, gcomm_desc = -1;
  
    /* initialize various time values */
    null_time.tv_sec = 0;
*************** void game_loop(int mother_desc)
*** 542,554 ****
  
    /* The Main Loop.  The Big Cheese.  The Top Dog.  The Head Honcho.  The.. */
    while (!circle_shutdown) {
  
      /* Sleep if we don't have any connections */
!     if (descriptor_list == NULL) {
        log("No connections.  Going to sleep.");
        FD_ZERO(&input_set);
!       FD_SET(mother_desc, &input_set);
!       if (select(mother_desc + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
  	if (errno == EINTR)
  	  log("Waking up to process signal.");
  	else
--- 547,560 ----
  
    /* The Main Loop.  The Big Cheese.  The Top Dog.  The Head Honcho.  The.. */
    while (!circle_shutdown) {
+     maxdesc = mother_desc;
  
      /* Sleep if we don't have any connections */
!     if (descriptor_list == NULL && gcomm_desc == -1) {
        log("No connections.  Going to sleep.");
        FD_ZERO(&input_set);
!       FD_SET(maxdesc=mother_desc, &input_set);
!       if (select(mother_desc+1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
  	if (errno == EINTR)
  	  log("Waking up to process signal.");
  	else
*************** void game_loop(int mother_desc)
*** 557,569 ****
  	log("New connection.  Waking up.");
        gettimeofday(&last_time, (struct timezone *) 0);
      }
      /* Set up the input, output, and exception sets for select(). */
      FD_ZERO(&input_set);
      FD_ZERO(&output_set);
      FD_ZERO(&exc_set);
      FD_SET(mother_desc, &input_set);
  
!     maxdesc = mother_desc;
      for (d = descriptor_list; d; d = d->next) {
  #ifndef CIRCLE_WINDOWS
        if (d->descriptor > maxdesc)
--- 563,585 ----
  	log("New connection.  Waking up.");
        gettimeofday(&last_time, (struct timezone *) 0);
      }
+ 
      /* Set up the input, output, and exception sets for select(). */
      FD_ZERO(&input_set);
      FD_ZERO(&output_set);
      FD_ZERO(&exc_set);
      FD_SET(mother_desc, &input_set);
  
!     if (gcomm_desc == -1) 
!       if ((gcomm_desc = gcomm_connect()) > maxdesc)
!         maxdesc = gcomm_desc;
!     if (gcomm_desc != -1) {
!       FD_SET(gcomm_desc, &input_set);
!       FD_SET(gcomm_desc, &output_set);
!       FD_SET(gcomm_desc, &exc_set);
!     }
! 
! //    maxdesc = mother_desc;
      for (d = descriptor_list; d; d = d->next) {
  #ifndef CIRCLE_WINDOWS
        if (d->descriptor > maxdesc)
*************** void game_loop(int mother_desc)
*** 638,643 ****
--- 654,663 ----
  	close_socket(d);
        }
      }
+     if (FD_ISSET(gcomm_desc, &exc_set)) {
+       close(gcomm_desc);
+       gcomm_desc = -1;
+     }
  
      /* Process descriptors with input pending */
      for (d = descriptor_list; d; d = next_d) {
*************** void game_loop(int mother_desc)
*** 687,692 ****
--- 707,714 ----
  	command_interpreter(d->character, comm); /* Send it to interpreter */
        }
      }
+     if (gcomm_desc != -1 && FD_ISSET(gcomm_desc, &input_set))
+       gcomm_queue_req(&gcomm_desc);
  
      /* Send queued output out to the operating system (ultimately to user) */
      for (d = descriptor_list; d; d = next_d) {
*************** void game_loop(int mother_desc)
*** 699,704 ****
--- 721,728 ----
  	  d->has_prompt = 1;
        }
      }
+     if (gcomm_desc != -1 && FD_ISSET(gcomm_desc, &output_set))
+       gcomm_queue_send(&gcomm_desc);
  
      /* Print prompts for other descriptors who had no other output */
      for (d = descriptor_list; d; d = d->next) {
*************** void game_loop(int mother_desc)
*** 746,751 ****
--- 770,777 ----
      tics++;
  #endif
    }
+   if (gcomm_desc != -1)
+     CLOSE_SOCKET(gcomm_desc);
  }
  
  
*************** void heartbeat(int pulse)
*** 759,765 ****
    if (!(pulse % PULSE_ZONE))
      zone_update();
  
!   if (!(pulse % (15 * PASSES_PER_SEC)))		/* 15 seconds */
      check_idle_passwords();
  
    if (!(pulse % PULSE_MOBILE))
--- 785,791 ----
    if (!(pulse % PULSE_ZONE))
      zone_update();
  
!   if (!(pulse % (15 * PASSES_PER_SEC))) 		/* 15 seconds */
      check_idle_passwords();
  
    if (!(pulse % PULSE_MOBILE))
*************** int perform_subst(struct descriptor_data
*** 1735,1741 ****
  
    return 0;
  }
- 
  
  
  void close_socket(struct descriptor_data *d)
--- 1761,1766 ----
diff -p circle30bpl14.orig/src/db.c circle30bpl14/src/db.c
*** circle30bpl14.orig/src/db.c	Wed Jun 24 22:44:38 1998
--- circle30bpl14/src/db.c	Mon May 24 14:44:48 1999
*************** int file_to_string(const char *name, cha
*** 2355,2360 ****
--- 2355,2361 ----
  void reset_char(struct char_data * ch)
  {
    int i;
+   extern void join_default_gchan(struct char_data *ch);
  
    for (i = 0; i < NUM_WEARS; i++)
      GET_EQ(ch, i) = NULL;
*************** void reset_char(struct char_data * ch)
*** 2380,2385 ****
--- 2381,2388 ----
      GET_MANA(ch) = 1;
  
    GET_LAST_TELL(ch) = NOBODY;
+   strcpy(GET_GCHAN(ch), "Gossip");
+   join_default_gchan(ch);
  }
  
  
diff -p circle30bpl14.orig/src/gcomm.c circle30bpl14/src/gcomm.c
*** circle30bpl14.orig/src/gcomm.c	Wed Jun  2 03:03:16 1999
--- circle30bpl14/src/gcomm.c	Wed Jun  2 11:50:31 1999
***************
*** 0 ****
--- 1,838 ----
+ #include "conf.h"
+ #include "sysdep.h"
+ #include <netdb.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ #include <sys/resource.h>
+ 
+ #include "structs.h"
+ #include "comm.h"
+ #include "interpreter.h"
+ #include "utils.h"
+ #include "handler.h"
+ #include "db.h"
+ #include "screen.h"
+ 
+ #define __GCOMM_C__
+ #include "gcomm.h"
+ 
+ extern struct descriptor_data *descriptor_list;
+ struct gchan_rec *gcomm_chans = NULL;
+ struct gserv_info *gservs = NULL;
+ struct gconf_info gconf;
+ char arg1[MAX_INPUT_LENGTH];
+ char arg2[MAX_INPUT_LENGTH];
+ char arg3[MAX_INPUT_LENGTH];
+ unsigned char outbuf[MAX_PCK_SZ], inbuf[MAX_PCK_SZ];
+ struct que_rec {
+    unsigned char h[24], q[512];
+    struct que_rec *next;
+ };
+ struct que_rec *queue = NULL;
+ 
+ 
+ void gcomm_chanuser_del(struct header_info_v21 *head, struct gchan_info *chan)
+ { struct gchan_user_rec *u, *temp;
+   struct gchan_rec *c = NULL;
+ 
+   if (gcomm_chans)
+     for(c=gcomm_chans;c;c=c->next)
+       if (!str_cmp(chan->name, c->name))
+         break;
+ 
+   if (c && c->user) {
+     strcpy(buf1, gconf_name);
+     buf1[9] = '\0';
+     sprintf(buf, "%s@%s", head->s_nick, buf1);
+     for(u=c->user;u;u=u->next)  
+       if (!str_cmp(buf, u->id))
+         break;
+     if (u) {
+       REMOVE_FROM_LIST(u, c->user, next);
+       u->next = NULL;
+       free(u);
+     }
+   } 
+ }
+ 
+ int gcomm_chanok(struct descriptor_data *d, char *chan)
+ { struct gchan_user_rec *u = NULL;
+   struct gchan_rec *c = NULL;
+ 
+   if (!d || STATE(d) != CON_PLAYING || PRF_FLAGGED(d->character, PRF_NOGCOMM)) 
+     return 0;
+ 
+   if (gcomm_chans)
+     for(c=gcomm_chans;c;c=c->next)
+       if (!str_cmp(chan, c->name))
+         break;
+ 
+   if (c && (u=c->user)) {
+     if (strlen(GET_NAME(d->character)) > 9) {
+       strncpy(buf, GET_NAME(d->character), 9);
+       buf[9] = '\0';
+     } else strcpy(buf, GET_NAME(d->character)); 
+     if (strlen(gconf_name) > 9) 
+       sprintf(buf+strlen(buf), "@%9.9s", gconf_name);
+     else sprintf(buf+strlen(buf), "@%s", gconf_name);
+     for(;u;u=u->next)
+       if (!str_cmp(buf, u->id))
+         break;
+     if (u)
+       return (1);
+   }
+ 
+   return (0);
+ }
+ 
+ 
+ unsigned short int find_gserv_id(char *name)
+ {  unsigned short int ret;
+    struct gserv_info *s = NULL;
+    if (strlen(name) > 2)
+      for(s=gservs; s; s=s->next)
+        if (strstr(s->name, name+1))
+          break;
+    if (!s)
+      return (0);
+    return ((ret = s->id));
+ }
+ 
+ void gcomm_ident(unsigned short int dest)
+ {
+    struct header_info_v21 *h;
+    struct que_rec *que;
+    struct gident_info *id;
+ 
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    h->sz = SZ_IDENT_V21;
+    h->opt = OPT_IDENT;
+    *h->s_nick = '\0';
+    h->dest = dest;
+    h->ts = time(0);
+    id = (struct gident_info *)&que->q;
+    id->base = BASE_CIRCLEMUD;
+    strncpy(id->pass, gconf_password, 3);
+    id->port = (unsigned short int)atoi(gconf_addr_port);
+    if (strlen(gconf_name) >= 39) {
+             strncpy(id->name, gconf_name, 39);
+             id->name[39] = '\0';
+    } else strcpy(id->name, gconf_name);
+    if (strlen(gconf_description) >= 39) {
+            strncpy(id->desc, gconf_description, 39);
+            id->desc[39] = '\0';
+    }  else strcpy(id->desc, gconf_description);
+    que->next = queue;
+    queue = que;
+ 
+ }
+ 
+ 
+ void gcomm_queue_req(int *sk)
+ {
+    struct gmsg_info *msg;
+    struct gchan_info *chan;
+    struct gchan_rec *c = NULL;
+    struct gchan_user_rec *u = NULL;
+    struct gchan_rec *gch = NULL;
+    struct gident_info *id;
+    struct char_data *ch;
+    struct gwall_info *wall;
+    struct hstat_info *hstat;
+    struct que_rec *que;
+    char cbuf[1024], obuf[1024], head_str[24], nick_str[10], *pstr;
+    struct header_info_v21 *h, *head = (struct header_info_v21 *)&head_str;
+    struct gping_info *ping;
+    struct ru_info *ru;
+    struct gserv_info *s, *hsrc = NULL;
+    struct descriptor_data *d;
+    size_t sz, t_sz = 0;
+    time_t now;
+ 
+    if (read(*sk, &head_str, SZ_HEADER_V21) != SZ_HEADER_V21)
+      return;
+    gconf.ts = time(0);
+    for (hsrc=gservs; hsrc && hsrc->id != head->src; hsrc=hsrc->next);
+    if (head->sz != 0)
+      while (t_sz < head->sz)
+        if (-1 != (sz = read(*sk, &inbuf+t_sz, head->sz-t_sz)))
+          t_sz += sz; 
+    
+    now = time(0);
+    switch ((int)head->opt) {
+ 	 
+     case OPT_IDENT:
+       id = (struct gident_info *)&inbuf;
+       for(s=gservs; s; s=s->next)
+ 	if (s->id == id->id)
+ 	  break;
+       if (!s) {
+         s = (struct gserv_info *)malloc(sizeof(struct gserv_info));
+         s->next = gservs;
+         gservs = s;
+         gcomm_ident(s->id);
+       }
+       memcpy(s, &inbuf, SZ_IDENT_V21);
+       s->ts = now;
+       for(d=descriptor_list; d; d=d->next) {
+         ch = d->character;
+         if (ch && !PRF_FLAGGED(ch, PRF_NOGCOMM) && STATE(d) == CON_PLAYING) {
+           sprintf(obuf, 
+ 		"%s%s[%s%s%s]%s Net-Link Established: %s (%s:%d)%s\r\n",
+ 		QBLD, QWHT, QBLU, gcomm_hub_address, 
+ 		QWHT, QBLU, s->name, s->addr, (int)s->port, QNRM);
+           send_to_char(obuf, ch);   
+         }
+       }
+       break;
+ 
+     case OPT_HIDENT:
+       memcpy(&gconf.hub, &inbuf, SZ_HIDENT_V21);
+       break;
+ 
+     case OPT_MSG:
+       msg = (struct gmsg_info *)&inbuf;
+       for(d=descriptor_list; d; d=d->next) {
+         if (strlen(GET_NAME(d->character)) > 9) {
+           strncpy(nick_str, GET_NAME(d->character), 9);
+           nick_str[9] = '\0';
+         } else strcpy(nick_str, GET_NAME(d->character));
+         ch = d->character;
+         if ((int)head->dest == DEST_ALL) {
+ 	   if (gcomm_chanok(d, msg->dest)) {
+ 	     if (*GET_GCHAN(ch) && !str_cmp(GET_GCHAN(ch), msg->dest))
+ 	       *cbuf = '\0';
+   	     else 
+ 	        sprintf(cbuf, "/%s", msg->dest);
+ 	     sprintf(obuf, "%s%s[%s%s@%s%s%s]%s %s%s\r\n",
+ 			QBLD, QWHT, QBLU,
+ 		   	head->s_nick, (hsrc?hsrc->name:"unknown"),
+ 			cbuf, QWHT, QBLU,
+ 			msg->msg, QNRM);
+ 	     send_to_char(obuf, ch);
+            }
+         } else if ((int)head->dest > 1 && !PRF_FLAGGED(ch, PRF_NOGCOMM) &&
+ 				!str_cmp(nick_str, msg->dest)) {
+              if (hsrc)
+                sprintf(cbuf, "@%s", hsrc->name);
+              else *cbuf = '\0';
+              sprintf(obuf, "%s%s[%sP:%s%s%s]%s %s%s\r\n", 
+ 			QBLD, QWHT, QBLU,
+ 			head->s_nick, cbuf, QWHT, QBLU,
+ 			msg->msg, QNRM);
+ 	     send_to_char(obuf, ch);
+         }
+       }
+       break;
+       
+     case OPT_WALL:
+       wall = (struct gwall_info *)&inbuf;
+       for(d=descriptor_list; d; d=d->next) 
+ 	if ( (!wall->flg || GET_LEVEL(d->character) >= LVL_GOD) && 
+ 	     !PRF_FLAGGED(d->character, PRF_NOGCOMM) &&
+ 	     STATE(d) == CON_PLAYING) { 
+ 	  if (hsrc)
+             sprintf(cbuf, "@%s", hsrc->name);
+           else *cbuf = '\0'; 
+            ch = d->character;
+           sprintf(obuf, "%s%s[%sGWALL:%s%s%s]%s %s%s\r\n",
+ 			QBLD, QGRN, QBLU, 
+ 			head->s_nick, cbuf, QGRN, QBLU,
+ 			wall->msg, QNRM);
+ 	  send_to_char(obuf, d->character);
+ 	}
+       break;
+ 
+     case OPT_TIMEO:
+       if ((int)head->src == DEST_HUB) {
+         que = (struct que_rec *)malloc(sizeof(struct que_rec));
+         memcpy(&que->h, &head_str, SZ_HEADER_V21);
+         que->next = queue;
+         queue = que;
+       }
+       break;
+ 
+     case OPT_PING:
+       if (!head->sz) {
+          if ((int)head->src == DEST_HUB && gcomm_chans) 
+            for(c=gcomm_chans;c;c=c->next)
+              if ((u=c->user))
+                for(;u;u=u->next)
+                  if (   (pstr=strchr(u->id, '@')) &&
+                         !strncmp(pstr+1, gconf_name, strlen(pstr)-1)) {
+                    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+                    h = (struct header_info_v21 *)&que->h;
+                    h->opt = OPT_CHANNEL;
+                    h->sz = SZ_CHAN_V21;
+                    h->dest = DEST_ALL;
+                    strcpy(h->s_nick, fname(u->id));
+                    chan = (struct gchan_info *)&que->q;
+                    memcpy(&chan->user, u, SZ_CHAN_USER_V21);
+                    strcpy(chan->name, c->name);
+                    chan->birth = c->birth;
+                    que->next = queue;
+                    queue = que;
+                  }
+ 	 que = (struct que_rec *)malloc(sizeof(struct que_rec));
+ 	 h = (struct header_info_v21 *)&que->h;
+ 	 h->sz = SZ_PING_V21;
+ 	 h->dest = head->src;
+ 	 h->opt = OPT_PING;
+          h->ts = time(0);
+ 	 ping = (struct gping_info *)&que->q;
+ 	 ping->ts = head->ts;
+ 	 que->next = queue;
+ 	 queue = que;
+       } else {
+ 	 ping = (struct gping_info *)&inbuf;
+ 	 for(d=descriptor_list; d; d=d->next)
+ 	   if (strlen(head->s_nick) <= strlen(GET_NAME(d->character)) &&
+ 	       !strncmp(head->s_nick, GET_NAME(d->character), strlen(head->s_nick))) {
+ 	      if (hsrc)
+                 sprintf(cbuf, ":%s", hsrc->name);
+               else *cbuf = '\0';
+               ch = d->character;
+ //              sprintf(obuf, "%s%s[%sGPING%s%s]%s (%u+%u) %u second transmission.%s\r\n", // un-imp'd timezones
+               sprintf(obuf, "%s%s[%sGPING%s%s]%s %u second transmission.%s\r\n",
+ 			QBLD, QWHT, QBLU, 
+ 			cbuf,  QWHT, QBLU,
+ 			(unsigned int)(now-ping->ts), QNRM);
+ 	      send_to_char(obuf, d->character);
+ 	   }
+       }
+       break;
+ 
+     case OPT_HSTAT:
+       hstat = (struct hstat_info *)&inbuf;
+       for(d=descriptor_list; d; d=d->next) 
+         if (strlen(head->s_nick) <= strlen(GET_NAME(d->character)) &&
+ 		!strncmp(head->s_nick, GET_NAME(d->character), strlen(head->s_nick))) {
+           sprintf(obuf, 
+ 		"%s - Gateway Connection at: %s\r"
+ 		"OutPub Packets: %d, OutPriv Packets: %d, OutMisc Packets: %d\r\n"
+ 		"InPub Packets: %d, InPriv Packets: %d, InMisc Packets: %d\r\n"
+ 		"Avg. InPacket (in sec): %d / Avg. OutPacket (in sec): %d\r\n",
+       		gconf_name, ctime(&hstat->conn_ts),
+ 		hstat->icc, hstat->ipc, hstat->imc,
+ 		hstat->occ, hstat->opc, hstat->omc,
+ 		hstat->tr_i, hstat->tr_o);
+           send_to_char(obuf, d->character);
+         }
+       break;      
+       
+     case OPT_RU:
+       if (!head->sz) {
+ 	 que = (struct que_rec *)malloc(sizeof(struct que_rec));
+ 	 h = (struct header_info_v21 *)&que->h;
+ 	 h->dest = head->src;
+ 	 h->sz = SZ_RU_V21;
+ 	 h->opt = OPT_RU;
+          h->ts = time(0);
+ 	 getrusage(0, (struct rusage *)&que->q);
+ 	 que->next = queue;
+ 	 queue = que;
+       } else {
+ 	 ru = (struct ru_info *)&inbuf;
+ 	 for (d=descriptor_list; d; d=d->next) {
+            if (strlen(GET_NAME(d->character)) > 9) {
+              strncpy(nick_str, GET_NAME(d->character), 9);
+              nick_str[9] = '\0';
+            } else strcpy(nick_str, GET_NAME(d->character));
+    	   if (!str_cmp(nick_str, head->s_nick)) {
+              ch = d->character;
+              sprintf(obuf, "%s%s[%sRU:%s%s]%s %u.%u usec, %u.%u sys, %u mres, %u ires%s\r\n",
+ 			QBLD, QWHT, QBLU,
+ 		      (hsrc?hsrc->name:"HUB"), QWHT, QBLU,
+ 		      (unsigned int)ru->u_sec, 
+ 			(unsigned int)ru->u_usec,
+ 		      (unsigned int)ru->s_sec, 
+ 			(unsigned int)ru->s_usec,			
+ 		      (unsigned int)ru->ru_ixrss, 
+ 			(unsigned int)ru->ru_maxrss, QNRM);
+ 	     send_to_char(obuf, d->character);
+ 	   }
+          }
+       }  
+       break;
+ 
+     case OPT_DISCON:
+       if ((int)head->src == DEST_HUB) {
+         close(*sk);
+         *sk = -1;
+         for(d=descriptor_list; d; d=d->next) {
+           if ((ch = d->character))
+             if (!PLR_FLAGGED(ch, PRF_NOGCOMM)) {
+               sprintf(obuf,
+         	"%s%s[%s%s%s]%s NetSplit  -  %s%s\r\n",
+ 		QBLD, QWHT, QBLU, gconf.hub.addr, QWHT, QBLU, 
+ 		head->s_nick, QNRM);
+               send_to_char(obuf, ch);
+             }
+         }
+       }
+       break;
+ 
+     case OPT_CHANNEL:
+       chan = (struct gchan_info *)&inbuf;
+       if (gcomm_chans)
+         for(gch=gcomm_chans;gch;gch=gch->next)
+           if (!str_cmp(chan->name, gch->name))
+             break;
+       if (!gch) {
+         gch = (struct gchan_rec *)malloc(sizeof(struct gchan_rec));
+         strcpy(gch->name, chan->name);
+         gch->birth = chan->birth;
+         gch->user = NULL;
+         gch->next = gcomm_chans;
+         gcomm_chans = gch;
+       }
+       if ((u=gch->user))
+         for(;u;u=u->next)
+           if (!str_cmp(u->id, chan->user.id))
+             break;
+       if (!u) {
+         u = (struct gchan_user_rec *)malloc(sizeof(struct gchan_user_rec));  
+         memcpy((struct gchan_user_rec *)u,
+ 		(struct gchan_user_rec *)&chan->user, SZ_CHAN_USER_V21);
+         u->next = gch->user;
+         gch->user = u;
+       }
+       for(d=descriptor_list;d;d=d->next) 
+         if (gcomm_chanok(d, chan->name)) {
+           ch = d->character;
+           sprintf(obuf, "%s%s[%s%s/%s%s]%s %s has joined the channel.%s\r\n",
+ 		QBLD, QWHT, QBLU, 
+ 		(hsrc?hsrc->name:"unknown"), chan->name,
+ 		QWHT, QBLU, head->s_nick, QNRM);
+           send_to_char(obuf, ch);
+         }
+       break;
+ 
+     case OPT_CHANDEL:
+       chan = (struct gchan_info *)&inbuf;
+       for(d=descriptor_list;d;d=d->next)
+         if (gcomm_chanok(d, chan->name)) {
+           ch = d->character;
+           sprintf(obuf, "%s%s[%s%s/%s%s]%s %s has left the channel.%s\r\n",
+ 		QBLD, QWHT, QBLU, 
+ 		(hsrc?hsrc->name:"unknown"), chan->name,
+ 		QWHT, QBLU, head->s_nick, QNRM);
+           send_to_char(obuf, ch);
+         }
+       gcomm_chanuser_del(head, chan);
+       break;
+    }
+ }
+ 		    
+ void gcomm_queue_send(int *sk)
+ {  struct que_rec *q, *temp;
+    struct header_info_v21 *h;
+    size_t sz, t_sz = 0;
+    time_t now = time(0);
+ 
+    // routine checks
+    if ( (gconf.ts/2000) != (now/2000) ) {
+      close(*sk);
+      *sk = -1;
+      return;
+    }
+    if (!queue)
+      return;
+ 
+    q = queue;
+    if (SZ_HEADER_V21 != write(*sk, &q->h, SZ_HEADER_V21)) 
+      return;
+    h = (struct header_info_v21 *)&q->h;
+    if (h->sz != 0)
+      while (t_sz < h->sz)
+        if (-1 != (sz = write(*sk, &q->q+t_sz, h->sz-t_sz)))
+          t_sz += sz;
+ 
+    REMOVE_FROM_LIST(q, queue, next);
+    q->next = NULL;
+    free(q);
+ }
+ 
+ int atoport(char *service, char *proto)
+ {  int port;
+    long int lport;
+    struct servent *serv;
+    char *errpos;
+    if ((serv = getservbyname(service, proto)))
+       port = serv->s_port;
+    else {
+            lport = strtol(service,&errpos,0);
+            if ( (errpos[0] != 0) || (lport < 1) || (lport > 65535) )
+               return -1;
+            port = htons(lport);
+         }
+    return port;
+ }
+ 
+ struct in_addr *atoaddr(char *address)
+ {  struct hostent *host;
+    static struct in_addr saddr;
+    if (-1 != (saddr.s_addr = inet_addr(address)))
+      return &saddr;
+    if ((host = gethostbyname(address)))
+      return (struct in_addr *) *host->h_addr_list;
+    return NULL;
+ }
+ 
+ int gcomm_connect(void)
+ {  struct in_addr *addr = atoaddr((char *)gcomm_hub_address);
+    struct sockaddr_in address;
+    int sock, port = atoport((char *)gcomm_hub_port, "tcp");
+    void nonblock(socket_t s);
+    
+    // setup socket for tranfers
+    gconf.ts = 0;
+    bzero ((char *)&address, sizeof(address));
+    address.sin_family = AF_INET;
+    address.sin_port = (port);
+    address.sin_addr.s_addr = addr->s_addr;
+    if (addr && port > 0) {
+       sock = socket(AF_INET, SOCK_STREAM, 6);
+       if (!connect(sock, (struct sockaddr *) &address, sizeof(address))) {
+          gconf.ts = time(0);
+ 	 nonblock(sock); 
+ 	 gcomm_ident(DEST_HUB);
+ 	 return (sock);
+       }
+       close(sock);
+    }
+    return -1;
+ }
+ 
+ void disp_globalcomm_usage(struct char_data *ch) 
+ { char usage[512];
+   sprintf(usage, "%s%s"
+ 	"   gchannels			 / list channels and contents\r\n"
+         "   gjoin  <channel name>        / select default channel\r\n"
+         "   gleave <channel name>        / delete a channel\r\n"
+ 	"   gchat  <message content>     / send a msg to channel\r\n"
+ 	"   gpriv  <nickname>@<destination site> <message content>\r\n"
+ 	"   gping  [<destination site name>]\r\n"
+ 	"   gstat  <destination site name> | \"HUB\"\r\n"
+ 	"   nogchat                      / disables GComm interaction%s\r\n",
+ 	QBLD, QBLU, QNRM);
+   send_to_char(usage, ch);
+ }
+ ACMD(do_ghelp)
+ {
+   disp_globalcomm_usage(ch);
+ }
+ 
+ ACMD(do_gchannel)
+ {  struct que_rec *q;
+    struct header_info_v21 *h;
+    struct gchan_user_rec *u;
+    struct gchan_info *chan;
+    struct gchan_rec *c = NULL;
+    char obuf[2056];
+    int i, chan_cnt = 0;
+    if (*argument)  argument++;
+    *obuf = '\0';
+    if (gcomm_chans)
+    for(c=gcomm_chans;c;c=c->next)
+      if (!*argument && (u=c->user)) {
+ 	sprintf(obuf+strlen(obuf),
+ 		"  * %s\r\n", c->name);
+ 	for(i=0;u;u=u->next,i++)
+           sprintf(obuf+strlen(obuf), "   -%2.2d- %s\r\n", i, u->id);
+         chan_cnt++;
+      } else if (*argument && !str_cmp(argument, c->name))
+ 	  break;
+ 
+    if (!*argument) {
+      sprintf(buf, "%s\r\n- %d Total Channels Active\r\n", obuf, chan_cnt);
+      page_string(ch->desc, buf, TRUE);
+      return;
+    }
+ 
+    if (c && !gcomm_chanok(ch->desc, c->name) && OPT_CHANDEL == subcmd) {
+      send_to_char("You are not even in that channel!\r\n", ch);
+      return;
+    }
+ 
+    if (c && gcomm_chanok(ch->desc, c->name) && OPT_CHANDEL != subcmd) {
+      strcpy(GET_GCHAN(ch), c->name);
+      sprintf(buf, "You join the %s channel.\r\n", c->name);
+      send_to_char(buf, ch);
+      return;
+    }
+    
+       q = (struct que_rec *)malloc(sizeof(struct que_rec));
+       h = (struct header_info_v21 *)&q->h;
+       h->sz = SZ_CHAN_V21;
+       if ((h->opt=subcmd) != OPT_CHANDEL)
+         h->opt = OPT_CHANNEL;
+       h->dest = DEST_ALL;
+       if (strlen(GET_NAME(ch)) > 9) {
+ 	 strncpy(h->s_nick, GET_NAME(ch), 9);
+ 	 h->s_nick[9] = '\0';
+       } else strcpy(h->s_nick, GET_NAME(ch));
+       chan = (struct gchan_info *)&q->q;
+       if (strlen(GET_NAME(ch)) > 9) {
+         strncpy(chan->user.id, GET_NAME(ch), 9);
+         chan->user.id[9] = '\0';
+       } else strcpy(chan->user.id, GET_NAME(ch));
+       if (strlen(gconf_name) > 9)
+         sprintf(chan->user.id+strlen(chan->user.id), "@%9.9s", gconf_name);
+       else sprintf(chan->user.id+strlen(chan->user.id), "@%s", gconf_name);
+       chan->user.idle = chan->user.join = time(0);
+       if (GET_LEVEL(ch) >= LVL_GOD)
+ 	chan->user.cm = CM_WIZ;
+       else  chan->user.cm = 0;
+       if (c)
+ 	strcpy(chan->name, c->name);
+       else if (strlen(argument) > 9) {
+ 	 strncpy(chan->name, argument, 9);
+ 	 chan->name[9] = '\0';
+       } else strcpy(chan->name, argument);
+       if (c)
+ 	chan->birth = c->birth;
+       else chan->birth = time(0);
+       q->next = queue;
+       queue = q;
+       if (h->opt != OPT_CHANDEL)
+         strcpy(GET_GCHAN(ch), chan->name);  
+       else strcpy(GET_GCHAN(ch), "Gossip");
+ }
+ 
+ 
+ ACMD(do_gchat) 			
+ {  struct gmsg_info *msg;
+    struct header_info_v21 *h;
+    struct que_rec *que;
+ 
+    if (PRF_FLAGGED(ch, PRF_NOGCOMM)) {
+       send_to_char("You currently have GlobalComm turned off.\r\n", ch);
+       return;
+    }
+ 
+    if (!argument || !*argument || !*(++argument) || !*GET_GCHAN(ch)) {
+      disp_globalcomm_usage(ch);
+      return;
+    }
+ 
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    h->sz = SZ_MSG_V21;
+    h->opt = OPT_MSG;
+    h->dest = DEST_ALL;
+    h->ts = time(0);
+    if (strlen(GET_NAME(ch)) > 9) {
+       strncpy(h->s_nick, GET_NAME(ch), 9);
+       h->s_nick[9] = '\0';
+    } else strcpy(h->s_nick, GET_NAME(ch));
+    msg = (struct gmsg_info *)&que->q;
+    strcpy(msg->dest, GET_GCHAN(ch));
+    argument[59] = '\0';
+    strcpy(msg->msg, argument);
+    que->next = queue;
+    queue = que;
+ }
+ 
+ ACMD(do_gpriv)
+ {  struct header_info_v21 *h;
+    struct gmsg_info *priv;
+    struct que_rec *que;
+    
+    if (PRF_FLAGGED(ch, PRF_NOGCOMM)) {
+       send_to_char("You currently have that channel turned off.\r\n", ch);
+       return;
+    }
+ 
+    two_arguments(argument, arg1, arg2);
+    if (!*arg1 || !*arg2 || !strchr(arg1, '@')) {
+      disp_globalcomm_usage(ch);
+      return;
+    }
+ 
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    h->sz = SZ_MSG_V21;
+    h->opt = OPT_MSG;
+    h->ts = time(0);
+    if (!(h->dest = find_gserv_id(strchr(arg1, '@')+1))) {
+       send_to_char("That server could not be found!\r\n", ch);
+       return;
+    }
+    if (strlen(GET_NAME(ch)) > 9) {
+       strncpy(h->s_nick, GET_NAME(ch), 9);
+       h->s_nick[9] = '\0';
+    } else strcpy(h->s_nick, GET_NAME(ch));
+    priv = (struct gmsg_info *)&que->q;
+    strcpy(priv->dest, fname(arg1));
+    priv->dest[9] = '\0';
+    argument += strlen(arg1)+2;
+    if (strlen(argument) > 59)
+      argument[59] = '\0';
+    strcpy(priv->msg, argument);
+    que->next = queue;
+    queue = que;
+ 
+    CAP(arg1);
+    sprintf(buf, "You message %s: %s.\r\n", arg1, argument);
+    send_to_char(buf, ch);
+ 
+ }
+ 
+ 
+ 
+ ACMD(do_gping)
+ {  struct que_rec *que;
+    struct header_info_v21 *h;
+    unsigned short int id = 0;
+ 
+    if (*argument && *(++argument) && !(id = find_gserv_id(argument))) {
+      send_to_char("That server could not be found!\r\n", ch);
+      return;
+    }
+ 
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    if (*argument == ' ') argument++;
+    h->sz = 0;
+    h->opt = OPT_PING;
+    h->ts = time(0);
+    if (strlen(GET_NAME(ch)) >= 9) {
+       strncpy(h->s_nick, GET_NAME(ch), 9);
+       h->s_nick[9] = '\0';
+    } else strcpy(h->s_nick, GET_NAME(ch));
+    if ((h->dest = id)) {
+      sprintf(buf, "Requesting ping responce from %s.\r\n", argument);
+      send_to_char(buf, ch);
+    } else
+      send_to_char ("Requesting ping responce from the hub.\r\n", ch);
+ 
+    que->next = queue;
+    queue = que;
+ }
+ 
+ ACMD(do_glist) 
+ { struct gserv_info *s;
+ 
+   if (gservs) 
+     for (s=gservs; s; s=s->next) {
+       sprintf(buf, "[%s:%d] %s - %s\r\n",
+ 	s->addr, (int)s->port, s->name, s->desc);
+       send_to_char(buf, ch);
+     }
+ } 
+ 
+ ACMD(do_gwall)
+ { 
+    struct que_rec *que;
+    struct header_info_v21 *h;
+    struct gwall_info *w;
+    
+    if (!*argument || !*(++argument)) {
+       disp_globalcomm_usage(ch);
+       return;
+    }
+    
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    h->sz = SZ_WALL_V21;
+    h->opt = OPT_WALL;
+    h->dest = DEST_ALL;
+    h->ts = time(0);
+    if (strlen(GET_NAME(ch)) > 9) {
+      strncpy(h->s_nick, GET_NAME(ch), 9);
+      h->s_nick[9] = '\0';
+    } else strcpy(h->s_nick, GET_NAME(ch));
+    w = (struct gwall_info *)&que->q;
+    w->flg = 1;
+    if (strlen(argument) > 79)
+      argument[79] = '\0';
+    strcpy(w->msg, argument);
+    que->next = queue;
+    queue = que;
+    sprintf(buf, "You Wall (to %s): %s\r\n", 
+ 			(!w->flg?"all":"wiz"), w->msg);
+    send_to_char(buf, ch);
+ }
+    
+ 
+ ACMD(do_gstat)
+ {  struct que_rec *que;
+    struct header_info_v21 *h;
+    unsigned short int id = 0;
+ 
+    if (!*argument || !*(++argument)) {
+         que = (struct que_rec *)malloc(sizeof(struct que_rec));
+         h = (struct header_info_v21 *)&que->h;
+         h->sz = 0;
+         h->opt = OPT_HSTAT;
+         h->dest = 0;
+         if (strlen(GET_NAME(ch)) > 9) {
+           strncpy(h->s_nick, GET_NAME(ch), 9);
+           h->s_nick[9] = '\0';
+         } else strcpy(h->s_nick, GET_NAME(ch));
+         que->next = queue;
+         queue = que;
+         return;
+    }
+ 
+    if (!str_cmp(argument, "hub")) {
+      sprintf(buf,
+ 	"Gateway: %s, Uptime: %s\r"
+         "[%s] %s\r\n",
+ 		gconf.hub.name, ctime(&gconf.hub.birth),
+ 		gconf.hub.addr, gconf.hub.desc);
+      send_to_char(buf, ch);
+      return;
+    }
+ 
+    if (!(id = find_gserv_id(argument))) {
+      send_to_char("That server could not be found!\r\n", ch);
+      return;
+    }
+ 
+    que = (struct que_rec *)malloc(sizeof(struct que_rec));
+    h = (struct header_info_v21 *)&que->h;
+    h->sz = 0;
+    h->opt = OPT_RU;
+    h->ts = time(0);
+    if (strlen(GET_NAME(ch)) >= 9) {
+       strncpy(h->s_nick, GET_NAME(ch), 9);
+       h->s_nick[9] = '\0';
+    } else strcpy(h->s_nick, GET_NAME(ch));
+    h->dest = id;
+    que->next = queue;
+    queue = que;
+ }
+ 
+ void join_default_gchan(struct char_data *ch)
+ { struct header_info_v21 *h;
+   struct gchan_info *c;
+   struct que_rec *q;
+   q = (struct que_rec *)malloc(sizeof(struct que_rec));
+   h = (struct header_info_v21 *)&q->h;
+   h->sz = SZ_CHAN_V21;
+   h->dest = DEST_ALL;
+   h->opt = OPT_CHANNEL;
+   if (strlen(GET_NAME(ch)) > 9) {
+     strncpy(h->s_nick, GET_NAME(ch), 9);
+     h->s_nick[9] = '\0';
+   } else strcpy(h->s_nick, GET_NAME(ch));
+   c = (struct gchan_info *)&q->q;
+   strcpy(c->name, GET_GCHAN(ch));
+   c->birth = 0;
+   if (strlen(gconf_name) > 9) {
+     strncpy(buf, gconf_name, 9);
+     buf[9] = '\0';
+   } else strcpy(buf, gconf_name);
+   sprintf(c->user.id, "%s@%s", h->s_nick, buf);
+   c->user.idle = c->user.join = time(0);
+   if (GET_LEVEL(ch) >= LVL_GOD)
+     c->user.cm = CM_WIZ;
+   else c->user.cm = 0;
+   q->next = queue;
+   queue = q;
+ }
+ 
diff -p circle30bpl14.orig/src/gcomm.h circle30bpl14/src/gcomm.h
*** circle30bpl14.orig/src/gcomm.h	Wed Jun  2 03:03:17 1999
--- circle30bpl14/src/gcomm.h	Wed May 26 10:07:03 1999
***************
*** 0 ****
--- 1,144 ----
+ #ifdef __GCOMM_C__
+ /*  **************************************************************  */
+ /*  GComm v2.1 CircleMud Client  |  May 1999  |  IRB@VRESOURCE.COM  */
+ /*  **************************************************************  */
+ 
+ // Name Of Your Multiplayer Inet Game
+ const char *gconf_name = "Example";
+ const char *gconf_description = "Example CircleMud";
+ 
+ // Inet Address and Port Of Your Multiplayer Game
+ const char *gconf_addr_addr = "vresource.com";
+ const char *gconf_addr_port = "4000";
+ 
+ // Unique Password For Security
+ const char *gconf_password = "psswrd";
+ 
+ // GComm Hub Related Info
+ const char *gcomm_hub_address = "vresource.com";
+ const char *gcomm_hub_port = "24101";
+ #else
+ //void gcomm_queue_proc(int *prio);
+ #endif
+ 
+ #define BASE_UNKNOWN    0
+ #define BASE_CIRCLEMUD  1
+ #define BASE_TINYMUSH   2
+ #define BASE_MuIND      3
+ 
+ #define         OPT_NULL        0
+ #define         OPT_MSG         1
+ #define         OPT_IDENT       2
+ #define         OPT_RU          3
+ #define         OPT_PLAYER      4
+ #define         OPT_MOBILE      5
+ #define         OPT_ROOM        6
+ #define         OPT_OBJECT      7
+ #define         OPT_HSTAT       8
+ #define         OPT_WALL        9
+ #define         OPT_PING        10
+ #define		OPT_TIMEO	11
+ #define 	OPT_DISCON	12
+ #define		OPT_HIDENT	13
+ #define		OPT_CHANNEL	14
+ #define		OPT_CHANDEL	15
+ 
+ #define 	CM_WIZ		(1 << 0)
+ 
+ #define		DEST_HUB	0
+ #define		DEST_ALL	1
+ 
+ #define 	MAX_PCK_SZ      256
+ #define 	MAX_IN_GCHAN	256
+ 
+ struct gchan_user_info {
+   char id[20];
+   time_t idle, join;
+   short int cm;
+ };
+ #define SZ_CHAN_USER_V21	(sizeof(struct gchan_user_info))
+ 
+ struct gchan_info {
+   struct gchan_user_info user;
+   char name[10];
+   time_t birth;
+ };
+ #define SZ_CHAN_V21		(sizeof(struct gchan_info))
+ 
+ struct gchan_user_rec {
+   char id[20]; 
+   time_t idle, join;
+   short int cm;
+   struct gchan_user_rec *next;
+ };
+ 
+ struct gchan_rec {
+   char name[10];
+   time_t birth;
+   struct gchan_user_rec *user;
+   struct gchan_rec *next;
+ };
+ 
+ struct header_info_v21 {
+   size_t sz;
+   time_t ts;
+   char s_nick[10];
+   unsigned short int opt, src, dest;
+ };
+ #define SZ_HEADER_V21		(sizeof(struct header_info_v21))
+ 
+ struct gmsg_info {
+   char dest[10], msg[60];
+ };
+ #define SZ_MSG_V21		(sizeof(struct gmsg_info))
+ 
+ struct gident_info {
+   short int id, port, base;
+   char name[40], desc[40], pass[3], addr[40];
+ };
+ #define SZ_IDENT_V21		(sizeof(struct gident_info))
+ 
+ struct hident_info {
+   char addr[40], name[40], desc[40];
+   time_t birth, ts;
+   int p_max;
+ };
+ #define SZ_HIDENT_V21		(sizeof(struct hident_info))
+ 
+ struct ru_info {
+   time_t u_sec, u_usec, s_sec, s_usec;
+   long ru_maxrss;
+   long ru_ixrss;
+ };
+ #define SZ_RU_V21		(sizeof(struct ru_info))
+ 
+ struct hstat_info {
+   time_t conn_ts, ts;
+   short int imc, omc, ipc, opc, icc, occ, tr_i, tr_o;
+ };
+ #define SZ_HSTAT_V21		(sizeof(struct hstat_info))
+ 
+ struct gwall_info {
+   char msg[80];
+   unsigned short int flg;
+ };
+ #define SZ_WALL_V21		(sizeof(struct gwall_info))
+ 
+ 
+ struct gping_info {
+   time_t ts;
+ };
+ #define SZ_PING_V21		(sizeof(struct gping_info))
+ 
+ struct gserv_info {
+   short int id, port, base;
+   char name[40], desc[40], pass[3], addr[40];
+   time_t ts;
+   struct gserv_info *next;
+ };
+ 
+ struct gconf_info {
+   time_t ts;
+   struct hident_info hub;
+ };
+ 
diff -p circle30bpl14.orig/src/interpreter.c circle30bpl14/src/interpreter.c
*** circle30bpl14.orig/src/interpreter.c	Tue Jun 16 17:13:04 1998
--- circle30bpl14/src/interpreter.c	Tue May 25 17:48:17 1999
***************
*** 23,29 ****
  #include "mail.h"
  #include "screen.h"
  
- 
  extern sh_int r_mortal_start_room;
  extern sh_int r_immort_start_room;
  extern sh_int r_frozen_start_room;
--- 23,28 ----
*************** ACMD(do_exits);
*** 94,99 ****
--- 93,100 ----
  ACMD(do_flee);
  ACMD(do_follow);
  ACMD(do_force);
+ ACMD(do_gchannel);
+ ACMD(do_gchat);
  ACMD(do_gecho);
  ACMD(do_gen_comm);
  ACMD(do_gen_door);
*************** ACMD(do_gen_ps);
*** 101,112 ****
--- 102,119 ----
  ACMD(do_gen_tog);
  ACMD(do_gen_write);
  ACMD(do_get);
+ ACMD(do_ghelp);
  ACMD(do_give);
  ACMD(do_gold);
  ACMD(do_goto);
+ ACMD(do_glist);
+ ACMD(do_gping);
+ ACMD(do_gpriv);
  ACMD(do_grab);
  ACMD(do_group);
  ACMD(do_gsay);
+ ACMD(do_gstat);
+ ACMD(do_gwall);
  ACMD(do_hcontrol);
  ACMD(do_help);
  ACMD(do_hide);
*************** cpp_extern const struct command_info cmd
*** 301,313 ****
--- 308,328 ----
  
    { "get"      , POS_RESTING , do_get      , 0, 0 },
    { "gasp"     , POS_RESTING , do_action   , 0, 0 },
+   { "gchannels", POS_DEAD    , do_gchannel , 0, 0 },
+   { "gchat"    , POS_DEAD    , do_gchat    , 0, 0 },
    { "gecho"    , POS_DEAD    , do_gecho    , LVL_GOD, 0 },
+   { "ghelp"    , POS_DEAD    , do_ghelp    , 0, 0 },
    { "give"     , POS_RESTING , do_give     , 0, 0 },
    { "giggle"   , POS_RESTING , do_action   , 0, 0 },
+   { "gjoin"    , POS_DEAD    , do_gchannel , 0, 14 },
    { "glare"    , POS_RESTING , do_action   , 0, 0 },
+   { "gleave"   , POS_DEAD    , do_gchannel , 0, 15 },
+   { "glist"    , POS_DEAD    , do_glist    , 0, 0 },
    { "goto"     , POS_SLEEPING, do_goto     , LVL_IMMORT, 0 },
    { "gold"     , POS_RESTING , do_gold     , 0, 0 },
    { "gossip"   , POS_SLEEPING, do_gen_comm , 0, SCMD_GOSSIP },
+   { "gping"    , POS_DEAD    , do_gping    , 0, 0 },
+   { "gpriv"    , POS_DEAD    , do_gpriv    , 0, 0 },
    { "group"    , POS_RESTING , do_group    , 1, 0 },
    { "grab"     , POS_RESTING , do_grab     , 0, 0 },
    { "grats"    , POS_SLEEPING, do_gen_comm , 0, SCMD_GRATZ },
*************** cpp_extern const struct command_info cmd
*** 318,324 ****
--- 333,341 ----
    { "grovel"   , POS_RESTING , do_action   , 0, 0 },
    { "growl"    , POS_RESTING , do_action   , 0, 0 },
    { "gsay"     , POS_SLEEPING, do_gsay     , 0, 0 },
+   { "gstat"    , POS_DEAD    , do_gstat    , 0, 0 },
    { "gtell"    , POS_SLEEPING, do_gsay     , 0, 0 },
+   { "gwall"    , POS_DEAD    , do_gwall    , LVL_GOD, 0 },
  
    { "help"     , POS_DEAD    , do_help     , 0, 0 },
    { "handbook" , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_HANDBOOK },
*************** cpp_extern const struct command_info cmd
*** 369,374 ****
--- 386,392 ----
    { "nibble"   , POS_RESTING , do_action   , 0, 0 },
    { "nod"      , POS_RESTING , do_action   , 0, 0 },
    { "noauction", POS_DEAD    , do_gen_tog  , 0, SCMD_NOAUCTION },
+   { "nogchat"  , POS_DEAD    , do_gen_tog  , 0, SCMD_NOGCOMM }, 
    { "nogossip" , POS_DEAD    , do_gen_tog  , 0, SCMD_NOGOSSIP },
    { "nograts"  , POS_DEAD    , do_gen_tog  , 0, SCMD_NOGRATZ },
    { "nohassle" , POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_NOHASSLE },
diff -p circle30bpl14.orig/src/interpreter.h circle30bpl14/src/interpreter.h
*** circle30bpl14.orig/src/interpreter.h	Sun Jun  7 21:38:14 1998
--- circle30bpl14/src/interpreter.h	Sun May 23 14:25:12 1999
*************** struct alias {
*** 113,118 ****
--- 113,119 ----
  #define SCMD_HOLYLIGHT	13
  #define SCMD_SLOWNS	14
  #define SCMD_AUTOEXIT	15
+ #define SCMD_NOGCOMM	16
  
  /* do_wizutil */
  #define SCMD_REROLL	0
*************** struct alias {
*** 202,204 ****
--- 203,209 ----
  #define SCMD_UNLOCK     2
  #define SCMD_LOCK       3
  #define SCMD_PICK       4
+ 
+ /* do_gchannel */
+ #define SCMD_JOIN	0
+ #define SCMD_LEAVE	1
diff -p circle30bpl14.orig/src/screen.h circle30bpl14/src/screen.h
*** circle30bpl14.orig/src/screen.h	Thu Mar  5 00:37:14 1998
--- circle30bpl14/src/screen.h	Sat Apr 17 00:38:19 1999
***************
*** 9,14 ****
--- 9,15 ----
  ************************************************************************ */
  
  #define KNRM  "\x1B[0m"
+ #define KBLD  "\x1B[1m"
  #define KRED  "\x1B[31m"
  #define KGRN  "\x1B[32m"
  #define KYEL  "\x1B[33m"
***************
*** 34,39 ****
--- 35,41 ----
  #define CCMAG(ch,lvl)  (clr((ch),(lvl))?KMAG:KNUL)
  #define CCCYN(ch,lvl)  (clr((ch),(lvl))?KCYN:KNUL)
  #define CCWHT(ch,lvl)  (clr((ch),(lvl))?KWHT:KNUL)
+ #define CCBLD(ch,lvl)  (clr((ch),(lvl))?KBLD:KNUL)
  
  #define COLOR_LEV(ch) (_clrlevel(ch))
  
***************
*** 45,48 ****
  #define QMAG CCMAG(ch,C_SPR)
  #define QCYN CCCYN(ch,C_SPR)
  #define QWHT CCWHT(ch,C_SPR)
! 
--- 47,50 ----
  #define QMAG CCMAG(ch,C_SPR)
  #define QCYN CCCYN(ch,C_SPR)
  #define QWHT CCWHT(ch,C_SPR)
! #define QBLD CCBLD(ch,C_SPR)
diff -p circle30bpl14.orig/src/structs.h circle30bpl14/src/structs.h
*** circle30bpl14.orig/src/structs.h	Tue Jun 16 14:20:56 1998
--- circle30bpl14/src/structs.h	Sat May 15 11:46:55 1999
***************
*** 183,188 ****
--- 183,189 ----
  #define PRF_NOGOSS	(1 << 19) /* Can't hear gossip channel		*/
  #define PRF_NOGRATZ	(1 << 20) /* Can't hear grats channel		*/
  #define PRF_ROOMFLAGS	(1 << 21) /* Can see room flags (ROOM_x)	*/
+ #define PRF_NOGCOMM	(1 << 22) /* Can't hear global channel          */
  
  
  /* Affect bits: used in char_data.char_specials.saved.affected_by */
*************** struct player_special_data {
*** 794,799 ****
--- 795,801 ----
  
     char	*poofin;		/* Description on arrival of a god.     */
     char	*poofout;		/* Description upon a god's exit.       */
+    char gchan[24];		/* GlobalComm Default Channel		*/
     struct alias *aliases;	/* Character's aliases			*/
     long last_tell;		/* idnum of last tell from		*/
     void *last_olc_targ;		/* olc control				*/
Common subdirectories: circle30bpl14.orig/src/util and circle30bpl14/src/util
diff -p circle30bpl14.orig/src/utils.h circle30bpl14/src/utils.h
*** circle30bpl14.orig/src/utils.h	Sat Jun 20 22:19:07 1998
--- circle30bpl14/src/utils.h	Sat May 15 11:49:22 1999
*************** void	update_pos(struct char_data *victim
*** 295,300 ****
--- 295,301 ----
  #define GET_TALK(ch, i)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.talks[i]))
  #define POOFIN(ch)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->poofin))
  #define POOFOUT(ch)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->poofout))
+ #define GET_GCHAN(ch)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->gchan))
  #define GET_LAST_OLC_TARG(ch)	CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->last_olc_targ))
  #define GET_LAST_OLC_MODE(ch)	CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->last_olc_mode))
  #define GET_ALIASES(ch)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->aliases))
