#include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <ctype.h> #include <time.h> #include <zlib.h> #include <stdarg.h> /* Utility macros. */ #define HAS_BIT(var, bit) ((var) & (bit)) #define SET_BIT(var, bit) ((var) |= (bit)) #define DEL_BIT(var, bit) ((var) &= (~(bit))) #define TOG_BIT(var, bit) ((var) ^= (bit)) /* Update these to use whatever your MUD uses */ #define RESTRING(point, value) \ { \ STRFREE(point); \ point = strdup(value); \ } #define STRALLOC(point) \ { \ point = strdup(value); \ } #define STRFREE(point) \ { \ free(point); \ point = NULL; \ } /* Typedefs */ typedef struct mud_data MUD_DATA; typedef struct descriptor_data DESCRIPTOR_DATA; #define MAX_SKILL 269 #define MAX_CLASS 8 #define MAX_RACE 16 #define MAX_LEVEL 99 #define MAX_INPUT_LENGTH 2000 #define MAX_STRING_LENGTH 10000 // Must be at least 4 times larger than max input length. #define COMPRESS_BUF_SIZE 10000 #define FALSE 0 #define TRUE 1 #define BV00 (0 << 0) #define BV01 (1 << 0) #define BV02 (1 << 1) #define BV03 (1 << 2) #define BV04 (1 << 3) #define BV05 (1 << 4) #define BV06 (1 << 5) #define BV07 (1 << 6) #define BV08 (1 << 7) #define BV09 (1 << 8) #define BV10 (1 << 9) #define COMM_FLAG_DISCONNECT BV01 #define COMM_FLAG_PASSWORD BV02 #define COMM_FLAG_REMOTEECHO BV03 #define COMM_FLAG_EOR BV04 #define COMM_FLAG_MSDPUPDATE BV05 #define COMM_FLAG_256COLORS BV06 #define MSDP_FLAG_COMMAND BV01 #define MSDP_FLAG_LIST BV02 #define MSDP_FLAG_SENDABLE BV03 #define MSDP_FLAG_REPORTABLE BV04 #define MSDP_FLAG_CONFIGURABLE BV05 #define MSDP_FLAG_REPORTED BV06 #define MSDP_FLAG_UPDATED BV07 // As per the MTTS standard #define MTTS_FLAG_ANSI BV01 #define MTTS_FLAG_VT100 BV02 #define MTTS_FLAG_UTF8 BV03 #define MTTS_FLAG_256COLORS BV04 #define MTTS_FLAG_MOUSETRACKING BV05 #define MTTS_FLAG_COLORPALETTE BV06 #define MTTS_FLAG_SCREENREADER BV07 /* Mud data, structure containing global variables. */ struct mud_data { DESCRIPTOR_DATA * f_desc; DESCRIPTOR_DATA * l_desc; int boot_time; int port; int total_plr; int top_area; int top_help; int top_mob_index; int top_obj_index; int top_room; int msdp_table_size; unsigned char * mccp_buf; }; /* Descriptor (channel) partial structure. */ struct descriptor_data { DESCRIPTOR_DATA * next; void * character; char * host; char outbuf[MAX_STRING_LENGTH]; int outtop; short descriptor; struct msdp_data ** msdp_data; char * terminal_type; char telbuf[MAX_INPUT_LENGTH]; int teltop; long long mtts; int comm_flags; short cols; short rows; z_stream * mccp; }; MUD_DATA *mud; /* mud.c */ void log_printf(char *fmt, ...); int write_to_descriptor(DESCRIPTOR_DATA *d, char *txt, int length); char *capitalize_all(char *str); /* telopt.c */ int translate_telopts ( DESCRIPTOR_DATA *d, char *src, int srclen, char *out ); void debug_telopts ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_do_eor ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_will_ttype ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_sb_ttype_is ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_sb_naws ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_will_new_environ ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_sb_new_environ ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_do_mssp ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_do_msdp ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_sb_msdp ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_do_mccp ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int process_dont_mccp ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); int skip_sb ( DESCRIPTOR_DATA *d, unsigned char *src, int srclen ); void announce_support ( DESCRIPTOR_DATA *d ); void descriptor_printf ( DESCRIPTOR_DATA *d, char *fmt, ...); int start_compress ( DESCRIPTOR_DATA *d ); void end_compress ( DESCRIPTOR_DATA *d ); void process_compressed ( DESCRIPTOR_DATA *d ); void write_compressed ( DESCRIPTOR_DATA *d ); void send_echo_on ( DESCRIPTOR_DATA *d ); void send_echo_off ( DESCRIPTOR_DATA *d ); void send_ga ( DESCRIPTOR_DATA *d ); void send_eor ( DESCRIPTOR_DATA *d ); /* utils.c */ int cat_sprintf ( char *dest, char *fmt, ... ); void arachnos_devel ( char *fmt, ... ); void arachnos_mudlist ( char *fmt, ... ); /* client.c */ int recv_sb_mssp ( unsigned char *src, int srclen ); /* msdp.c */ void init_msdp_table ( void ); void process_msdp_varval ( DESCRIPTOR_DATA *d, char *var, char *val ); void msdp_send_update ( DESCRIPTOR_DATA *d ); void msdp_update_var ( DESCRIPTOR_DATA *d, char *var, char *fmt, ... ); void msdp_update_var_instant ( DESCRIPTOR_DATA *d, char *var, char *fmt, ... ); void msdp_configure_arachnos ( DESCRIPTOR_DATA *d, int index); void msdp_configure_pluginid ( DESCRIPTOR_DATA *d, int index); /* tables.c */ #define ANNOUNCE_WILL BV01 #define ANNOUNCE_DO BV02 extern char *telcmds[]; struct telnet_type { char *name; int flags; }; extern struct telnet_type telnet_table[]; typedef void MSDP_FUN (struct descriptor_data *d, int index); struct msdp_type { char *name; int flags; MSDP_FUN *fun; }; struct msdp_data { char *value; int flags; }; extern struct msdp_type msdp_table[];