/* * pc.c */ #define PC_FILE #include <ctype.h> #include "config.h" #include "player.h" /* externs */ extern file load_file(); extern char *end_string(), *do_pipe(); extern player *create_player(); extern void destroy_player(), connect(); extern int test_receive(); /* interns */ int main_descriptor; file banish_file, banish_msg, full_msg; void tell_player(); player *input_player; /* a tolower kludge */ char mytolower(char c) { static change = 'a' - 'A'; if (isupper(c)) c += change; return c; } /* close down sockets after use */ void close_down_socket() { /* close(main_descriptor); */ } /* grab the main socket */ void init_socket(int port) { /* drag in all the msg files */ banish_file = load_file("files\\banish"); banish_msg = load_file("files\\banish.msg"); full_msg = load_file("files\\full.msg"); } /* accept new connection on the main socket */ void accept_new_connection() { player *p; int new_socket; new_socket = current_players + 1; if (current_players == max_players) { write(new_socket, full_msg.where, full_msg.length); return; } p = create_player(); input_player = p; current_player = p; p->fd = new_socket; strncpy(p->inet_addr, "Internal Test", MAX_INET_ADDR); connect(p); current_player = 0; } /* dummy functions for echoing */ void password_mode_on(player * p) { } void password_mode_off(player * p) { } /* this routine is called when idle */ void scan_sockets() { player *p; p = input_player; gets(stack); strncpy(p->ibuffer, stack, IBUFFER_LENGTH); p->anticrash = 0; p->flags |= INPUT_READY; p->column = 0; } /* * turns a string said to a player into something ready to go down the telnet * connection */ file process_output(player * p, char *str) { int i; file o; o.where = stack; o.length = 0; if (command_type & ECHO_COM && p->saved_flags & TAG_ECHO) *stack++ = '+'; if (command_type & PERSONAL && p->saved_flags & TAG_PERSONAL) *stack++ = '>'; if (command_type & EVERYONE && p->saved_flags & TAG_SHOUT) *stack++ = '!'; if (command_type & ROOM && p->saved_flags & TAG_ROOM) *stack++ = '-'; if (stack != o.where) { *stack++ = ' '; o.length += 2; } if (p != current_player) { sprintf(stack, "<%d> ", p->fd); while (*stack) { stack++; o.length++; } } if (command_type & ECHO_COM && (command_type & PERSONAL || (p->saved_flags & SEEECHO && p->residency & SEE_ECHO))) { sprintf(stack, "[%s] ", current_player->name); while (*stack) { stack++; o.length++; } } while (*str) { if (p->term_width && (p->column >= p->term_width)) { for (i = 0; i < p->word_wrap; i++, stack--, o.length--) if (isspace(*(--str))) break; if (i != p->word_wrap) { *stack++ = '\r'; *stack++ = '\n'; p->column = 0; str++; o.length += 2; } else { for (; i; stack++, str++, o.length++) i--; *stack++ = '\r'; *stack++ = '\n'; p->column = 0; o.length += 2; } } switch (*str) { case '\n': *stack++ = '\r'; *stack++ = '\n'; p->column = 0; str++; o.length += 2; break; default: *stack++ = *str++; o.length++; p->column++; break; } } return o; } /* generic routine to write to one player */ void tell_player(player * p, char *str) { file output; char *oldstack, *script; oldstack = stack; if (((p->fd) < 0) || (p->flags & PANIC)) return; if (!(sys_flags & PANIC)) if (!test_receive(p)) return; output = process_output(p, str); if (p->script) { script = stack; sprintf(stack, "emergency/%s_emergency", p->lower_name); stack = end_string(stack); log(script, str); stack = script; } if (write(0, output.where, output.length) < 0) { p->flags |= PANIC; log("error", "PANIC trying to write to player."); } stack = oldstack; } /* small derivative of tell player to save typing */ void tell_current(char *str) { if (!current_player) return; tell_player(current_player, str); } /* non blockable raw tell */ void non_block_tell(player * p, char *str) { file output; char *script, *oldstack; oldstack = stack; if (((p->fd) < 0) || (p->flags & PANIC)) return; output = process_output(p, str); if (p->script) { script = stack; sprintf(stack, "emergency/%s_emergency", p->lower_name); stack = end_string(stack); log(script, str); stack = script; } if (write(0, output.where, output.length) < 0) { p->flags |= PANIC; log("error", "PANIC trying to write to player."); } stack = oldstack; } /* create and switch pseudo players */ void psuedo_person(player * p, char *str) { accept_new_connection(); } void switch_person(player * p, char *str) { int new = 0; player *scan; new = atoi(str); if (!new) { tell_player(p, " Argument is a number.\n"); return; } for (scan = flatlist_start; scan; scan = scan->flat_next) if (scan->fd == new) { tell_player(p, " Switching to player.\n"); input_player = scan; return; } tell_player(p, " No such player.\n"); }