📄 newcmd.cc
字号:
{ app->get_sim()->stop(resUSER); flags&= ~CONS_FROZEN; retval= 0; } else { if (cmdstr && *cmdstr == '\004') retval= 1; else { class cl_cmdline *cmdline; class cl_cmd *cm; if (flags & CONS_ECHO) dd_printf("%s\n", cmdstr); cmdline= new cl_cmdline(app, cmdstr, this); cmdline->init(); cm= cmdset->get_cmd(cmdline); if (cm) retval= cm->work(app, cmdline, this); delete cmdline; if (!cm) retval= interpret(cmdstr); } } //retval= sim->do_cmd(cmd, this); un_redirect(); /*if (!retval) print_prompt();*/ free(cmdstr); return(retval);}/* * Old version, sim->do_cmd() falls into this if it doesn't find a new * command object which can handle entered command */intcl_console::interpret(char *cmd){ FILE *Out= rout?rout:out; fprintf(Out, "Unknown command\n"); return(0);}voidcl_console::set_id(int new_id){ char *s; id= new_id; set_name(s= format_string("console%d", id)); free(s);}voidcl_console::set_prompt(char *p){ if (prompt) free(prompt); if (p && *p) prompt= strdup(p); else prompt= 0;}/* * This console listen on a socket and can accept connection requests */#ifdef SOCKET_AVAILcl_listen_console::cl_listen_console(int serverport, class cl_app *the_app){ last_command= NULL; app= the_app; if ((sock= make_server_socket(serverport)) >= 0) { if (listen(sock, 10) < 0) fprintf(stderr, "Listen on port %d: %s\n", serverport, strerror(errno)); } in= out= 0;}intcl_listen_console::match(int fdnum){ return(sock == fdnum);}intcl_listen_console::get_in_fd(void){ return(sock);}intcl_listen_console::proc_input(class cl_cmdset *cmdset){ int newsock; ACCEPT_SOCKLEN_T size; struct sockaddr_in sock_addr; class cl_commander *cmd; cmd= app->get_commander(); size= sizeof(struct sockaddr); newsock= accept(sock, (struct sockaddr*)&sock_addr, &size); if (newsock < 0) { perror("accept"); return(0); } if (!(in= fdopen(newsock, "r+"))) fprintf(stderr, "cannot open port for input\n"); if (!(out= fdopen(newsock, "w+"))) fprintf(stderr, "cannot open port for output\n"); class cl_console *c= cmd->mk_console(in, out); c->flags|= CONS_INTERACTIVE; cmd->add_console(c); in= out= 0; return(0);}#endif /* SOCKET_AVAIL *//* * Sub-console */cl_sub_console::cl_sub_console(class cl_console *the_parent, FILE *fin, FILE *fout, class cl_app *the_app): cl_console(fin, fout, the_app){ parent= the_parent;}cl_sub_console::~cl_sub_console(void){ class cl_commander *c= app->get_commander(); if (parent && c) { c->activate_console(parent); }}intcl_sub_console::init(void){ class cl_commander *c= app->get_commander(); if (parent && c) { c->deactivate_console(parent); } cl_console::init(); flags|= CONS_ECHO; return(0);}/* * Command interpreter *____________________________________________________________________________ */cl_commander::cl_commander(class cl_app *the_app, class cl_cmdset *acmdset /*, class cl_sim *asim*/): cl_base(){ app= the_app; cons= new cl_list(1, 1); actual_console= frozen_console= 0; cmdset= acmdset;}intcl_commander::init(void){ class cl_optref console_on_option(this); console_on_option.init(); console_on_option.use("console_on"); cl_base::init(); set_name("Commander"); char *Config= app->args->get_sarg(0, "Config"); if (Config) { class cl_console *con= mk_console(0/*"/dev/tty"*/); add_console(con); } //if (app->args->arg_avail('c')) { char *cn= console_on_option.get_value(cn); if (cn) add_console(mk_console(cn, cn)); }#ifdef SOCKET_AVAIL if (app->args->arg_avail('Z')) add_console(mk_console(app->args->get_iarg(0, "Zport"))); if (app->args->arg_avail('r')) add_console(mk_console(app->args->get_iarg('r', 0)));#endif if (cons->get_count() == 0) add_console(mk_console(stdin, stdout)); return(0);}cl_commander::~cl_commander(void){ delete cons; delete cmdset;}class cl_console *cl_commander::mk_console(char *fin, char *fout){ return(new cl_console(fin, fout, app));}class cl_console *cl_commander::mk_console(FILE *fin, FILE *fout){ return(new cl_console(fin, fout, app));}#ifdef SOCKET_AVAILclass cl_console *cl_commander::mk_console(int portnumber){ return(new cl_listen_console(portnumber, app));}#endifvoidcl_commander::add_console(class cl_console *console){ if (!console) return; int i=cons->add(console); console->set_id(i); console->init(); set_fd_set();}voidcl_commander::del_console(class cl_console *console){ cons->disconn(console); set_fd_set();}voidcl_commander::activate_console(class cl_console *console){ console->flags&= ~CONS_INACTIVE; //console->print_prompt(); set_fd_set();}voidcl_commander::deactivate_console(class cl_console *console){ console->flags|= CONS_INACTIVE; set_fd_set();}voidcl_commander::set_fd_set(void){ int i; //fprintf(stderr, "** Setting fd set\n"); FD_ZERO(&read_set); fd_num= 0; for (i= 0; i < cons->count; i++) { int fd; class cl_console *c= (class cl_console*)(cons->at(i)); if ((fd= c->get_in_fd()) >= 0) { if ((c->flags & CONS_FROZEN) == 0 || (c->flags & CONS_INTERACTIVE) != 0) { FD_SET(fd, &read_set); if (fd > fd_num) fd_num= fd; } } else ;//fprintf(stderr, "** Skipping console %p\n",c); } fd_num++;}/* * Printing to all consoles */intcl_commander::all_printf(char *format, ...){ va_list ap; int i, ret= 0; for (i= 0; i < cons->count; i++) { class cl_console *c= (class cl_console*)(cons->at(i)); FILE *Out= c->get_out(); if (Out) { va_start(ap, format); ret= cmd_do_print(Out, format, ap); va_end(ap); } } return(ret);}voidcl_commander::prompt(void){ int i; for (i= 0; i < cons->count; i++) { class cl_console *c= (class cl_console*)(cons->at(i)); c->print_prompt(); }}intcl_commander::all_print(char *string, int length){ int i; for (i= 0; i < cons->count; i++) { class cl_console *c= (class cl_console*)(cons->at(i)); FILE *Out= c->get_out(); if (Out) { for (int j= 0; j < length; j++) putc(string[j], Out); } } return(0);}/* * Printing to actual_console */intcl_commander::dd_printf(char *format, ...){ va_list ap; int ret= 0; FILE *f; if (actual_console) f= actual_console->get_out(); else if (frozen_console) f= frozen_console->get_out(); else f= 0; if (/*actual_console && actual_console->out*/f) { va_start(ap, format); ret= cmd_do_print(f/*actual_console->out*/, format, ap); va_end(ap); } return(ret);}/* * Printing to consoles which have CONS_DEBUG flag set */intcl_commander::debug(char *format, ...){ va_list ap; int i, ret= 0; for (i= 0; i < cons->count; i++) { class cl_console *c= (class cl_console*)(cons->at(i)); FILE *Out= c->get_out(); if (Out && c->flags & CONS_DEBUG) { va_start(ap, format); ret= cmd_do_print(Out, format, ap); va_end(ap); } } return(ret);}intcl_commander::flag_printf(int iflags, char *format, ...){ va_list ap; int i, ret= 0; for (i= 0; i < cons->count; i++) { class cl_console *c= (class cl_console*)(cons->at(i)); FILE *Out= c->get_out(); if (Out && (c->flags & iflags) == iflags) { va_start(ap, format); ret= cmd_do_print(Out, format, ap); va_end(ap); } } return(ret);}intcl_commander::input_avail(void){ struct timeval tv; int i; tv.tv_sec= tv.tv_usec= 0; active_set= read_set; i= select(fd_num, &active_set, NULL, NULL, &tv); return(i);}intcl_commander::input_avail_on_frozen(void){ int fd; if (!frozen_console) return(0); if ((fd= frozen_console->get_in_fd()) >= 0 && !isatty(fd)) return(0); return(frozen_console->input_avail());}intcl_commander::wait_input(void){ int i; active_set= read_set; prompt(); i= select(fd_num, &active_set, NULL, NULL, NULL); return(i);}intcl_commander::proc_input(void){ int i; for (i= 0; i < fd_num; i++) if (FD_ISSET(i, &active_set)) { class cl_console *c; int j; for (j= 0; j < cons->count; j++) { c= (class cl_console*)(cons->at(j)); if (c->match(i)) { actual_console= c; int retval= c->proc_input(cmdset); if (retval) { del_console(c); delete c; } actual_console= 0; return(cons->count == 0); } } } return(0);}/* End of cmd.src/newcmd.cc */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -