// interface.h // // $Id: interface.h,v 1.7 2004/05/13 13:52:24 sdennis Exp $ // #include "copyright.h" #ifndef __INTERFACE__H #define __INTERFACE__H #include <sys/types.h> #ifndef WIN32 #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> #endif // HAVE_SYS_SELECT_H #endif // !WIN32 /* these symbols must be defined by the interface */ /* Disconnection reason codes */ #define R_QUIT 1 /* User quit */ #define R_TIMEOUT 2 /* Inactivity timeout */ #define R_BOOT 3 /* Victim of @boot, @toad, or @destroy */ #define R_SOCKDIED 4 /* Other end of socked closed it */ #define R_GOING_DOWN 5 /* Game is going down */ #define R_BADLOGIN 6 /* Too many failed login attempts */ #define R_GAMEDOWN 7 /* Not admitting users now */ #define R_LOGOUT 8 /* Logged out w/o disconnecting */ #define R_GAMEFULL 9 /* Too many players logged in */ /* Logged out command table definitions */ #define CMD_QUIT 1 #define CMD_WHO 2 #define CMD_DOING 3 #define CMD_PREFIX 5 #define CMD_SUFFIX 6 #define CMD_LOGOUT 7 #define CMD_SESSION 8 #define CMD_PUEBLOCLIENT 9 #define CMD_INFO 10 #define CMD_MASK 0xff #define CMD_NOxFIX 0x100 extern NAMETAB logout_cmdtable[]; typedef struct cmd_block CBLK; typedef struct cmd_block_hdr { struct cmd_block *nxt; } CBLKHDR; typedef struct cmd_block { CBLKHDR hdr; char cmd[LBUF_SIZE - sizeof(CBLKHDR)]; } CBLK; typedef struct text_block TBLOCK; typedef struct text_block_hdr { struct text_block *nxt; char *start; char *end; int nchars; } TBLOCKHDR; typedef struct text_block { TBLOCKHDR hdr; char data[OUTPUT_BLOCK_SIZE - sizeof(TBLOCKHDR)]; } TBLOCK; typedef struct prog_data PROG; struct prog_data { dbref wait_enactor; char *wait_regs[MAX_GLOBAL_REGS]; }; typedef struct descriptor_data DESC; struct descriptor_data { CLinearTimeAbsolute connected_at; CLinearTimeAbsolute last_time; SOCKET descriptor; #ifdef WIN32 // these are for the Windows NT TCP/IO #define SIZEOF_OVERLAPPED_BUFFERS 512 char input_buffer[SIZEOF_OVERLAPPED_BUFFERS]; // buffer for reading char output_buffer[SIZEOF_OVERLAPPED_BUFFERS]; // buffer for writing OVERLAPPED InboundOverlapped; // for asynchronous reading OVERLAPPED OutboundOverlapped; // for asynchronous writing bool bWritePending; // true if in process of writing bool bConnectionDropped; // true if we cannot send to player bool bConnectionShutdown; // true if connection has been shutdown bool bCallProcessOutputLater; // Does the socket need priming for output. #endif // WIN32 int flags; int retries_left; int command_count; int timeout; int host_info; dbref player; char *output_prefix; char *output_suffix; int output_size; int output_tot; int output_lost; TBLOCK *output_head; TBLOCK *output_tail; int input_size; int input_tot; int input_lost; CBLK *input_head; CBLK *input_tail; CBLK *raw_input; char *raw_input_at; int quota; int wait_for_input; /* Used by @prog */ dbref wait_enactor; /* Used by @prog */ PROG *program_data; struct descriptor_data *hashnext; struct descriptor_data *next; struct descriptor_data **prev; struct sockaddr_in address; /* added 3/6/90 SCG */ char addr[51]; char username[11]; char doing[SIZEOF_DOING_STRING]; }; /* flags in the flag field */ #define DS_CONNECTED 0x0001 // player is connected. #define DS_AUTODARK 0x0002 // Wizard was auto set dark. #define DS_PUEBLOCLIENT 0x0004 // Client is Pueblo-enhanced. extern DESC *descriptor_list; /* from the net interface */ extern void emergency_shutdown(void); extern void shutdownsock(DESC *, int); extern void SetupPorts(int *pnPorts, PortInfo aPorts[], IntArray *pia); #ifdef WIN32 extern void shovechars9x(int nPorts, PortInfo aPorts[]); extern void shovecharsNT(int nPorts, PortInfo aPorts[]); void process_output9x(void *, int); void process_outputNT(void *, int); extern FTASK *process_output; #else // WIN32 extern void shovechars(int nPorts, PortInfo aPorts[]); extern void process_output(void *, int); extern void dump_restart_db(void); #endif // WIN32 extern void BuildSignalNamesTable(void); extern void set_signals(void); // from netcommon.cpp extern void make_ulist(dbref, char *, char **, bool); extern void make_port_ulist(dbref, char *, char **); extern int fetch_session(dbref target); extern int fetch_idle(dbref target); extern int fetch_connect(dbref target); extern const char *time_format_1(int Seconds, size_t maxWidth); extern const char *time_format_2(int Seconds); extern void update_quotas(CLinearTimeAbsolute& tLast, const CLinearTimeAbsolute& tCurrent); extern void raw_notify(dbref, const char *); extern void raw_notify_newline(dbref); extern void clearstrings(DESC *); extern void queue_write_LEN(DESC *, const char *, int); extern void queue_write(DESC *, const char *); extern void queue_string(DESC *, const char *); extern void freeqs(DESC *); extern void welcome_user(DESC *); extern void save_command(DESC *, CBLK *); extern void announce_disconnect(dbref, DESC *, const char *); extern int boot_by_port(SOCKET port, bool bGod, const char *message); extern void find_oldest(dbref target, DESC *dOldest[2]); extern void check_idle(void); void Task_ProcessCommand(void *arg_voidptr, int arg_iInteger); extern int site_check(struct in_addr, SITE *); extern dbref find_connected_name(dbref, char *); /* From predicates.c */ #define alloc_desc(s) (DESC *)pool_alloc(POOL_DESC,s, __FILE__, __LINE__) #define free_desc(b) pool_free(POOL_DESC,(char *)(b), __FILE__, __LINE__) // From player.cpp extern void record_login(dbref, bool, char *, char *, char *, char *); extern dbref connect_player(char *, char *, char *, char *, char *); #define DESC_ITER_PLAYER(p,d) \ for (d=(DESC *)hashfindLEN(&(p), sizeof(p), &mudstate.desc_htab); d; d = d->hashnext) #define DESC_ITER_CONN(d) \ for (d=descriptor_list;(d);d=(d)->next) \ if ((d)->flags & DS_CONNECTED) #define DESC_ITER_ALL(d) \ for (d=descriptor_list;(d);d=(d)->next) #define DESC_SAFEITER_PLAYER(p,d,n) \ for (d=(DESC *)hashfindLEN(&(p), sizeof(p), &mudstate.desc_htab), \ n=((d!=NULL) ? d->hashnext : NULL); \ d; \ d=n,n=((n!=NULL) ? n->hashnext : NULL)) #define DESC_SAFEITER_ALL(d,n) \ for (d=descriptor_list,n=((d!=NULL) ? d->next : NULL); \ d; \ d=n,n=((n!=NULL) ? n->next : NULL)) #endif // !__INTERFACE__H