#ifndef COMM_H #define COMM_H #include <sys/socket.h> #ifdef _AIX #include <sys/socketvar.h> #endif #include <netinet/in.h> #include <arpa/inet.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include "mudlib/sys/driver_hook.h" #include "uid.h" /* stdin,stdout,stderr,erq,accept,file */ #define MAX_MISC_DESCRIPTORS 6 #define USER_INPUT_BUFSIZE 1024 #ifndef MAX_OUTPUT_PACKET_SIZE #if defined(sgi) && defined(mips) && defined(unix) /* Work around for an irix kernel bug that can leave the process unresponsive * and unkillable. */ #define MAX_OUTPUT_PACKET_SIZE 200 #else #define MAX_OUTPUT_PACKET_SIZE 1024 #endif /* irix */ #endif /* MAX_OUTPUT_PACKET_SIZE */ struct interactive { union svalue object; union svalue hook[NUM_INTERACTIVE_HOOKS]; struct in_addr addr; short socket; short message_length; struct interactive *next_user_for_flush, *previous_user_for_flush; #ifdef ACCESS_CONTROL long access_class; #endif char charset[32]; struct eval_cost eval_cost; p_int last_command_time; p_int total_commands; p_int in_total; p_int out_packets; p_int out_total; char quote_iac; char padding_dummy; char tn_state; char tn_data_state; /* TS_{COMMAND,{CHAR,STRING}MODE,SYNCH} */ char tn_data_state2; /* TS_{COMMAND,{CHAR,STRING}MODE} */ char pad[3]; /* unused */ short input_end; /* first free char in buffer */ short command_start; /* used for charmode */ short command_end; /* where we are up to in player cmd buffer */ short tn_start; /* first char of pending telnet neg */ short tn_end; /* first char to check for telnet negotiation */ short chars_ready; struct interactive *next_pending; /* next user with buffered commands */ /* We rely on input being aligned, thus don't move unaligned stuff in front */ char input[USER_INPUT_BUFSIZE]; char message_buf[MAX_OUTPUT_PACKET_SIZE]; }; extern int comm_nfds; extern struct interactive **pending_link; /* map all user descriptors & interprocess communication descriptors */ extern struct fd_entry { void (*f)(); struct interactive *ip; } fd_table[MAX_USER+MAX_MISC_DESCRIPTORS]; struct interactive *trace_origin; void start_comm(fd_set *); void walk_fdset(fd_set *set, int n); void pending_commands(struct interactive *ip); char *allow_host_access (); #endif /* COMM_H */