cmcs/
cmcs/CVS/
cmcs/Documentation/
cmcs/Documentation/CVS/
cmcs/Historical/CVS/
cmcs/Historical/OldDocumentation/
cmcs/Historical/OldDocumentation/CVS/
cmcs/Historical/OldSource/
cmcs/Historical/OldSource/CVS/
cmcs/makefiles/CVS/
cmcs/src/CVS/
cmcs/tree/CVS/
cmcs/tree/bin/CVS/
cmcs/tree/datafiles/
cmcs/tree/datafiles/CVS/
cmcs/tree/fonts/CVS/
cmcs/tree/helpfiles/CVS/
cmcs/tree/text/
cmcs/tree/text/CVS/
cmcs/tree/userfiles/
cmcs/tree/userfiles/CVS/
cmcs/tree/www/
cmcs/tree/www/CVS/
/**************************************************************************/
/*                       Header file for Crypt v5.3                       */
/************** (Was) Header file for NUTS version 3.2.1 ******************/

#define VERSION "6.0"

/* Various filenames, most files are kept in DATAFILES directory */
#define TEXTFILES "text"
#define DATAFILES "datafiles"
#define USERFILES "userfiles"
#define USERMAIL "usermail"
#define HELPFILES "helpfiles"
#define CONFIGFILE "config"
#define NEWSFILE "newsfile"
#define MAPFILE "mapfile"
#define SITEBAN "siteban"
#define SILENTBAN "silent.ban"
#define PARTIAL_SITEBAN "partial.ban"
#define USERBAN "userban"
#define SYSLOG "var/log/syslog"
#define WHERE_TEXT "where.txt"
#define WHERE_FILE_A "ip_names.a"
#define WHERE_FILE_B "ip_names.b"
#define WHERE_FILE_C "ip_names.c"
#define NEWBIE_MOTD "newbie_motd"
#define RANKS_FILE "ranks"
#define FAQ_FILE "faq"
#define ATMOS_FILE "atmos"
#define TALKERS_FILE "talkers"
#define RULES_FILE "rules"
#define BSX_FILE "datafiles/xtush"

/* These files are kept in the same dir as the executable */
#define MOTD1 "motd1"
#define MOTD2 "motd2"
#define PARTIALBAN_MOTD "motd.ban"

/* Various support files...  Most systems will have zip/pkzip in path */
#define BACKUP_NAME "users.zip"
#define ZIP_EXEC "zip"
#define DOWEB_EXEC "doweb"

/* File of who is currently logged in */
#define WEB_PAGE_FILE "www/who.html"

/* This is the string used by the .thp command */
#define TALKER_HOMEPAGE "~OLSYSTEM INFORMATION:~RS Crypt Homepage - http://churchnet2.ucsm.ac.uk/~crypt\n"

#define OUT_BUFF_SIZE 80
#define MAX_WORDS 10
#define WORD_LEN 80
#define ARR_SIZE 1000
#define MAX_LINES 10
#define MAX_NO_OF_ATMOS 10 /* The amount of lines of atmospherics to allocate memory for */

#define USER_NAME_LEN 12
#define MIN_USER_NAME_LEN 2
#define NO_OF_LICKS 3 /* More than 3 licks and you're off! */
#define USER_DESC_LEN 42 /* Length of desc + pdesc + name */
#define LOG_PHRASE_LEN 78
#define PHRASE_LEN 40
#define PASS_LEN 20 /* only the 1st 8 chars will be used by crypt() though */
#define BUFSIZE 1000
#define ROOM_NAME_LEN 24
#define ROOM_LABEL_LEN 5
#define ROOM_DESC_LEN 1201
#define TOPIC_LEN 67
#define MAX_LINKS 10 
#define SITE_NAME_LEN 80
#define CONV_LINES 50
#define DNL 12

#define SHOW_PRE_LEVEL 3 /* ARCH's get prelogins */

/* For .revtell */
#define REVTELL_LINES 20
#define REVIEW_LEN 161

#define PUBLIC 0
#define PRIVATE 1
#define FIXED_PUBLIC 2
#define FIXED_PRIVATE 3
#define USER_ROOM 4

/* Internal ranks - no need to change these */
#define NEW 0
#define USER 1
#define WIZ 2
#define ARCH 3
#define GOD 4
#define UBERGOTH 5

#define USER_TYPE 0
#define CLONE_TYPE 1
#define CLONE_HEAR_NOTHING 0
#define CLONE_HEAR_SWEARS 1
#define CLONE_HEAR_ALL 2

/* Hardcoded admin password */
#define SU_PASSWORD "scott"
#define ATMOS_CHANCE 2  /* 2% chance of an atmos each cycle */

#define PROMPT_TYPES 3 /* 3 different prompt styles */

/****************************************************************************/

struct user_struct {
  char name[USER_NAME_LEN+1],desc[81],pre_desc[81],pass[PASS_LEN+6];
  char in_phrase[PHRASE_LEN+1],out_phrase[PHRASE_LEN+1];
  char buff[BUFSIZE],site[81],last_site[81],page_file[81];
  char mail_to[WORD_LEN+1],revbuff[REVTELL_LINES][REVIEW_LEN+3];
  char login_phrase[LOG_PHRASE_LEN+1],logout_phrase[LOG_PHRASE_LEN+1];
  char rank[38],old_tell[USER_NAME_LEN+1],ip_name[81],ip_num[20];
  char email[81],www[81],afk_mesg[81];

  unsigned long auth_addr;
  
  int type,port,login,socket,attempts,buffpos,filepos;
  int vis,ignall,prompt,command_mode,muzzled,charmode_echo;
  int level,misc_op,edit_line,charcnt,warned;
  int accreq,last_login_len,ignall_store,clone_hear,afk;
  int edit_op,colour,ignshout,igntell,sex,autologout,revline;
  int tell,licked,been_licked,xterm,termtype,site_port,figlet;
  int vis_email,examined,home,window_x,window_y;

  time_t last_input,last_login,total_login,read_mail;
  char *malloc_start,*malloc_end;

  struct room_struct *room,*invite_room;
  struct user_struct *prev,*next,*owner;
};

typedef struct user_struct* UR_OBJECT;
UR_OBJECT user_first,user_last,create_user();

struct room_struct {
  char name[ROOM_NAME_LEN+1];
  char label[ROOM_LABEL_LEN+1];
  char desc[ROOM_DESC_LEN+1];
  char topic[TOPIC_LEN+1];
  char conv_line[CONV_LINES][161];
  int access; /* public , private etc */
  int cln; /* conversation line number for recording */
  int mesg_cnt, tlock;
  char link_label[MAX_LINKS][ROOM_LABEL_LEN+1]; /* temp store for parse */
  
  struct room_struct *link[MAX_LINKS];
  struct room_struct *prev,*next;
};

typedef struct room_struct *RM_OBJECT;
RM_OBJECT room_first,room_last,create_room();

/****************************************************************************/

char *term_names[]={
"~FRC~FYo~FBl~FGo~FMu~FTr ~RScompatible, Xterm compatible terminal type",
"Non-colour, Xterm compatible terminal type",
"~FRC~FYo~FBl~FGo~FMu~FTr ~RScompatible, non Xterm terminal type",
"Non-colour, non Xterm terminal type"
};

char *syserror="Sorry, a system error has occured";
char *nosuchroom="There is no such room.\n";
char *nosuchuser="There is no such user.\n";
char *notloggedon="There is no one of that name logged on.\n";
char *invisenter="A presence enters the room...\n";
char *invisleave="A presence leaves the room.\n";
char *invisname="A presence";
char *noswearing="Swearing is not allowed here... Not at the moment anyway!\n";

/* Old level names... */
char *level_name[]={
"NEW","USER","WIZ","ARCH","GOD","UBERGOTH","*"
};

/* Keep the names less than or equal to 9 characters for proper formatting */
/* And keep the unknown levels the same as the level_name string above...  The
unknown strings are also used in other bits of the program for various things
(like the min login level bit) */

static char *new_levels[3][8]={
  /* Unknown, male, female */
  {"NEW","USER","WIZ","ARCH","GOD","UBERGOTH","UBERGOTH","*"},
  {"NEW","USER","WARLOCK","SORCEROR","GOD","UBERGOTH","UBERGOTH","*"},
  {"NEW","USERESS","WITCH","SORCERESS","GODDESS","UBERGOTH", "UBERGOTH","*"}
}; 

char *sex_name[]={
"unknown!", "male", "female"
};

/****************************************************************************/

char *command[]={
"quit",    "look",     "mode",      "say",    "shout",
"tell",    "emote",    "semote",    "pemote", "echo",
"go",      "ignall",   "prompt",    "desc",   "inphr",
"outphr",  "public",   "private",   "letmein","invite",
"topic",   "move",     "bcast",     "who",    "people",
"shutdown","news",     "read",      "write",  "join",
"wipe",    "search",   "review",    "help",   "status",
"version", "rmail",    "smail",     "dmail",  "from",
"entpro",  "examine",  "rmst",      "passwd", "kill",
"promote", "demote",   "listbans",  "ban",    "unban",
"vis",     "invis",    "site",      "wake",   "wizshout",
"muzzle",  "unmuzzle", "map",       "logging","minlogin",
"system",  "charecho", "clearline", "fix",    "unfix",
"viewlog", "accreq",   "revclr",    "clone",  "destroy",
"myclones","allclones","swho",      "switch", "csay",   "chear",
"swban",   "afk",      "cls",       "colour", "cemote",
"ignshout","igntell",  "suicide",   "delete", "reboot",
"banner",  "sing",     "think",     "lottery","flowers",   
"lick",    "where",    "myxterm",   "allxterm","sex",
"ranks",   "sos",      "termtype",  "tlock",  
"faq",     "atmos",    "ewtoo",     "nuts",   "hug",
"shark",   "gp",       "revtell",   "logout", "figlet",
"hp",      "thp",      "setrank",   "numpty", "whore",
"admin",   "pdesc",    "auth",      "backup", "doweb",
"ignfig",  "webpage",  "login",     "email",  "vemail",
"www",     "talkers",  "dsay",      "beep",   "newuser",
"bsx",     "gpemote",  "home",      "edit",   "boot",
"rules",   "poke",     "sinfo",     "addwhere","rose",
"window",  "*"
};


/* Values of commands , used in switch in exec_com() */
enum comvals {
QUIT,     LOOK,     MODE,     SAY,    SHOUT,
TELL,     EMOTE,    SEMOTE,   PEMOTE, ECHO,
GO,       IGNALL,   PROMPT,   DESC,   INPHRASE,
OUTPHRASE,PUBCOM,   PRIVCOM,  LETMEIN,INVITE,
TOPIC,    MOVE,     BCAST,    WHO,    PEOPLE,
SHUTDOWN, NEWS,     READ,     WRITE,  JOIN,
WIPE,     SEARCH,   REVIEW,   HELP,   STATUS,
VER,      RMAIL,    SMAIL,    DMAIL,  FROM,
ENTPRO,   EXAMINE,  RMST,     PASSWD, KILL,
PROMOTE,  DEMOTE,   LISTBANS, BAN,    UNBAN,
VIS,      INVIS,    SITE,     WAKE,   WIZSHOUT,
MUZZLE,   UNMUZZLE, MAP,      LOGGING,MINLOGIN,
SYSTEM,   CHARECHO, CLEARLINE,FIX,    UNFIX,
VIEWLOG,  ACCREQ,   REVCLR,   CREATE, DESTROY,
MYCLONES, ALLCLONES,SWHO,     SWITCH, CSAY,   CHEAR,
SWBAN,    AFK,      CLS,      COLOUR, CEMOTE,
IGNSHOUT, IGNTELL,  SUICIDE,  DELETE_C, REBOOT,
BANNER,   SING,     THINK,    LOTTERY,FLOWERS,
LICK,     WHERE,    MYXTERM,  ALLXTERM,SEX,
RANKS,    SOS,      TERMTYPE, TLOCK,
FAQ,      ATMOS,    EWTOO,    NUTS,   HUG,
SHARK,    GP,       REVTELL,  LOGOUT, FIGLET,
HP,       THP,      SETRANK,  NUMPTY, WHORE,
SU,       PDESC,    AUTH,     BACKUP, DOWEB,
IGNFIG,   WEBPAGE,  LOGIN,    EMAIL,  VEMAIL,
WWW,      TALKERS,  DSAY,     BEEP,   NEWUSER,
BSX,      GPEMOTE,  HOME,     EDIT,   BOOT,
RULES,    POKE,     SINFO,    ADDWHERE, ROSE,
WINDOW
} com_num;


/* These are the minimum levels at which the commands can be executed.
	 Alter to suit. */
int com_level[]={
NEW, NEW, NEW, NEW, USER, /* Quit */
USER,NEW,USER,USER,USER,
USER,USER,NEW, USER,USER, /* Go */
USER,USER,USER,USER,USER,
USER,WIZ, ARCH,NEW, WIZ,  /* Topic */
UBERGOTH, USER,NEW, USER,USER,
WIZ, USER,USER,NEW, NEW, /* wipe */
NEW, USER,USER,USER,USER,
USER,USER,NEW, USER,WIZ, /* entpro */
ARCH,ARCH,WIZ, ARCH,ARCH, /* promote */
ARCH,ARCH,WIZ, USER,WIZ,
WIZ, WIZ, USER,UBERGOTH, GOD, /* muzzle */
WIZ, NEW, WIZ, ARCH,ARCH, /* system */
ARCH,NEW, USER,ARCH,ARCH, /* viewlog */
ARCH,USER,NEW, ARCH,ARCH,ARCH, /* with swho added */
ARCH,USER,NEW ,NEW, ARCH,/* swban */
USER,USER,NEW, UBERGOTH, UBERGOTH,
USER,USER,USER,USER,USER, /* banner */
USER,USER,USER,ARCH,NEW,
NEW, NEW, NEW, ARCH, /* ranks */
NEW, ARCH,NEW, NEW, USER,
WIZ, USER,USER,USER,WIZ, /* shark */
USER,WIZ, USER,USER,USER, /* hp */
GOD, USER,GOD, UBERGOTH, UBERGOTH, /* su */
USER,UBERGOTH,USER,NEW,USER, /* ignfig */
USER,USER,USER,WIZ, WIZ,
GOD, USER,USER,USER,USER,
NEW, USER,GOD,UBERGOTH,USER,
NEW
};

/****************************************************************************/

#define NUM_COLS 21

char *colcode[NUM_COLS]={
/* Reset, bold, blink, reverse, underline */
"\033[0m", "\033[1m", "\033[5m", "\033[7m", "\033[4m",
/* Foreground colours:
   black, red, green, yellow/orange
   blue, magenta,turquiose(cyan), white */
"\033[30m","\033[31m","\033[32m","\033[33m",
"\033[34m","\033[35m","\033[36m","\033[37m",
/* Background colours */
"\033[40m","\033[41m","\033[42m","\033[43m",
"\033[44m","\033[45m","\033[46m","\033[47m"
};

/* Codes used in a string to produce the colours when prepended with a '~' */
char *colcom[NUM_COLS]={
"RS","OL","LI","RV","UL",
"FK","FR","FG","FY",
"FB","FM","FT","FW",
"BK","BR","BG","BY",
"BB","BM","BT","BW"
};

/****************************************************************************/

char *month[12]={
"January","February","March","April","May","June",
"July","August","September","October","November","December"
};

char *day[7]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};

char *noyes1[]={ " NO","YES" };
char *noyes2[]={ "NO ","YES" };
char *offon[]={ "OFF","ON " };

/* These MUST be in upper case - the contains_swearing() function converts
   the string to be checked to upper case before it compares it against
   these */
char *swear_words[]={
"FUCK","SHIT","CUNT","BASTARD","*"
};

char atmos_array[MAX_NO_OF_ATMOS][81];
char text[ARR_SIZE*2];
char word[MAX_WORDS][WORD_LEN+1];
char wrd[8][81];
char progname[40],confile[40];
char myos[81],myhost[81];
time_t boot_time;
jmp_buf jmpvar;

int port[2],listen_sock[2],wizport_level,minlogin_level;
int colour_def,password_echo,ignore_sigterm;
int max_users,max_clones,num_of_users,num_of_logins,heartbeat;
int login_idle_time,user_idle_time,config_line,word_count;
int tmonth,tday,tmday,twday,thour,tmin,tsec;
int mesg_life,system_logging,prompt_def,no_prompt;
int force_listen,gatecrash_level,min_private_users;
int ignore_mp_level,destructed,mesg_check_hour,mesg_check_min;
int ban_swearing,crash_action;
int time_out_afks,allow_caps_in_name,atmos,atmos_no;
int backup_check_hour,backup_check_min,backup_on,userweb_on;
int spod_check_hour,spod_check_min,auto_promote;
int web_page_on,save_newbies,command_mode_def;
int total_logins,peak_logins;

#ifdef WIN_NT
HANDLE hThread;
#endif

/* extern char *sys_errlist[]; */
/******************** Figlet globals & defines ************************/
#define FIGLET_FONTS "fonts"

#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
typedef long inchr; /* "char" read from stdin */
inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */

int inchrlinelen,inchrlinelenlimit;
typedef struct fc {
  inchr ord;
  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  struct fc *next;
} fcharnode;

fcharnode *fcharlist;
char **currchar;
int currcharwidth;
char **outline;    /* Alloc'd char outline[charheight][outlinelenlimit+1]; */
int outlinelen;
int justification,right2left;
int outputwidth;
int outlinelenlimit;
char hardblank;
int charheight,defaultmode;

/**************************************************************************/
/* Functions to convert between UNIX/WIN socket functions */
#ifdef WIN_NT
  int READ_S(int sock, char *str, int len) { return recv(sock,str,len,0); }
  int WRITE_S(int sock, char *str, int len) { return send(sock,str,len,0); }
  #define CLOSE closesocket
#else
  #define READ_S read
  #define WRITE_S write
  #define CLOSE close
#endif

/**************************************************************************/