void *queue_write(void *arg) { struct timeval timeout; int res; MYSQL queue_mysql, *queue_conn; mysql_init(&queue_mysql); mysql_options(&queue_mysql, MYSQL_OPT_COMPRESS, 0); queue_conn = mysql_real_connect(&queue_mysql, conf->mysql->host, conf->mysql->username, conf->mysql->password, conf->mysql->database, conf->mysql->port, conf->mysql->unixsock, 0); if (!queue_conn) { log_command(LOG_SERVICES, NULL, "", "mySQL error: %s", mysql_error(&queue_mysql)); quit_service(ERROR_DBASE_MYSQL_ERROR); return NULL; } while (queue_run) { if (queue_next) { struct queue_list *current; current = queue_next; pthread_mutex_lock(&mutex); if (queue_next == queue_last) queue_last = NULL; queue_next = queue_next->next; pthread_mutex_unlock(&mutex); res = mysql_query(queue_conn, current->command); debug_out("[MYSQL] %s\n", current->command); if (res) { log_command(LOG_SERVICES, NULL, "", "mySQL error: \"%s\"", current->command); log_command(LOG_SERVICES, NULL, "", "mySQL error: (%d) %s", res, mysql_error(queue_conn)); } xfree(current->command); xfree(current); } else { timeout.tv_sec = 1; timeout.tv_usec = 0; select(0, NULL, NULL, NULL, &timeout); } } pthread_mutex_destroy(&mutex); mysql_close(queue_conn); mysql_close(&queue_mysql); return NULL; }
/** Main loop for thread that services the control connection of FTP session. */ int control_thread_loop(struct control_thread_info* cti) { int sfd = cti->session->control_socket; fd_set fds; int res; while (!cti->session->terminated && !terminating) { FD_ZERO (&fds); FD_SET (sfd, &fds); res = select(sfd + 1, &fds, NULL, NULL, NULL); if (res == -1) { if (errno != EINTR) FATAL("Waiting for input on control connection socket."); continue; } if (res == 0) continue; char* line = read_line(sfd); if (!line || strlen(line) == 0) { free(line); respond (cti->session, 500, "Connection lost."); cti->session->terminated = 1; break; } log_command (cti->session, line); if (process_ftp_command(cti->session, line) == -1) respond (cti->session, 500, "Unknown or invalid command."); } return 0; }
void quit_got_signal(int sig) { char si[8] = "SIGINT", st[9] = "SIGTERM", *p = si; if (sig == SIGTERM) p = st; debug_out("%s captured... exiting gracefully...\n", p); log_command(LOG_SERVICES, NULL, "", "Service shutdown (caught %s)", p); com_send(irc, "%s Q :Service shutdown\n", conf->cs->numeric); com_send(irc, "%s WA :caught %s - service shutdown\n", conf->os->numeric, p); com_send(irc, "%s SQ %s %lu :caught %s - service shutdown\n", conf->os->numeric, conf->host, conf->starttime, p); exit(1); }
/******************************************************************** NICKS_REMOVE Fjerner en person fra nicks arrayen og free'er alle resourcer som er associeret med den personen Parameter og return: [in] long index = personens numeric [in] long numeric = personens numeric [out] long return < 0 = Fejl >= 0 = OK ********************************************************************/ long nicks_remove(const char *numeric) { long nr, index, i; if ((index = nicks_search_numeric(numeric)) < 0) return index; if ((nr = nicks_search_nick(nicks_num[index]->nick)) < 0) return nr; for (i = nicks[nr]->channels_count; i > 0; i--) { if (channels_userpart(-1, nicks[nr]->channels[i-1]->channel->name, nicks[nr]->numeric) < 0) { debug_out("We're f****d !!!! - %lu %s\n", nicks[nr]->channels_count, nicks[nr]->channels[0]->channel->name); log_command(LOG_SERVICES, NULL, "", "BUG! nicks_remove - %lu %s", nicks[nr]->channels_count, nicks[nr]->channels[0]->channel->name); } } if (nicks[nr]->channels_count) { debug_out("WARNING !!!! Memory leak - not all channels was parted in memory (%lu)!!!!\n", nicks[nr]->channels_count); } dcc_free(nicks[nr]); if (nicks[nr]) { if (nicks[nr]->nickserv) nicks[nr]->nickserv->entry = NULL; xfree(nicks[nr]->nick); xfree(nicks[nr]->numeric); xfree(nicks[nr]->username); xfree(nicks[nr]->host); xfree(nicks[nr]->userinfo); xfree(nicks[nr]->away); xfree(nicks[nr]); } nicks_count--; memmove(&nicks[nr], &nicks[nr+1], (nicks_count - nr) * sizeof(dbase_nicks*)); nicks = (dbase_nicks**)realloc(nicks, nicks_count * sizeof(dbase_nicks*)); memmove(&nicks_num[index], &nicks_num[index+1], (nicks_count - index) * sizeof(dbase_nicks*)); nicks_num = (dbase_nicks**)realloc(nicks_num, nicks_count * sizeof(dbase_nicks*)); return index; }
/* ************************************************************************************************** * main ************************************************************************************************** * Main function ************************************************************************************************** * Params: * std main params ************************************************************************************************** */ int main(int argc, char **argv) { int res; srand((unsigned long)time(NULL)); /* if (fork()) exit(0); */ atexit(quit_do_cleanup); signal(SIGINT, quit_got_signal); signal(SIGTERM, quit_got_signal); signal(SIGHUP, sighup_rehash); if ((res = conf_load())) quit_service(res); if ((res = log_open())) quit_service(res); log_command(LOG_SERVICES, NULL, "", "Services startup"); log_write("#############################################################################\n"); if ((res = dbase_load_persistant())) quit_service(res); if ((res = queue_init())) quit_service(res); help_load(); nickserv_dbase_checkold(NULL); chanserv_dbase_check_expire(NULL); pthread_mutex_init(&sock_mutex, NULL); irc = com_sock_create(SOCK_SERVER); if (!com_connect(irc)) quit_service(ERROR_SERVER_COULD_NOT_CONNECT); irc->buffer[0] = '\0'; res = com_mainloop(); pthread_mutex_destroy(&sock_mutex); quit_service(res); return res; }
void quit_do_cleanup(void) { log_write("#############################################################################\n"); log_command(LOG_SERVICES, NULL, "", "Services shutdown\n\n"); debug_out("==> Starting onexit cleanup...\n"); debug_out(" |==> Closing all sockets and freeing them...\n"); com_free_all(); /* Close ALL connections and free memory */ debug_out(" |==> Executing pending mySQL queries...\n"); queue_wait_until_empty(); /* Make the queue write all the pending data to mySQL before quitting */ debug_out(" |==> Freeing memory used by databases...\n"); help_free(); dbase_clear(); /* Clear the dbase and free memory */ debug_out(" |==> Flushing and closing log files...\n"); log_close(); /* flush and close log files */ debug_out(" |==> Freeing memory used by settings...\n"); conf_unload(); /* free memory taken by config */ debug_out(" |==> Freeing memory used by timers...\n"); timer_freeall(); /* remove all timers */ debug_out(" \\==> Cleanup done, quitting...\n"); }
void process_command(int descr, dbref player, char *command) { char *arg1; char *arg2; char *full_command; char *p; /* utility */ char pbuf[BUFFER_LEN]; char xbuf[BUFFER_LEN]; char ybuf[BUFFER_LEN]; struct timeval starttime; struct timeval endtime; double totaltime; if (command == 0) abort(); /* robustify player */ if (player < 0 || player >= db_top || (Typeof(player) != TYPE_PLAYER && Typeof(player) != TYPE_THING)) { log_status("process_command: bad player %d", player); return; } if ((tp_log_commands || Wizard(OWNER(player)))) { if (!(FLAGS(player) & (INTERACTIVE | READMODE))) { if (!*command) { return; } log_command("%s: %s", whowhere(player), command); } else { if (tp_log_interactive) { log_command("%s: %s%s", whowhere(player), (FLAGS(player) & (READMODE)) ? "[READ] " : "[INTERP] ", command); } } } if (FLAGS(player) & INTERACTIVE) { interactive(descr, player, command); return; } /* eat leading whitespace */ while (*command && isspace(*command)) command++; /* Disable null command once past READ line */ if (!*command) return; /* check for single-character commands */ if (!tp_enable_prefix) { if (*command == SAY_TOKEN) { snprintf(pbuf, sizeof(pbuf), "say %s", command + 1); command = &pbuf[0]; } else if (*command == POSE_TOKEN) { snprintf(pbuf, sizeof(pbuf), "pose %s", command + 1); command = &pbuf[0]; } else if (*command == EXIT_DELIMITER) { snprintf(pbuf, sizeof(pbuf), "delimiter %s", command + 1); command = &pbuf[0]; } } /* profile how long command takes. */ gettimeofday(&starttime, NULL); /* if player is a wizard, and uses overide token to start line... */ /* ... then do NOT run actions, but run the command they specify. */ if (!(TrueWizard(OWNER(player)) && (*command == OVERIDE_TOKEN))) { if (can_move(descr, player, command, 0)) { do_move(descr, player, command, 0); /* command is exact match for exit */ *match_args = 0; *match_cmdname = 0; } else { if (tp_enable_prefix) { if (*command == SAY_TOKEN) { snprintf(pbuf, sizeof(pbuf), "say %s", command + 1); command = &pbuf[0]; } else if (*command == POSE_TOKEN) { snprintf(pbuf, sizeof(pbuf), "pose %s", command + 1); command = &pbuf[0]; } else if (*command == EXIT_DELIMITER) { snprintf(pbuf, sizeof(pbuf), "delimiter %s", command + 1); command = &pbuf[0]; } else { goto bad_pre_command; } if (can_move(descr, player, command, 0)) { do_move(descr, player, command, 0); /* command is exact match for exit */ *match_args = 0; *match_cmdname = 0; } else { goto bad_pre_command; } } else { goto bad_pre_command; } } } else { bad_pre_command: if (TrueWizard(OWNER(player)) && (*command == OVERIDE_TOKEN)) command++; full_command = strcpyn(xbuf, sizeof(xbuf), command); for (; *full_command && !isspace(*full_command); full_command++) ; if (*full_command) full_command++; /* find arg1 -- move over command word */ command = strcpyn(ybuf, sizeof(ybuf), command); for (arg1 = command; *arg1 && !isspace(*arg1); arg1++) ; /* truncate command */ if (*arg1) *arg1++ = '\0'; /* remember command for programs */ strcpyn(match_args, sizeof(match_args), full_command); strcpyn(match_cmdname, sizeof(match_cmdname), command); /* move over spaces */ while (*arg1 && isspace(*arg1)) arg1++; /* find end of arg1, start of arg2 */ for (arg2 = arg1; *arg2 && *arg2 != ARG_DELIMITER; arg2++) ; /* truncate arg1 */ for (p = arg2 - 1; p >= arg1 && isspace(*p); p--) *p = '\0'; /* go past delimiter if present */ if (*arg2) *arg2++ = '\0'; while (*arg2 && isspace(*arg2)) arg2++; switch (command[0]) { case '@': switch (command[1]) { case 'a': case 'A': /* @action, @armageddon, @attach */ switch (command[2]) { case 'c': case 'C': Matched("@action"); NOGUEST("@action", player); BUILDERONLY("@action", player); do_action(descr, player, arg1, arg2); break; case 'r': case 'R': if (strcmp(command, "@armageddon")) goto bad; /* WIZARDONLY("@armageddon", player); PLAYERONLY("@armageddon", player); */ do_armageddon(player, full_command); break; case 't': case 'T': Matched("@attach"); NOGUEST("@attach", player); BUILDERONLY("@attach", player); do_attach(descr, player, arg1, arg2); break; default: goto bad; } break; case 'b': case 'B': /* @bless, @boot */ switch (command[2]) { case 'l': case 'L': Matched("@bless"); WIZARDONLY("@bless", player); PLAYERONLY("@bless", player); NOFORCE("@bless", force_level, player); do_bless(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("@boot"); WIZARDONLY("@boot", player); PLAYERONLY("@boot", player); do_boot(player, arg1); break; default: goto bad; } break; case 'c': case 'C': /* @chlock, @chown, @chown_lock, @clone, @conlock, @contents, @create, @credits */ switch (command[2]) { case 'h': case 'H': switch (command[3]) { case 'l': case 'L': Matched("@chlock"); NOGUEST("@chlock", player); set_standard_lock(descr, player, arg1, MESGPROP_CHLOCK, "Chown Lock", arg2); break; case 'o': case 'O': if(strlen(command) < 7) { Matched("@chown"); do_chown(descr, player, arg1, arg2); } else { Matched("@chown_lock"); NOGUEST("@chown_lock", player); set_standard_lock(descr, player, arg1, MESGPROP_CHLOCK, "Chown Lock", arg2); } break; default: goto bad; } break; case 'l': case 'L': Matched("@clone"); NOGUEST("@clone", player); BUILDERONLY("@clone", player); do_clone(descr, player, arg1); break; case 'o': case 'O': switch (command[4]) { case 'l': case 'L': Matched("@conlock"); NOGUEST("@conlock", player); set_standard_lock(descr, player, arg1, MESGPROP_CONLOCK, "Container Lock", arg2); break; case 't': case 'T': Matched("@contents"); do_contents(descr, player, arg1, arg2); break; default: goto bad; } break; case 'r': case 'R': if (string_compare(command, "@credits")) { Matched("@create"); NOGUEST("@create", player); BUILDERONLY("@create", player); do_create(player, arg1, arg2); } else { do_credits(player); } break; default: goto bad; } break; case 'd': case 'D': /* @dbginfo, @describe, @dig, @doing, @drop, @dump */ switch (command[2]) { #ifdef DISKBASE case 'b': case 'B': Matched("@dbginfo"); WIZARDONLY("@dbginfo", player); diskbase_debug(player); break; #endif case 'e': case 'E': Matched("@describe"); NOGUEST("@describe", player); set_standard_property(descr, player, arg1, MESGPROP_DESC, "Object Description", arg2); break; case 'i': case 'I': Matched("@dig"); NOGUEST("@dig", player); BUILDERONLY("@dig", player); do_dig(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("@doing"); if (!tp_who_doing) goto bad; NOGUEST("@doing", player); set_standard_property(descr, player, arg1, MESGPROP_DOING, "Doing", arg2); break; case 'r': case 'R': Matched("@drop"); NOGUEST("@drop", player); set_standard_property(descr, player, arg1, MESGPROP_DROP, "Drop Message", arg2); break; case 'u': case 'U': Matched("@dump"); WIZARDONLY("@dump", player); PLAYERONLY("@dump", player); do_dump(player, full_command); break; default: goto bad; } break; case 'e': case 'E': /* @edit, @entrances, @examine */ switch (command[2]) { case 'd': case 'D': Matched("@edit"); NOGUEST("@edit", player); PLAYERONLY("@edit", player); MUCKERONLY("@edit", player); do_edit(descr, player, arg1); break; case 'n': case 'N': Matched("@entrances"); do_entrances(descr, player, arg1, arg2); break; case 'x': case 'X': Matched("@examine"); GODONLY("@examine", player); sane_dump_object(player, arg1); break; default: goto bad; } break; case 'f': case 'F': /* @fail, @find, @flock, @force, @force_lock */ switch (command[2]) { case 'a': case 'A': Matched("@fail"); NOGUEST("@fail", player); set_standard_property(descr, player, arg1, MESGPROP_FAIL, "Fail Message", arg2); break; case 'i': case 'I': Matched("@find"); do_find(player, arg1, arg2); break; case 'l': case 'L': Matched("@flock"); NOGUEST("@flock", player); NOFORCE("@flock", force_level, player); set_standard_lock(descr, player, arg1, MESGPROP_FLOCK, "Force Lock", arg2); break; case 'o': case 'O': if(strlen(command) < 7) { Matched("@force"); do_force(descr, player, arg1, arg2); } else { Matched("@force_lock"); NOGUEST("@force_lock", player); NOFORCE("@force_lock", force_level, player); set_standard_lock(descr, player, arg1, MESGPROP_FLOCK, "Force Lock", arg2); } break; default: goto bad; } break; case 'h': case 'H': /* @hashes */ Matched("@hashes"); do_hashes(player, arg1); break; case 'i': case 'I': /* @idescribe */ Matched("@idescribe"); NOGUEST("@idescribe", player); set_standard_property(descr, player, arg1, MESGPROP_IDESC, "Inside Description", arg2); break; case 'k': case 'K': /* @kill */ Matched("@kill"); do_dequeue(descr, player, arg1); break; case 'l': case 'L': /* @link, @list, @lock */ switch (command[2]) { case 'i': case 'I': switch (command[3]) { case 'n': case 'N': Matched("@link"); NOGUEST("@link", player); do_link(descr, player, arg1, arg2); break; case 's': case 'S': Matched("@list"); match_and_list(descr, player, arg1, arg2); break; default: goto bad; } break; case 'o': case 'O': Matched("@lock"); NOGUEST("@lock", player); set_standard_lock(descr, player, arg1, MESGPROP_LOCK, "Lock", arg2); break; default: goto bad; } break; case 'm': case 'M': /* @mcpedit, @mcpprogram, @memory, @mpitops, @muftops */ switch (command[2]) { #ifdef MCP_SUPPORT case 'c': case 'C': if (string_prefix("@mcpedit", command)) { Matched("@mcpedit"); NOGUEST("@mcpedit", player); PLAYERONLY("@mcpedit", player); MUCKERONLY("@mcpedit", player); do_mcpedit(descr, player, arg1); break; } else { Matched("@mcpprogram"); NOGUEST("@mcpprogram", player); PLAYERONLY("@mcpprogram", player); MUCKERONLY("@mcpprogram", player); do_mcpprogram(descr, player, arg1); break; } #endif #ifndef NO_MEMORY_COMMAND case 'e': case 'E': Matched("@memory"); WIZARDONLY("@memory", player); do_memory(player); break; #endif case 'p': case 'P': Matched("@mpitops"); WIZARDONLY("@mpitops", player); do_mpi_topprofs(player, arg1); break; case 'u': case 'U': Matched("@muftops"); WIZARDONLY("@muftops", player); do_muf_topprofs(player, arg1); break; default: goto bad; } break; case 'n': case 'N': /* @name, @newpassword */ switch (command[2]) { case 'a': case 'A': Matched("@name"); NOGUEST("@name", player); do_name(descr, player, arg1, arg2); break; case 'e': case 'E': if (strcmp(command, "@newpassword")) goto bad; WIZARDONLY("@newpassword", player); PLAYERONLY("@newpassword", player); do_newpassword(player, arg1, arg2); break; default: goto bad; } break; case 'o': case 'O': /* @odrop, @oecho, @ofail, @open, @osuccess, @owned */ switch (command[2]) { case 'd': case 'D': Matched("@odrop"); NOGUEST("@odrop", player); set_standard_property(descr, player, arg1, MESGPROP_ODROP, "ODrop Message", arg2); break; case 'e': case 'E': Matched("@oecho"); NOGUEST("@oecho", player); set_standard_property(descr, player, arg1, MESGPROP_OECHO, "Outside-echo Prefix", arg2); break; case 'f': case 'F': Matched("@ofail"); NOGUEST("@ofail", player); set_standard_property(descr, player, arg1, MESGPROP_OFAIL, "OFail Message", arg2); break; case 'p': case 'P': Matched("@open"); NOGUEST("@open", player); BUILDERONLY("@open", player); do_open(descr, player, arg1, arg2); break; case 's': case 'S': Matched("@osuccess"); NOGUEST("@osuccess", player); set_standard_property(descr, player, arg1, MESGPROP_OSUCC, "OSuccess Message", arg2); break; case 'w': case 'W': Matched("@owned"); do_owned(player, arg1, arg2); break; default: goto bad; } break; case 'p': case 'P': /* @password, @pcreate, @pecho, @program, @propset, @ps */ switch (command[2]) { case 'a': case 'A': Matched("@password"); PLAYERONLY("@password", player); NOGUEST("@password", player); do_password(player, arg1, arg2); break; case 'c': case 'C': Matched("@pcreate"); WIZARDONLY("@pcreate", player); PLAYERONLY("@pcreate", player); do_pcreate(player, arg1, arg2); break; case 'e': case 'E': Matched("@pecho"); NOGUEST("@pecho", player); set_standard_property(descr, player, arg1, MESGPROP_PECHO, "Puppet-echo Prefix", arg2); break; case 'r': case 'R': if (string_prefix("@program", command)) { Matched("@program"); NOGUEST("@program", player); PLAYERONLY("@program", player); MUCKERONLY("@program", player); do_prog(descr, player, arg1); break; } else { Matched("@propset"); NOGUEST("@propset", player); do_propset(descr, player, arg1, arg2); break; } case 's': case 'S': Matched("@ps"); list_events(player); break; default: goto bad; } break; case 'r': case 'R': /* @recycle, @reconfiguressl, @relink, @restart, @restrict */ switch (command[3]) { case 'c': case 'C': #ifdef USE_SSL if (!strcmp(command, "@reconfiguressl")) { WIZARDONLY("@reconfiguressl", player); PLAYERONLY("@reconfiguressl", player); do_reconfigure_ssl(player); break; } #endif Matched("@recycle"); NOGUEST("@recycle", player); do_recycle(descr, player, arg1); break; case 'l': case 'L': Matched("@relink"); NOGUEST("@relink", player); do_relink(descr, player, arg1, arg2); break; case 's': case 'S': if (!strcmp(command, "@restart")) { /* WIZARDONLY("@restart", player); PLAYERONLY("@restart", player); */ do_restart(player); } else if (!strcmp(command, "@restrict")) { WIZARDONLY("@restrict", player); PLAYERONLY("@restrict", player); do_restrict(player, arg1); } else { goto bad; } break; default: goto bad; } break; case 's': case 'S': /* @sanity, @sanchange, @sanfix, @set, @shutdown, @stats, @success, @sweep */ switch (command[2]) { case 'a': case 'A': if (!strcmp(command, "@sanity")) { GODONLY("@sanity", player); sanity(player); } else if (!strcmp(command, "@sanchange")) { GODONLY("@sanchange", player); sanechange(player, full_command); } else if (!strcmp(command, "@sanfix")) { GODONLY("@sanfix", player); sanfix(player); } else { goto bad; } break; case 'e': case 'E': Matched("@set"); NOGUEST("@set", player); do_set(descr, player, arg1, arg2); break; case 'h': case 'H': if (strcmp(command, "@shutdown")) goto bad; /* WIZARDONLY("@shutdown", player); PLAYERONLY("@shutdown", player); */ do_shutdown(player); break; case 't': case 'T': Matched("@stats"); do_stats(player, arg1); break; case 'u': case 'U': Matched("@success"); NOGUEST("@success", player); set_standard_property(descr, player, arg1, MESGPROP_SUCC, "Success Message", arg2); break; case 'w': case 'W': Matched("@sweep"); do_sweep(descr, player, arg1); break; default: goto bad; } break; case 't': case 'T': /* @teleport, @toad, @trace, @tune */ switch (command[2]) { case 'e': case 'E': Matched("@teleport"); do_teleport(descr, player, arg1, arg2); break; case 'o': case 'O': if (!strcmp(command, "@toad")) { WIZARDONLY("@toad", player); PLAYERONLY("@toad", player); do_toad(descr, player, arg1, arg2); } else if (!strcmp(command, "@tops")) { WIZARDONLY("@tops", player); do_all_topprofs(player, arg1); } else { goto bad; } break; case 'r': case 'R': Matched("@trace"); do_trace(descr, player, arg1, atoi(arg2)); break; case 'u': case 'U': Matched("@tune"); WIZARDONLY("@tune", player); PLAYERONLY("@tune", player); do_tune(player, arg1, arg2, !!strchr(full_command, ARG_DELIMITER)); break; default: goto bad; } break; case 'u': case 'U': /* @unbless, @unlink, @unlock, @uncompile, @usage */ switch (command[2]) { case 'N': case 'n': if (string_prefix(command, "@unb")) { Matched("@unbless"); WIZARDONLY("@unbless", player); PLAYERONLY("@unbless", player); NOFORCE("@unbless", force_level, player); do_unbless(descr, player, arg1, arg2); } else if (string_prefix(command, "@unli")) { Matched("@unlink"); NOGUEST("@unlink", player); do_unlink(descr, player, arg1); } else if (string_prefix(command, "@unlo")) { Matched("@unlock"); NOGUEST("@unlock", player); set_standard_lock(descr, player, arg1, MESGPROP_LOCK, "Lock", ""); } else if (string_prefix(command, "@uncom")) { Matched("@uncompile"); WIZARDONLY("@uncompile", player); PLAYERONLY("@uncompile", player); do_uncompile(player); } else { goto bad; } break; #ifndef NO_USAGE_COMMAND case 'S': case 's': Matched("@usage"); WIZARDONLY("@usage", player); do_usage(player); break; #endif default: goto bad; break; } break; case 'v': case 'V': /* @version */ Matched("@version"); do_version(player); break; case 'w': case 'W': /* @wall */ if (strcmp(command, "@wall")) goto bad; WIZARDONLY("@wall", player); PLAYERONLY("@wall", player); do_wall(player, full_command); break; default: goto bad; } break; case 'd': case 'D': /* disembark, drop */ switch (command[1]) { case 'i': case 'I': Matched("disembark"); do_leave(descr, player); break; case 'r': case 'R': Matched("drop"); do_drop(descr, player, arg1, arg2); break; default: goto bad; } break; case 'e': case 'E': /* examine */ Matched("examine"); do_examine(descr, player, arg1, arg2); break; case 'g': case 'G': /* get, give, goto, gripe */ switch (command[1]) { case 'e': case 'E': Matched("get"); do_get(descr, player, arg1, arg2); break; case 'i': case 'I': Matched("give"); do_give(descr, player, arg1, atoi(arg2)); break; case 'o': case 'O': Matched("goto"); do_move(descr, player, arg1, 0); break; case 'r': case 'R': if (string_compare(command, "gripe")) goto bad; do_gripe(player, full_command); break; default: goto bad; } break; case 'h': case 'H': /* help */ Matched("help"); do_help(player, arg1, arg2); break; case 'i': case 'I': /* inventory, info */ if (string_compare(command, "info")) { Matched("inventory"); do_inventory(player); } else { Matched("info"); do_info(player, arg1, arg2); } break; case 'k': case 'K': /* kill */ Matched("kill"); do_kill(descr, player, arg1, atoi(arg2)); break; case 'l': case 'L': /* leave, look */ if (string_prefix("look", command)) { Matched("look"); do_look_at(descr, player, arg1, arg2); break; } else { Matched("leave"); do_leave(descr, player); break; } case 'm': case 'M': /* man, motd, move, mpi */ if (string_prefix(command, "move")) { do_move(descr, player, arg1, 0); break; } else if (!string_compare(command, "motd")) { do_motd(player, full_command); break; } else if (!string_compare(command, "mpi")) { do_mpihelp(player, arg1, arg2); break; } else { if (string_compare(command, "man")) goto bad; do_man(player, (!*arg1 && !*arg2 && arg1 != arg2) ? "=" : arg1, arg2); } break; case 'n': case 'N': /* news */ Matched("news"); do_news(player, arg1, arg2); break; case 'p': case 'P': /* page, pose, put */ switch (command[1]) { case 'a': case 'A': Matched("page"); do_page(player, arg1, arg2); break; case 'o': case 'O': Matched("pose"); do_pose(player, full_command); break; case 'u': case 'U': Matched("put"); do_drop(descr, player, arg1, arg2); break; default: goto bad; } break; case 'r': case 'R': /* read, rob */ switch (command[1]) { case 'e': case 'E': Matched("read"); /* undocumented alias for look */ do_look_at(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("rob"); do_rob(descr, player, arg1); break; default: goto bad; } break; case 's': case 'S': /* say, score */ switch (command[1]) { case 'a': case 'A': Matched("say"); do_say(player, full_command); break; case 'c': case 'C': Matched("score"); do_score(player); break; default: goto bad; } break; case 't': case 'T': /* take, throw */ switch (command[1]) { case 'a': case 'A': Matched("take"); do_get(descr, player, arg1, arg2); break; case 'h': case 'H': Matched("throw"); do_drop(descr, player, arg1, arg2); break; default: goto bad; } break; case 'w': case 'W': /* whisper */ Matched("whisper"); do_whisper(descr, player, arg1, arg2); break; default: bad: if (tp_m3_huh != 0) { char hbuf[BUFFER_LEN]; snprintf(hbuf,BUFFER_LEN,"HUH? %s", command); if(can_move(descr, player, hbuf, 3)) { do_move(descr, player, hbuf, 3); *match_args = 0; *match_cmdname = 0; break; } } notify(player, tp_huh_mesg); if (tp_log_failed_commands && !controls(player, LOCATION(player))) { log_status("HUH from %s(%d) in %s(%d)[%s]: %s %s", NAME(player), player, NAME(LOCATION(player)), LOCATION(player), NAME(OWNER(LOCATION(player))), command, full_command); } break; } } /* calculate time command took. */ gettimeofday(&endtime, NULL); if (starttime.tv_usec > endtime.tv_usec) { endtime.tv_usec += 1000000; endtime.tv_sec -= 1; } endtime.tv_usec -= starttime.tv_usec; endtime.tv_sec -= starttime.tv_sec; totaltime = endtime.tv_sec + (endtime.tv_usec * 1.0e-6); if (totaltime > (tp_cmd_log_threshold_msec / 1000.0)) { log2file(LOG_CMD_TIMES, "%6.3fs, %.16s: %s: %s", totaltime, ctime((time_t *)&starttime.tv_sec), whowhere(player), command); } }
/* ************************************************************************************************** * quit_service ************************************************************************************************** * General function which call misc. clean-up-functions ************************************************************************************************** * Params: * [IN] int errno - error number to write to log-file - see errors.h for more info. ************************************************************************************************** */ void quit_service(int errnr) { log_command(LOG_SERVICES, NULL, "", "Service quit with errno %d (%s)", errnr, error_getstring(errnr)); if (errnr == ERROR_OPERSERV_DIE) exit(0); else exit(errnr); }
void sc499_device::write_command_port(UINT8 data) { m_command = data; log_command(data); }
void threecom3c505_device::write_command_port(UINT8 data) { LOG2(("writing 3C505 command port %02x - m_status=%02x m_control=%02x m_command_index=%02x", data, m_status, m_control, m_command_index)); if (m_command_index == 0) { switch (data) { case 0: LOG2(("!!! writing 3C505 Command Register = %02x", data)); // spurious data; reset? break; case CMD_TRANSMIT_PACKET_F9: // read data length from data port (not from command port) m_tx_data_buffer.reset(); m_status |= HRDY; /* data register ready */ m_command_buffer[m_command_index++] = data; set_command_pending(1); break; default: m_command_buffer[m_command_index++] = data; set_command_pending(1); break; } } else if ((m_control & HSF_PCB_MASK) != HSF_PCB_END) { m_command_buffer[m_command_index++] = data; } else { m_status &= ~ASF_PCB_MASK; m_status |= (data == m_command_index) ? ASF_PCB_END : ASF_PCB_NAK; log_command(); switch (m_command_buffer[0]) { case CMD_TRANSMIT_PACKET_18: // read transmit data into m_tx_data_buffer m_tx_data_buffer.reset(); m_tx_data_length = m_command_buffer[2] + (m_command_buffer[3] << 8); m_status |= HRDY; /* data register ready */ break; case CMD_TRANSMIT_PACKET: // read transmit data into m_tx_data_buffer m_tx_data_buffer.reset(); m_tx_data_length = m_command_buffer[6] + (m_command_buffer[7] << 8); m_status |= HRDY; /* data register ready */ break; case CMD_DOWNLOAD_PROGRAM: // read program data into m_program_buffer m_program_buffer.reset(); m_program_length = m_command_buffer[2] + (m_command_buffer[3] << 8); m_status |= HRDY; /* data register ready */ break; case CMD_NETWORK_STATISTICS: // 0x0a case CMD_EXECUTE_PROGRAM: // 0x0e case CMD_ADAPTER_INFO: // 0x11 // delay command execution m_do_command_timer->adjust(attotime::from_usec(100)); break; default: do_command(); break; } } m_status |= HCRE; /* command register empty */ }
void threecom3c505_device::write_data_port(UINT8 data) { if (m_control & FLSH) { // flush input data } else if ((m_status & HRDY) == 0) { // this happened in ether.dex Test 20/1 LOG(("write_data_port: failed to write tx data (data register not ready), data length=%x status=%x", m_tx_data_buffer.get_length(), m_status)); } #if 0 else if (m_command_buffer[0] == CMD_MC_F8) { // FIXME: what does it do? LOG(("write_data_port: !!! TODO: CMD_MC_F8 !!! command=%x data=%02x", m_command_buffer[0], data)); } #endif else if (m_command_buffer[0] == CMD_TRANSMIT_PACKET_F9) { switch (m_command_index) { case 1: m_command_buffer[m_command_index++] = data; break; case 2: m_command_buffer[m_command_index++] = data; m_tx_data_length = m_command_buffer[1] + (m_command_buffer[2] << 8); log_command(); break; default: if (!m_tx_data_buffer.append(data)) { LOG(("write_data_port: failed to write tx data (buffer size exceeded), data length=%x", m_tx_data_buffer.get_length())); } if (m_tx_data_buffer.get_length() == m_tx_data_length) { // CMD_TRANSMIT_PACKET_COMPLETE m_tx_data_buffer.log("Tx Data"); do_command(); } break; } } else if (m_command_buffer[0] == CMD_TRANSMIT_PACKET || // m_command_buffer[0] == CMD_TRANSMIT_PACKET_18) { if (!m_tx_data_buffer.append(data)) { LOG(("write_data_port: failed to write tx data (buffer size exceeded), data length=%x", m_tx_data_buffer.get_length())); } if (m_tx_data_buffer.get_length() == m_tx_data_length) { // CMD_TRANSMIT_PACKET_COMPLETE m_tx_data_buffer.log("Tx Data"); do_command(); } } else if (m_command_buffer[0] == CMD_DOWNLOAD_PROGRAM) { if (!m_program_buffer.append(data)) { LOG(("write_data_port: failed to write program data (buffer size exceeded), data length=%x", m_program_buffer.get_length())); } if (m_program_buffer.get_length() == m_program_length) { m_program_buffer.log("Program Data"); do_command(); } } else if (m_tx_data_buffer.get_length() < PORT_DATA_FIFO_SIZE) { // write to data fifo if (!m_tx_data_buffer.append(data)) { LOG(("write_data_port: failed to write tx data (buffer size exceeded), data length=%x", m_tx_data_buffer.get_length())); } } else { LOG(("write_data_port: unexpected command %02x data=%02x", m_command_buffer[0], data)); } if (m_tx_data_buffer.get_length() >= PORT_DATA_FIFO_SIZE && m_tx_data_buffer.get_length() >= m_tx_data_length) { m_status &= ~HRDY; /* data register not ready */ if (m_tx_data_buffer.get_length() > PORT_DATA_FIFO_SIZE && m_tx_data_buffer.get_length() > m_tx_data_length) { LOG(("write_data_port: port_data tx fifo exhausted, data length=%x status=%x", m_tx_data_buffer.get_length(), m_status)); } } }
void threecom3c505_device::write_command_port( UINT8 data) { LOG2(("writing 3C505 command port %02x - m_status=%02x m_control=%02x m_command_index=%02x", data, m_status, m_control, m_command_index)); if ((m_control & HSF_PCB_MASK) != HSF_PCB_END) { m_command_buffer[m_command_index++] = data; m_status |= HCRE; /* command register empty */ if (m_command_index == 1) { switch (data) { case 0: // spurious data; set command register empty m_command_index = 0; m_status |= HCRE; break; case CMD_MC_F9: // case CMD_MC_FA: // read data length from data port (not from command port) m_tx_data_buffer.reset(); m_status |= HRDY; /* data register ready */ set_command_pending(1); break; default: set_command_pending(1); break; } } } else { m_status &= ~ASF_PCB_MASK; m_status |= (data == m_command_index) ? ASF_PCB_END : ASF_PCB_NAK; log_command(); switch (m_command_buffer[0]) { case CMD_TRANSMIT_PACKET_18: // read transmit data into m_tx_data_buffer m_tx_data_buffer.reset(); m_tx_data_length = m_command_buffer[2] + (m_command_buffer[3] << 8); m_status |= HRDY; /* data register ready */ break; case CMD_TRANSMIT_PACKET: // read transmit data into m_tx_data_buffer m_tx_data_buffer.reset(); m_tx_data_length = m_command_buffer[6] + (m_command_buffer[7] << 8); m_status |= HRDY; /* data register ready */ break; case CMD_DOWNLOAD_PROGRAM: // read program data into m_program_buffer m_program_buffer.reset(); m_program_length = m_command_buffer[2] + (m_command_buffer[3] << 8); m_status |= HRDY; /* data register ready */ break; default: do_command(); break; } } }
void process_command(int descr, dbref player, char *command) { char *arg1; char *arg2; char *full_command, *commandline=command, *commandstuff; char *p; /* utility */ char pbuf[BUFFER_LEN]; char xbuf[BUFFER_LEN]; char ybuf[BUFFER_LEN]; const char *path; struct frame *tmpfr; if (command == 0) abort(); /* robustify player */ if (player < 0 || player >= db_top || (Typeof(player) != TYPE_PLAYER && Typeof(player) != TYPE_THING)) { log_status("process_command: bad player %d\n", player); return; } if ((tp_log_commands || (tp_log_guests && Guest(OWNER(player)))) && (!(FLAGS(player)&(INTERACTIVE | READMODE)))) { log_command("%s%s%s%s(%d) in %s(%d):%s %s\n", Mage(OWNER(player)) ? "WIZ: " : "", (Typeof(player) != TYPE_PLAYER) ? NAME(player) : "", (Typeof(player) != TYPE_PLAYER) ? " by " : "", NAME(OWNER(player)), (int) player, NAME(DBFETCH(player)->location), (int) DBFETCH(player)->location, (FLAGS(player) & INTERACTIVE) ? " [interactive]" : " ", command); } if (FLAGS(player) & INTERACTIVE) { interactive(descr, player, command); return; } /* eat leading whitespace */ while (*command && isspace(*command)) command++; commandstuff = command; /* check for single-character commands */ if (*command == SAY_TOKEN || *command == '\'') { sprintf(pbuf, "say %s", command + 1); command = &pbuf[0]; } else if (*command == POSE_TOKEN || *command == ';') { sprintf(pbuf, "pose %s", command + 1); command = &pbuf[0]; } else if ((*command == '|' || (*commandstuff++ == '\\' && *commandstuff == '\\') ) && can_move(descr, player, "spoof", 0)) { if(*command = '\\') sprintf(pbuf, "spoof %s", command + 2); else sprintf(pbuf, "spoof %s", command + 1); command = &pbuf[0]; } /* if player is a wizard, and uses overide token to start line...*/ /* ... then do NOT run actions, but run the command they specify. */ if (!strcmp(command, WHO_COMMAND)) { char xxbuf[BUFFER_LEN]; strcpy(xxbuf, "@"); strcat(xxbuf, WHO_COMMAND); strcat(xxbuf, " "); strcat(xxbuf, command + sizeof(WHO_COMMAND) - 1); if (can_move(descr, player, xxbuf, 5)) { do_move(descr, player, xxbuf, 5); } else { pdump_who_users(descr, command + sizeof(WHO_COMMAND) - 1); } return; } if (!( *command == OVERIDE_TOKEN && TMage(player) )) { if( can_move(descr, player, command, 0) ) { do_move(descr, player, command, 0); /* command is exact match for exit */ *match_args = 0; *match_cmdname = 0; return; } } if (*command == OVERIDE_TOKEN && TMage(player)) command++; full_command = strcpy(xbuf, command); for (; *full_command && !isspace(*full_command); full_command++); if (*full_command) full_command++; /* find arg1 -- move over command word */ command = strcpy(ybuf, command); for (arg1 = command; *arg1 && !isspace(*arg1); arg1++); /* truncate command */ if (*arg1) *arg1++ = '\0'; /* remember command for programs */ strcpy(match_cmdname, command); /* move over spaces */ while (*arg1 && isspace(*arg1)) arg1++; /* find end of arg1, start of arg2 */ for (arg2 = arg1; *arg2 && *arg2 != ARG_DELIMITER; arg2++); /* truncate arg1 */ for (p = arg2 - 1; p >= arg1 && isspace(*p); p--) *p = '\0'; /* go past delimiter if present */ if (*arg2) *arg2++ = '\0'; while (*arg2 && isspace(*arg2)) arg2++; strcpy(match_cmdname, command); strcpy(match_args, full_command); switch (command[0]) { case '@': switch (command[1]) { case 'a': case 'A': /* @action, @attach */ switch (command[2]) { case 'c': case 'C': Matched("@action"); do_action(descr, player, arg1, arg2); break; case 'r': case 'R': if (string_compare(command, "@armageddon")) goto bad; do_armageddon(player, full_command); break; case 't': case 'T': Matched("@attach"); do_attach(descr, player, arg1, arg2); break; case 'n': case 'N': Matched("@ansidescribe"); do_ansidescribe(descr, player, arg1, arg2); break; default: goto bad; } break; case 'b': case 'B': Matched("@boot"); do_boot(player, arg1); break; case 'c': case 'C': /* chown, contents, create */ switch (command[2]) { case 'h': case 'H': switch (command[3]) { case 'l': case 'L': Matched("@chlock"); do_chlock(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("@chown"); do_chown(descr, player, arg1, arg2); break; default: goto bad; } break; case 'o': case 'O': switch (command[4]) { case 'l': case 'L': Matched("@conlock"); do_conlock(descr, player, arg1, arg2); break; case 't': case 'T': Matched("@contents"); do_contents(descr, player, arg1, arg2); break; default: goto bad; } break; case 'r': case 'R': if (string_compare(command, "@credits")) { Matched("@create"); do_create(player, arg1, arg2); } else { do_credits(player); } break; default: goto bad; } break; case 'd': case 'D': /* describe, dequeue, dig, or dump */ switch (command[2]) { case 'b': case 'B': Matched("@dbginfo"); do_serverdebug(descr, player, arg1, arg2); break; case 'e': case 'E': #ifdef DELTADUMPS if(command[3] == 'l' || command[3] == 'L') { Matched("@delta"); do_delta(player); } else #endif { if( (command[3] == 's' || command[3] == 'S') && (command[4] == 't' || command[4] == 'T') ) { Matched("@destroy"); do_recycle(descr, player, arg1); } else { Matched("@describe"); do_describe(descr, player, arg1, arg2); } } break; case 'i': case 'I': Matched("@dig"); do_dig(descr, player, arg1, arg2); break; #ifdef DELTADUMPS case 'l': case 'L': Matched("@dlt"); do_delta(player); break; #endif case 'o': case 'O': Matched("@doing"); if (!tp_who_doing) goto bad; do_doing(descr, player, arg1, arg2); break; case 'r': case 'R': Matched("@drop"); do_drop_message(descr, player, arg1, arg2); break; case 'u': case 'U': Matched("@dump"); do_dump(player, full_command); break; default: goto bad; } break; case 'e': case 'E': switch (command[2]) { case 'd': case 'D': Matched("@edit"); do_edit(descr, player, arg1); break; case 'n': case 'N': Matched("@entrances"); do_entrances(descr, player, arg1, arg2); break; case 'x': case 'X': Matched("@examine"); sane_dump_object(player, arg1); break; default: goto bad; } break; case 'f': case 'F': /* fail, find, force, or frob */ switch (command[2]) { case 'a': case 'A': Matched("@fail"); do_fail(descr, player, arg1, arg2); break; case 'i': case 'I': if(command[3] == 'x' || command[3] == 'X') { Matched("@fixwizbits"); do_fixw(player, full_command); } else { Matched("@find"); do_find(player, arg1, arg2); } break; case 'l': case 'L': Matched("@flock"); do_flock(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("@force"); do_force(descr, player, arg1, arg2); break; case 'r': case 'R': if (string_compare(command, "@frob")) goto bad; do_frob(descr, player, arg1, arg2); break; default: goto bad; } break; case 'h': case 'H': switch (command[2]) { case 'T': case 't': Matched("@htmldescribe"); do_htmldescribe(descr, player, arg1, arg2); break; default: Matched("@hopper"); do_hopper(player, arg1); break; } break; case 'i': case 'I': switch(command[2]) { case 'h': case 'H': Matched("@ihtmldescribe"); do_ihtmldescribe(descr, player, arg1, arg2); break; case 'a': case 'A': Matched("@iansidescribe"); do_iansidescribe(descr, player, arg1, arg2); break; default: Matched("@idescribe"); do_idescribe(descr, player, arg1, arg2); break; } break; case 'k': case 'K': Matched("@kill"); do_dequeue(descr, player, arg1); break; case 'l': case 'L': /* lock or link */ switch (command[2]) { case 'i': case 'I': switch (command[3]) { case 'n': case 'N': Matched("@link"); do_link(descr, player, arg1, arg2); break; case 's': case 'S': Matched("@list"); match_and_list(descr, player, arg1, arg2, 1); break; default: goto bad; } break; case 'o': case 'O': Matched("@lock"); do_lock(descr, player, arg1, arg2); break; default: goto bad; } break; case 'm': case 'M': switch (command[2]) { case 'e': case 'E': Matched("@memory"); do_memory(player); break; case 'c': case 'C': switch (command[4]) { case '2': Matched("@mcp2muf"); match_and_list(descr, player, arg1, arg2, 0); break; default: Matched("@mcp"); do_prog(descr, player, arg1, 1); break; } default: goto bad; } break; case 'n': case 'N': /* @name or @newpassword */ switch (command[2]) { case 'a': case 'A': Matched("@name"); do_name(descr, player, arg1, arg2); break; case 'e': case 'E': if (string_compare(command, "@newpassword")) goto bad; do_newpassword(player, arg1, arg2); break; default: goto bad; } break; case 'o': case 'O': switch (command[2]) { case 'd': case 'D': Matched("@odrop"); do_odrop(descr, player, arg1, arg2); break; case 'e': case 'E': Matched("@oecho"); do_oecho(descr, player, arg1, arg2); break; case 'f': case 'F': Matched("@ofail"); do_ofail(descr, player, arg1, arg2); break; case 'p': case 'P': Matched("@open"); do_open(descr, player, arg1, arg2); break; case 's': case 'S': Matched("@osuccess"); do_osuccess(descr, player, arg1, arg2); break; case 'w': case 'W': Matched("@owned"); do_owned(player, arg1, arg2); break; default: goto bad; } break; case 'p': case 'P': switch (command[2]) { case 'a': case 'A': Matched("@password"); do_password(player, arg1, arg2); break; case 'c': case 'C': Matched("@pcreate"); do_pcreate(player, arg1, arg2); break; case 'e': case 'E': Matched("@pecho"); do_pecho(descr, player, arg1, arg2); break; case 'r': case 'R': if (string_prefix("@program", command)) { do_prog(descr, player, arg1, 0); break; } else if (string_prefix("@proginfo", command)) { do_proginfo(player, arg1); break; } else { Matched("@propset"); do_propset(descr, player, arg1, arg2); break; } case 's': case 'S': Matched("@ps"); list_events(player); break; case 'u': case 'U': Matched("@purge"); do_purge(descr, player, arg1, arg2); break; default: goto bad; } break; case 'r': case 'R': switch (command[3]) { case 'c': case 'C': Matched("@recycle"); do_recycle(descr, player, arg1); break; case 's': case 'S': if (!string_compare(command, "@restart")) { do_restart(player, full_command); } else if (!string_compare(command, "@restrict")) { do_restrict(player, arg1); } else { goto bad; } break; default: goto bad; } break; case 's': case 'S': /* set, shutdown, success */ switch (command[2]) { case 'a': case 'A': if (!string_compare(command, "@sanity")) { sanity(player); } else if (!string_compare(command, "@sanchange")) { sanechange(player, full_command); } else if (!string_compare(command, "@sanfix")) { sanfix(player); } else { goto bad; } break; case 'e': case 'E': Matched("@set"); do_set(descr, player, arg1, arg2); break; case 'h': case 'H': if (!string_compare(command, "@shout")) { do_wall(player, full_command); break; } if (string_compare(command, "@shutdown")) goto bad; do_shutdown(player, arg1); break; case 't': case 'T': Matched("@stats"); do_stats(player, arg1); break; case 'u': case 'U': Matched("@success"); do_success(descr, player, arg1, arg2); break; case 'w': case 'W': Matched("@sweep"); do_sweep(descr, player, arg1); break; default: goto bad; } break; case 't': case 'T': switch (command[2]) { case 'e': case 'E': Matched("@teleport"); do_teleport(descr, player, arg1, arg2); break; case 'o': case 'O': if (string_compare(command, "@toad")) goto bad; do_frob(descr, player, arg1, arg2); break; case 'r': case 'R': Matched("@trace"); do_trace(descr, player, arg1, atoi(arg2)); break; case 'u': case 'U': Matched("@tune"); do_tune(player, arg1, arg2); break; default: goto bad; } break; case 'u': case 'U': switch (command[2]) { case 'N': case 'n': if (string_prefix(command, "@unlink")) { do_unlink(descr, player, arg1); } else if (string_prefix(command, "@unlock")) { do_unlock(descr, player, arg1); } else if (string_prefix(command, "@uncompile")) { do_uncompile(player); } else { goto bad; } break; #ifndef NO_USAGE_COMMAND case 'S': case 's': Matched("@usage"); do_usage(player); break; #endif default: goto bad; break; } break; case 'v': case 'V': Matched("@version"); anotify_nolisten2(player, CRIMSON "ProtoMUCK " PROTOBASE PURPLE " (" RED VERSION WHITE " -- " AQUA NEONVER PURPLE ")" ); break; case 'w': case 'W': if (string_compare(command, "@wall")) goto bad; do_wall(player, full_command); break; default: goto bad; } break; case '&': do_mush_set(descr, player, arg1, arg2, command); break; case 'd': case 'D': switch (command[1]) { case 'b': case 'B': Matched("dboot"); do_dboot(player, arg1); break; case 'i': case 'I': Matched("dinfo"); do_dinfo(player, arg1); break; case 'r': case 'R': Matched("drop"); do_drop(descr, player, arg1, arg2); break; case 'w': case 'W': Matched("dwall"); do_dwall(player, arg1, arg2); break; default: goto bad; } break; case 'e': case 'E': switch (command[1]) { case 'm': case 'M': Matched("emote"); do_pose(descr, player, full_command); break; case 'x': case 'X': case '\0': Matched("examine"); do_examine(descr, player, arg1, arg2); break; default: goto bad; } break; case 'g': case 'G': /* get, give, go, or gripe */ switch (command[1]) { case 'e': case 'E': Matched("get"); do_get(descr, player, arg1, arg2); break; case 'i': case 'I': Matched("give"); do_give(descr, player, arg1, atoi(arg2)); break; case 'o': case 'O': Matched("goto"); do_move(descr, player, arg1, 0); break; case 'r': case 'R': if(command[2]=='i' || command[2]=='I') { if (string_compare(command, "gripe")) goto bad; do_gripe(player, full_command); break; } default: goto bad; } break; case 'h': case 'H': switch (command[1]) { case 'a': case 'A': Matched("hand"); do_drop(descr, player, arg1, arg2); break; case 'e': case 'E': Matched("help"); do_help(player, arg1, arg2); break; default: goto bad; } break; case 'i': case 'I': if (string_compare(command, "info")) { Matched("inventory"); do_inventory(player); } else { do_info(player, arg1, arg2); } break; case 'l': case 'L': if (string_prefix("look", command)) { do_look_at(descr, player, arg1, arg2); break; } else { Matched("leave"); do_leave(descr, player); break; } case 'm': case 'M': if (string_prefix(command, "move")) { do_move(descr, player, arg1, 0); break; } else if (!string_compare(command, "motd")) { do_motd(player, full_command); break; } else if (!string_compare(command, "mpi")) { do_mpihelp(player, arg1, arg2); break; } else { if (string_compare(command, "man")) goto bad; do_man(player, arg1, arg2); } break; case 'n': case 'N': /* news */ Matched("news"); do_news(player, arg1, arg2); break; case 'p': case 'P': switch (command[1]) { case 'a': case 'A': case '\0': Matched("page"); do_page(descr, player, arg1, arg2); break; case 'o': case 'O': Matched("pose"); do_pose(descr, player, full_command); break; case 'u': case 'U': Matched("put"); do_drop(descr, player, arg1, arg2); break; default: goto bad; } break; case 'r': case 'R': switch (command[1]) { case 'e': case 'E': if(command[2] == 'q' || command[2] == 'Q'){ Matched("request"); request(player, NULL, commandline); } else { Matched("read"); /* undocumented alias for look */ do_look_at(descr, player, arg1, arg2); } break; default: goto bad; } break; case 's': case 'S': /* say, "score" */ switch (command[1]) { case 'a': case 'A': Matched("say"); do_say(descr, player, full_command); break; case 'c': case 'C': case '\0': if( command[1] && (command[2] == 'a' || command[2] == 'A' )) { Matched("scan"); do_sweep(descr, player, arg1); } else { Matched("score"); do_score(player, 1); } break; default: goto bad; } break; case 't': case 'T': switch (command[1]) { case 'a': case 'A': Matched("take"); do_get(descr, player, arg1, arg2); break; case 'h': case 'H': Matched("throw"); do_drop(descr, player, arg1, arg2); break; default: goto bad; } break; case 'w': case 'W': switch (command[1]){ case 'c': case 'C': Matched("wc"); do_wizchat(player, full_command); break; case 'i': case 'I': Matched("wizchat"); do_wizchat(player, arg1); break; case 'h': case 'H': case '\0': Matched("whisper"); do_whisper(descr, player, arg1, arg2); break; default: goto bad; } break; default: bad: if ( Typeof(tp_huh_command) == TYPE_PROGRAM && !(player == -1)) { tmpfr = interp(descr, player, DBFETCH(player)->location, tp_huh_command, (dbref)-4, FOREGROUND, STD_REGUID); if (!tmpfr) goto bad2; (void) interp_loop(player, tp_huh_command, tmpfr, 0); } else { bad2: anotify_fmt(player, CINFO "%s",tp_huh_mesg); if (tp_log_failed_commands && !controls(player, DBFETCH(player)->location)) { log_status("HUH from %s(%d) in %s(%d)[%s]: %s %s\n", NAME(player), player, NAME(DBFETCH(player)->location), DBFETCH(player)->location, NAME(OWNER(DBFETCH(player)->location)), command, full_command); } } break; } }
void omti8621_device::do_command(const UINT8 cdb[], const UINT16 cdb_length) { UINT8 lun = get_lun(cdb); omti_disk_image_device *disk = our_disks[lun]; int command_duration = 0; // ms log_command( cdb, cdb_length); // default to read status and status is successful completion omti_state = OMTI_STATE_STATUS; status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD; command_status = lun ? OMTI_COMMAND_STATUS_LUN : 0; if (mask_port & OMTI_MASK_INTE) { set_interrupt(CLEAR_LINE); } if (!disk->m_image->exists()) { command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive } switch (cdb[0]) { case OMTI_CMD_TEST_DRIVE_READY: // 0x00 if (!disk->m_image->exists()) { set_sense_data(OMTI_SENSE_CODE_DRIVE_NOT_READY, cdb); } break; case OMTI_CMD_RECALIBRATE: // 0x01 break; case OMTI_CMD_REQUEST_SENSE: // 0x03 set_data_transfer(sense_data, sizeof(sense_data)); break; case OMTI_CMD_READ_VERIFY: // 0x05 check_disk_address(cdb); break; case OMTI_CMD_FORMAT_TRACK: // 0x06 format_track(cdb); break; case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07 diskaddr_format_bad_track = get_disk_address(cdb); break; case OMTI_CMD_READ: // 0x08 if (check_disk_address(cdb)) { // read data from controller read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun); set_data_transfer(§or_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]); } break; case OMTI_CMD_WRITE: // 0x0A log_data(); if (check_disk_address(cdb)) { write_sectors_to_disk(get_disk_address(cdb), cdb[4], lun); } break; case OMTI_CMD_SEEK: // 0x0B check_disk_address(cdb); break; case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E set_data_transfer(§or_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]); break; case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F log_data(); break; case OMTI_CMD_COPY: // 0x20 if (check_disk_address(cdb) && check_disk_address(cdb+4)) { // copy sectors copy_sectors (get_disk_address(cdb+4), get_disk_address(cdb), cdb[4], lun); } break; case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37 set_esdi_defect_list(get_lun(cdb), cdb[1] & 0x1f); set_data_transfer(disk->m_esdi_defect_list, sizeof(disk->m_esdi_defect_list)); break; #if 0 // this command seems unused by Domain/OS, and it's unclear what the intent of the code is (it makes some versions of GCC quite unhappy) case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11 log_data(); alternate_track_address[0] = get_disk_track(cdb); alternate_track_address[1] = get_disk_track(alternate_track_buffer-1); break; #endif case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E if (check_disk_address(cdb)) { // read data from controller read_sectors_from_disk (get_disk_address(cdb), cdb[4], lun); // Domain/OS doesn't expect zero access time command_duration += 1; // 1 ms is enough, average time would be 30 ms) } break; case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F log_data(); if (check_disk_address(cdb)) { write_sectors_to_disk(get_disk_address(cdb), cdb[4], lun); } break; case OMTI_CMD_RAM_DIAGNOSTICS: // 0xE0 break; case OMTI_CMD_CONTROLLER_INT_DIAGNOSTIC: // 0xE4 break; case OMTI_CMD_READ_LONG: // 0xE5 if (check_disk_address(cdb)) { // read data from controller read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun); set_data_transfer(§or_buffer[0], OMTI_DISK_SECTOR_SIZE+6); } break; case OMTI_CMD_WRITE_LONG: // 0xE6 log_data(); if (check_disk_address(cdb)) { UINT32 diskaddr = get_disk_address(cdb); write_sectors_to_disk(diskaddr, cdb[4], lun); // this will spoil the ECC code diskaddr_ecc_error = diskaddr; } break; case OMTI_CMD_READ_CONFIGURATION: // 0xEC set_configuration_data(get_lun(cdb)); set_data_transfer(disk->m_config_data, sizeof(disk->m_config_data)); break; case OMTI_CMD_INVALID_COMMAND: // 0xFF set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb); command_status |= OMTI_COMMAND_STATUS_ERROR; break; default: LOG(("do_command: UNEXPECTED command %02x",cdb[0])); set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb); command_status |= OMTI_COMMAND_STATUS_ERROR; break; } if (mask_port & OMTI_MASK_INTE) { // if (omti_state != OMTI_STATE_STATUS) { // LOG(("do_command: UNEXPECTED omti_state %02x",omti_state)); // } status_port |= OMTI_STATUS_IREQ; if (command_duration == 0) { set_interrupt(ASSERT_LINE); } else { // FIXME: should delay omti_state and status_port as well m_timer->adjust(attotime::from_msec(command_duration), 0); } } }
static void do_command(omti8621_state *state, const UINT8 cdb[], const UINT16 cdb_length) { UINT8 lun = get_lun(cdb); disk_data *disk = state->disk[lun]; int command_duration = 0; // ms log_command( state, cdb, cdb_length); // default to read status and status is successful completion state->omti_state = OMTI_STATE_STATUS; state->status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD; state->command_status = lun ? OMTI_COMMAND_STATUS_LUN : 0; if (state->mask_port & OMTI_MASK_INTE) { set_interrupt(state, CLEAR_LINE); } if (!disk->image->exists()) { state->command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive } switch (cdb[0]) { case OMTI_CMD_TEST_DRIVE_READY: // 0x00 if (!disk->image->exists()) { set_sense_data(state, OMTI_SENSE_CODE_DRIVE_NOT_READY, cdb); } break; case OMTI_CMD_RECALIBRATE: // 0x01 break; case OMTI_CMD_REQUEST_SENSE: // 0x03 set_data_transfer(state, state->sense_data, sizeof(state->sense_data)); break; case OMTI_CMD_READ_VERIFY: // 0x05 check_disk_address(state, cdb); break; case OMTI_CMD_FORMAT_TRACK: // 0x06 format_track(state, cdb); break; case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07 state->diskaddr_format_bad_track = get_disk_address(state, cdb); break; case OMTI_CMD_READ: // 0x08 if (check_disk_address(state, cdb)) { // read data from controller read_sectors_from_disk(state, get_disk_address(state, cdb), cdb[4], lun); set_data_transfer(state, state->sector_buffer, OMTI_DISK_SECTOR_SIZE*cdb[4]); } break; case OMTI_CMD_WRITE: // 0x0A log_data(state); if (check_disk_address(state, cdb)) { write_sectors_to_disk(state, get_disk_address(state, cdb), cdb[4], lun); } break; case OMTI_CMD_SEEK: // 0x0B check_disk_address(state, cdb); break; case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E set_data_transfer(state, state->sector_buffer, OMTI_DISK_SECTOR_SIZE*cdb[4]); break; case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F log_data(state); break; case OMTI_CMD_COPY: // 0x20 if (check_disk_address(state, cdb) && check_disk_address(state, cdb+4)) { // copy sectors copy_sectors (state, get_disk_address(state, cdb+4), get_disk_address(state, cdb), cdb[4], lun); } break; case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37 set_esdi_defect_list(state, get_lun(cdb), cdb[1] & 0x1f); set_data_transfer(state, disk->esdi_defect_list, sizeof(disk->esdi_defect_list)); break; case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11 log_data(state); state->alternate_track_address[0] = get_disk_track(state, cdb); state->alternate_track_address[1] = get_disk_track(state, state->alternate_track_buffer-1);; break; case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E if (check_disk_address(state, cdb)) { // read data from controller read_sectors_from_disk (state, get_disk_address(state, cdb), cdb[4], lun); // Domain/OS doesn't expect zero access time command_duration += 1; // 1 ms is enough, average time would be 30 ms) } break; case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F log_data(state); if (check_disk_address(state, cdb)) { write_sectors_to_disk(state, get_disk_address(state, cdb), cdb[4], lun); } break; case OMTI_CMD_RAM_DIAGNOSTICS: // 0xE0 break; case OMTI_CMD_CONTROLLER_INT_DIAGNOSTIC: // 0xE4 break; case OMTI_CMD_READ_LONG: // 0xE5 if (check_disk_address(state, cdb)) { // read data from controller read_sectors_from_disk(state, get_disk_address(state, cdb), cdb[4], lun); set_data_transfer(state, state->sector_buffer, OMTI_DISK_SECTOR_SIZE+6); } break; case OMTI_CMD_WRITE_LONG: // 0xE6 log_data(state); if (check_disk_address(state, cdb)) { UINT32 diskaddr = get_disk_address(state, cdb); write_sectors_to_disk(state, diskaddr, cdb[4], lun); // this will spoil the ECC code state->diskaddr_ecc_error = diskaddr; } break; case OMTI_CMD_READ_CONFIGURATION: // 0xEC set_configuration_data(state, get_lun(cdb)); set_data_transfer(state, disk->config_data, sizeof(disk->config_data)); break; case OMTI_CMD_INVALID_COMMAND: // 0xFF set_sense_data(state, OMTI_SENSE_CODE_INVALID_COMMAND, cdb); state->command_status |= OMTI_COMMAND_STATUS_ERROR; break; default: LOG(("do_command: UNEXPECTED command %02x",cdb[0])); set_sense_data(state, OMTI_SENSE_CODE_INVALID_COMMAND, cdb); state->command_status |= OMTI_COMMAND_STATUS_ERROR; break; } if (state->mask_port & OMTI_MASK_INTE) { // if (state->omti_state != OMTI_STATE_STATUS) { // LOG(("do_command: UNEXPECTED omti_state %02x",state->omti_state)); // } state->status_port |= OMTI_STATUS_IREQ; if (command_duration == 0) { set_interrupt(state, ASSERT_LINE); } else { // FIXME: should delay state->omti_state and state->status_port as well state->device->machine().scheduler().timer_set(attotime::from_msec(command_duration), FUNC(set_interrupt_caba), 0, state); } } }
/* * CLI, returns results as CMD_xxx (such as CMD_EXIT) * If argc is supplied, then this is one shot cli, ie run the command */ static int do_cli(const struct cmd_tbl_entry *cmd_tbl, const char *prompt, int argc, char **argv) { /* Build up argc/argv */ const struct cmd_tbl_entry *ctp; int cmd_argc; char *cmd_argv[20]; char *input = NULL; int rv, done; int i; char promptbuf[PROMPTBUFSIZE]; /* Was 1024, who needs that long a prompt? (the part before user input up to '>') */ static char nullstr[2]={0,0}; #ifdef HAVE_LIBREADLINE //set the current command level for command completion current_cmd_level = cmd_tbl; #endif rv = 0, done = 0; snprintf(promptbuf, PROMPTBUFSIZE, "%s> ", prompt); while (!done) { char *inptr, *s; if (argc == 0) { /* Get Input */ if (input) free(input); input = command_line_input(promptbuf); if (!input) { if (instream == stdin) printf("\n"); break; } /* Parse it */ inptr = input; if (*inptr == '@') //printing comment { printf("%s\n", inptr); continue; } if (*inptr == '#') //non-printing comment { continue; } cmd_argc = 0; while ( (s = strtok(inptr, " \t")) != NULL ) { cmd_argv[cmd_argc] = s; inptr = NULL; if (cmd_argc == (ARRAY_SIZE(cmd_argv)-1)) break; cmd_argc++; } cmd_argv[cmd_argc] = nullstr; } else { /* Use supplied argc */ cmd_argc = argc; for (i=0; i<=argc; i++) cmd_argv[i] = argv[i]; } if (cmd_argc != 0) { ctp = cmd_tbl; while (ctp->command) { if (strcasecmp(ctp->command, cmd_argv[0]) == 0) { if (ctp->sub_cmd_tbl) { log_command(1, cmd_argv); snprintf(promptbuf, PROMPTBUFSIZE,"%s/%s", prompt, ctp->command); /* Sub menu */ rv = do_cli(ctp->sub_cmd_tbl, promptbuf, cmd_argc-1, &cmd_argv[1]); #ifdef HAVE_LIBREADLINE //went out of the sub-menu, so update the command level for command completion current_cmd_level = cmd_tbl; #endif if (rv==CMD_EXIT) //allow exiting prog. from a submenu done=1; snprintf(promptbuf, PROMPTBUFSIZE, "%s> ", prompt); } else { /* Found command */ log_command(cmd_argc, cmd_argv); rv = ctp->routine(cmd_argc, cmd_argv); switch (rv) { case CMD_USAGE: printf("Usage: %s\n", ctp->usage); break; case CMD_EXIT: rv = CMD_EXIT; done = 1; break; case CMD_UP: rv = CMD_UP; done = 1; break; } } break; } if (!done) ctp++; } if (ctp->command == NULL) { printf("Huh? Try \"help\"\n"); } if (argc) { /* Single command */ done = 1; break; } } if (done) break; } //while !done if (input) free(input); if (rv == CMD_UP) return CMD_OK; if (rv == CMD_EXIT) { char *disco="disconnect"; if (global_logfp != NULL) cmd_stoplog(0, NULL); if (global_state > STATE_IDLE) { do_cli(diag_cmd_table, "", 1, &disco); //XXX should be called recursively in case there are >1 active L3 conns... } rv=diag_end(); if (rv) fprintf(stderr, FLFMT "diag_end failed !?\n", FL); rv = CMD_EXIT; } return rv; }
/* command wrapper function: make sure the game is able to run commands, perform * logging and generate reasonable return values for api clients with no access * to internal state */ int nh_command(const char *cmd, int rep, struct nh_cmd_arg *arg) { int cmdidx, cmdresult, pre_moves; unsigned int pre_rngstate; if (!program_state.game_running) return ERR_GAME_NOT_RUNNING; cmdidx = get_command_idx(cmd); if (program_state.viewing && (cmdidx < 0 || !(cmdlist[cmdidx].flags & CMD_NOTIME))) return ERR_COMMAND_FORBIDDEN; /* */ if (!api_entry_checkpoint()) { /* terminate() in end.c will arrive here */ if (program_state.panicking) return GAME_PANICKED; if (!program_state.gameover) return GAME_SAVED; if (program_state.forced_exit) return ERR_FORCED_EXIT; return GAME_OVER; } /* if the game is being restored, turntime is set in restore_read_command */ turntime = time(NULL); log_command(cmdidx, rep, arg); pre_rngstate = mt_nextstate(); pre_moves = moves; /* do the deed. command_input returns -1 if the command completed normally */ cmdresult = command_input(cmdidx, rep, arg); /* make sure we actually want this command to be logged */ if (cmdidx >= 0 && (cmdlist[cmdidx].flags & CMD_NOTIME) && pre_rngstate == mt_nextstate() && pre_moves == moves) log_revert_command(); /* nope, cut it out of the log */ else log_command_result(); /* log the result */ api_exit(); /* no unsafe operations after this point */ if (cmdresult != -1) return cmdresult; /* * performing a command can put the game into several different states: * - the command completes immediately: a simple move or an attack etc * multi == 0, occupation == NULL * - if a count is given, the command will (usually) take count turns * multi == count (> 0), occupation == NULL * - the command may cause a delay: for ex. putting on or removing armor * multi == -delay (< 0), occupation == NULL * multi is incremented in you_moved * - the command may take multiple moves, and require a callback to be * run for each move. example: forcing a lock * multi >= 0, occupation == callback */ if (multi >= 0 && occupation) return OCCUPATION_IN_PROGRESS; else if (multi > 0) return MULTI_IN_PROGRESS; else if (multi < 0) return POST_ACTION_DELAY; return READY_FOR_INPUT; }