-/*\r
- * Simulator of microcontrollers (cmd.src/newcmdposix.cc)\r
- *\r
- * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.\r
- * Copyright (C) 2006, Borut Razem - borut.razem@siol.net\r
- *\r
- * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu\r
- *\r
- */\r
-\r
-/* This file is part of microcontroller simulator: ucsim.\r
-\r
-UCSIM is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-UCSIM is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with UCSIM; see the file COPYING. If not, write to the Free\r
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA\r
-02111-1307, USA. */\r
-/*@1@*/\r
-\r
-#include "ddconfig.h"\r
-\r
-#include <stdio.h>\r
-#include <errno.h>\r
-#include <stdarg.h>\r
-#include <stdlib.h>\r
-#include <sys/types.h>\r
-#include <sys/time.h>\r
-#ifdef SOCKET_AVAIL\r
-# include HEADER_SOCKET\r
-# if defined HAVE_SYS_SOCKET_H\r
-# include <netinet/in.h>\r
-# include <arpa/inet.h>\r
-# include <netdb.h>\r
-# endif\r
-#endif\r
-#if FD_HEADER_OK\r
-# include HEADER_FD\r
-#endif\r
-#ifdef HAVE_UNISTD_H\r
-# include <unistd.h>\r
-#endif\r
-#include "i_string.h"\r
-\r
-#include "cmdlexcl.h"\r
-#include "cmdpars.h"\r
-\r
-// prj\r
-#include "globals.h"\r
-#include "utils.h"\r
-\r
-// sim\r
-#include "simcl.h"\r
-#include "argcl.h"\r
-#include "appcl.h"\r
-\r
-// local\r
-#include "newcmdposixcl.h"\r
-\r
-\r
-/*\r
- * Command console\r
- *____________________________________________________________________________\r
- */\r
-\r
-cl_console::cl_console(char *fin, char *fout, class cl_app *the_app)\r
-{\r
- FILE *f;\r
-\r
- app= the_app;\r
- in= 0;\r
- if (fin)\r
- if (f= fopen(fin, "r"), in= f, !f)\r
- fprintf(stderr, "Can't open `%s': %s\n", fin, strerror(errno));\r
- out= 0;\r
- if (fout)\r
- if (f= fopen(fout, "w"), out= f, !f)\r
- fprintf(stderr, "Can't open `%s': %s\n", fout, strerror(errno));\r
- prompt= 0;\r
- flags= CONS_NONE;\r
- if (is_tty())\r
- flags|= CONS_INTERACTIVE;\r
- else\r
- ;//fprintf(stderr, "Warning: non-interactive console\n");\r
- rout= 0;\r
- id= 0;\r
- lines_printed= new cl_ustrings(100, 100, "console_cache");\r
-}\r
-\r
-cl_console::cl_console(FILE *fin, FILE *fout, class cl_app *the_app)\r
-{\r
- app= the_app;\r
- in = fin;\r
- out= fout;\r
- prompt= 0;\r
- flags= CONS_NONE;\r
- if (is_tty())\r
- flags|= CONS_INTERACTIVE;\r
- else\r
- ;//fprintf(stderr, "Warning: non-interactive console\n");\r
- rout= 0;\r
- id= 0;\r
- lines_printed= new cl_ustrings(100, 100, "console_cache");\r
-}\r
-\r
-class cl_console *\r
-cl_console::clone_for_exec(char *fin)\r
-{\r
- FILE *fi= 0, *fo= 0;\r
-\r
- if (!fin)\r
- return(0);\r
- if (fi= fopen(fin, "r"), !fi)\r
- {\r
- fprintf(stderr, "Can't open `%s': %s\n", fin, strerror(errno));\r
- return(0);\r
- }\r
- if ((fo= fdopen(dup(fileno(out)), "a")) == 0)\r
- {\r
- fclose(fi);\r
- fprintf(stderr, "Can't re-open output file: %s\n", strerror(errno));\r
- return(0);\r
- }\r
- class cl_console *con= new cl_sub_console(this, fi, fo, app);\r
- return(con);\r
-}\r
-\r
-cl_console::~cl_console(void)\r
-{\r
- if (in)\r
- fclose(in);\r
- un_redirect();\r
- if (out)\r
- {\r
- if (flags & CONS_PROMPT)\r
- fprintf(out, "\n");\r
- fflush(out);\r
- fclose(out);\r
- }\r
- delete prompt_option;\r
- delete null_prompt_option;\r
- delete debug_option;\r
-#ifdef SOCKET_AVAIL\r
- /* if (sock)\r
- {\r
- shutdown(sock, 2);\r
- close(sock);\r
- }*/\r
-#endif\r
-}\r
-\r
-\r
-/*\r
- * Output functions\r
- */\r
-\r
-void\r
-cl_console::redirect(char *fname, char *mode)\r
-{\r
- if ((rout= fopen(fname, mode)) == NULL)\r
- dd_printf("Unable to open file '%s' for %s: %s\n",\r
- fname, (mode[0]=='w')?"write":"append", strerror(errno));\r
-}\r
-\r
-void\r
-cl_console::un_redirect(void)\r
-{\r
- if (!rout)\r
- return;\r
- fclose(rout);\r
- rout = NULL;\r
-}\r
-\r
-int\r
-cl_console::cmd_do_print(char *format, va_list ap)\r
-{\r
- int ret;\r
- FILE *f = get_out();\r
-\r
- if (f)\r
- {\r
- ret= vfprintf(f, format, ap);\r
- fflush(f);\r
- }\r
- else\r
- ret = 0;\r
-\r
- return ret;\r
-}\r
-\r
-/*\r
- * Input functions\r
- */\r
-\r
-char *\r
-cl_console::read_line(void)\r
-{\r
- char *s= NULL;\r
-\r
-#ifdef HAVE_GETLINE\r
- if (getline(&s, 0, in) < 0)\r
- return(0);\r
-#elif defined HAVE_GETDELIM\r
- size_t n= 30;\r
- s= (char *)malloc(n);\r
- if (getdelim(&s, &n, '\n', in) < 0)\r
- {\r
- free(s);\r
- return(0);\r
- }\r
-#elif defined HAVE_FGETS\r
- s= (char *)malloc(300);\r
- if (fgets(s, 300, in) == NULL)\r
- {\r
- free(s);\r
- return(0);\r
- }\r
-#endif\r
- s[strlen(s)-1]= '\0';\r
- if (s[strlen(s)-1] == '\r')\r
- s[strlen(s)-1]= '\0';\r
- flags&= ~CONS_PROMPT;\r
- return(s);\r
-}\r
-\r
-\r
-/*\r
- * This console listen on a socket and can accept connection requests\r
- */\r
-#ifdef SOCKET_AVAIL\r
-\r
-cl_listen_console::cl_listen_console(int serverport, class cl_app *the_app)\r
-{\r
- app= the_app;\r
- if ((sock= make_server_socket(serverport)) >= 0)\r
- {\r
- if (listen(sock, 10) < 0)\r
- fprintf(stderr, "Listen on port %d: %s\n",\r
- serverport, strerror(errno));\r
- }\r
- in= out= rout= 0;\r
-}\r
-\r
-int\r
-cl_listen_console::proc_input(class cl_cmdset *cmdset)\r
-{\r
- int newsock;\r
- ACCEPT_SOCKLEN_T size;\r
- struct sockaddr_in sock_addr;\r
- class cl_commander_base *cmd;\r
- FILE *in, *out;\r
-\r
- cmd= app->get_commander();\r
- size= sizeof(struct sockaddr);\r
- newsock= accept(sock, (struct sockaddr*)&sock_addr, &size);\r
- if (newsock < 0)\r
- {\r
- perror("accept");\r
- return(0);\r
- }\r
- if (!(in= fdopen(newsock, "r")))\r
- fprintf(stderr, "cannot open port for input\n");\r
- if (!(out= fdopen(newsock, "w")))\r
- fprintf(stderr, "cannot open port for output\n");\r
- class cl_console_base *c= new cl_console(in, out, app);\r
- c->flags|= CONS_INTERACTIVE;\r
- cmd->add_console(c);\r
- return(0);\r
-}\r
-\r
-#endif /* SOCKET_AVAIL */\r
-\r
-\r
-/*\r
- * Sub-console\r
- */\r
-\r
-cl_sub_console::cl_sub_console(class cl_console_base *the_parent,\r
- FILE *fin, FILE *fout, class cl_app *the_app):\r
- cl_console(fin, fout, the_app)\r
-{\r
- parent= the_parent;\r
-}\r
-\r
-cl_sub_console::~cl_sub_console(void)\r
-{\r
- class cl_commander_base *c= app->get_commander();\r
-\r
- if (parent && c)\r
- {\r
- c->activate_console(parent);\r
- }\r
-}\r
-\r
-int\r
-cl_sub_console::init(void)\r
-{\r
- class cl_commander_base *c= app->get_commander();\r
-\r
- if (parent && c)\r
- {\r
- c->deactivate_console(parent);\r
- }\r
- cl_console::init();\r
- flags|= CONS_ECHO;\r
- return(0);\r
-}\r
-\r
-\r
-/*\r
- * Command interpreter\r
- *____________________________________________________________________________\r
- */\r
-\r
-int\r
-cl_commander::init(void)\r
-{\r
- class cl_optref console_on_option(this);\r
- class cl_optref config_file_option(this);\r
- class cl_optref port_number_option(this);\r
- class cl_console_base *con;\r
-\r
- console_on_option.init();\r
- console_on_option.use("console_on");\r
- config_file_option.init();\r
- config_file_option.use("config_file");\r
- port_number_option.init();\r
-\r
- cl_base::init();\r
- set_name("Commander");\r
-\r
- bool need_config= DD_TRUE;\r
-\r
-#ifdef SOCKET_AVAIL\r
- if (port_number_option.use("port_number"))\r
- add_console(new cl_listen_console(port_number_option.get_value((long)0), app));\r
-#endif\r
-\r
- /* The following code is commented out because it produces gcc warnings\r
- * newcmd.cc: In member function `virtual int cl_commander::init()':\r
- * newcmd.cc:785: warning: 'Config' might be used uninitialized in this function\r
- * newcmd.cc:786: warning: 'cn' might be used uninitialized in this function\r
- */\r
- /*\r
- char *Config= config_file_option.get_value(Config);\r
- char *cn= console_on_option.get_value(cn);\r
- */\r
- /* Here shoud probably be something else, but is still better then the former code... */\r
- char *Config= config_file_option.get_value("");\r
- char *cn= console_on_option.get_value("");\r
-\r
- if (cn)\r
- {\r
- add_console(con= new cl_console(cn, cn, app));\r
- exec_on(con, Config);\r
- need_config= DD_FALSE;\r
- }\r
- if (cons->get_count() == 0)\r
- {\r
- add_console(con= new cl_console(stdin, stdout, app));\r
- exec_on(con, Config);\r
- need_config= DD_FALSE;\r
- }\r
- if (need_config &&\r
- Config &&\r
- *Config)\r
- {\r
- FILE *fc= fopen(Config, "r");\r
- if (!fc)\r
- fprintf(stderr, "Can't open `%s': %s\n", Config, strerror(errno));\r
- else\r
- {\r
- con= new cl_console(fc, stderr, app);\r
- con->flags|= CONS_NOWELCOME|CONS_ECHO;\r
- add_console(con);\r
- }\r
- }\r
- return(0);\r
-}\r
-\r
-void\r
-cl_commander::set_fd_set(void)\r
-{\r
- int i;\r
-\r
- FD_ZERO(&read_set);\r
- fd_num = 0;\r
- for (i = 0; i < cons->count; i++)\r
- {\r
- class cl_console *c= dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(i)));\r
-\r
- if (c->input_active())\r
- {\r
- UCSOCKET_T fd = c->get_in_fd();\r
- assert(0 <= fd);\r
-\r
- FD_SET(fd, &read_set);\r
- if (fd > fd_num)\r
- fd_num = fd;\r
- }\r
- }\r
- fd_num++;\r
-}\r
-\r
-int\r
-cl_commander::input_avail(void)\r
-{\r
- struct timeval tv = {0, 0};\r
- active_set = read_set;\r
-\r
- int i = select(fd_num, &active_set, NULL, NULL, &tv);\r
- if (i < 0)\r
- perror("select");\r
-\r
- return i;\r
-}\r
-\r
-int\r
-cl_commander::wait_input(void)\r
-{\r
- prompt();\r
- active_set = read_set;\r
- int i = select(fd_num, &active_set, NULL, NULL, NULL);\r
- return i;\r
-}\r
-\r
-int\r
-cl_commander::proc_input(void)\r
-{\r
- for (int j = 0; j < cons->count; j++)\r
- {\r
- class cl_console *c = dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(j)));\r
-\r
- if (c->input_active())\r
- {\r
- UCSOCKET_T fd = c->get_in_fd();\r
- assert(0 <= fd);\r
-\r
- if (FD_ISSET(fd, &active_set))\r
- {\r
- actual_console = c;\r
- int retval = c->proc_input(cmdset);\r
- if (retval)\r
- {\r
- del_console(c);\r
- delete c;\r
- }\r
- actual_console = 0;\r
- return(0 == cons->count);\r
- }\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-\r
-/* End of cmd.src/newcmdposix.cc */\r
+/*
+ * Simulator of microcontrollers (cmd.src/newcmdposix.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ * Copyright (C) 2006, Borut Razem - borut.razem@siol.net
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#ifdef SOCKET_AVAIL
+# include HEADER_SOCKET
+# if defined HAVE_SYS_SOCKET_H
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <netdb.h>
+# endif
+#endif
+#if FD_HEADER_OK
+# include HEADER_FD
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "i_string.h"
+
+#include "cmdlexcl.h"
+#include "cmdpars.h"
+
+// prj
+#include "globals.h"
+#include "utils.h"
+
+// sim
+#include "simcl.h"
+#include "argcl.h"
+#include "appcl.h"
+
+// local
+#include "newcmdposixcl.h"
+
+
+/*
+ * Command console
+ *____________________________________________________________________________
+ */
+
+cl_console::cl_console(char *fin, char *fout, class cl_app *the_app)
+{
+ FILE *f;
+
+ app= the_app;
+ in= 0;
+ if (fin)
+ if (f= fopen(fin, "r"), in= f, !f)
+ fprintf(stderr, "Can't open `%s': %s\n", fin, strerror(errno));
+ out= 0;
+ if (fout)
+ if (f= fopen(fout, "w"), out= f, !f)
+ fprintf(stderr, "Can't open `%s': %s\n", fout, strerror(errno));
+ prompt= 0;
+ flags= CONS_NONE;
+ if (is_tty())
+ flags|= CONS_INTERACTIVE;
+ else
+ ;//fprintf(stderr, "Warning: non-interactive console\n");
+ rout= 0;
+ id= 0;
+ lines_printed= new cl_ustrings(100, 100, "console_cache");
+}
+
+cl_console::cl_console(FILE *fin, FILE *fout, class cl_app *the_app)
+{
+ app= the_app;
+ in = fin;
+ out= fout;
+ prompt= 0;
+ flags= CONS_NONE;
+ if (is_tty())
+ flags|= CONS_INTERACTIVE;
+ else
+ ;//fprintf(stderr, "Warning: non-interactive console\n");
+ rout= 0;
+ id= 0;
+ lines_printed= new cl_ustrings(100, 100, "console_cache");
+}
+
+class cl_console *
+cl_console::clone_for_exec(char *fin)
+{
+ FILE *fi= 0, *fo= 0;
+
+ if (!fin)
+ return(0);
+ if (fi= fopen(fin, "r"), !fi)
+ {
+ fprintf(stderr, "Can't open `%s': %s\n", fin, strerror(errno));
+ return(0);
+ }
+ if ((fo= fdopen(dup(fileno(out)), "a")) == 0)
+ {
+ fclose(fi);
+ fprintf(stderr, "Can't re-open output file: %s\n", strerror(errno));
+ return(0);
+ }
+ class cl_console *con= new cl_sub_console(this, fi, fo, app);
+ return(con);
+}
+
+cl_console::~cl_console(void)
+{
+ if (in)
+ fclose(in);
+ un_redirect();
+ if (out)
+ {
+ if (flags & CONS_PROMPT)
+ fprintf(out, "\n");
+ fflush(out);
+ fclose(out);
+ }
+ delete prompt_option;
+ delete null_prompt_option;
+ delete debug_option;
+#ifdef SOCKET_AVAIL
+ /* if (sock)
+ {
+ shutdown(sock, 2);
+ close(sock);
+ }*/
+#endif
+}
+
+
+/*
+ * Output functions
+ */
+
+void
+cl_console::redirect(char *fname, char *mode)
+{
+ if ((rout= fopen(fname, mode)) == NULL)
+ dd_printf("Unable to open file '%s' for %s: %s\n",
+ fname, (mode[0]=='w')?"write":"append", strerror(errno));
+}
+
+void
+cl_console::un_redirect(void)
+{
+ if (!rout)
+ return;
+ fclose(rout);
+ rout = NULL;
+}
+
+int
+cl_console::cmd_do_print(char *format, va_list ap)
+{
+ int ret;
+ FILE *f = get_out();
+
+ if (f)
+ {
+ ret= vfprintf(f, format, ap);
+ fflush(f);
+ }
+ else
+ ret = 0;
+
+ return ret;
+}
+
+/*
+ * Input functions
+ */
+
+char *
+cl_console::read_line(void)
+{
+ char *s= NULL;
+
+#ifdef HAVE_GETLINE
+ if (getline(&s, 0, in) < 0)
+ return(0);
+#elif defined HAVE_GETDELIM
+ size_t n= 30;
+ s= (char *)malloc(n);
+ if (getdelim(&s, &n, '\n', in) < 0)
+ {
+ free(s);
+ return(0);
+ }
+#elif defined HAVE_FGETS
+ s= (char *)malloc(300);
+ if (fgets(s, 300, in) == NULL)
+ {
+ free(s);
+ return(0);
+ }
+#endif
+ s[strlen(s)-1]= '\0';
+ if (s[strlen(s)-1] == '\r')
+ s[strlen(s)-1]= '\0';
+ flags&= ~CONS_PROMPT;
+ return(s);
+}
+
+
+/*
+ * This console listen on a socket and can accept connection requests
+ */
+#ifdef SOCKET_AVAIL
+
+cl_listen_console::cl_listen_console(int serverport, class cl_app *the_app)
+{
+ 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= rout= 0;
+}
+
+int
+cl_listen_console::proc_input(class cl_cmdset *cmdset)
+{
+ int newsock;
+ ACCEPT_SOCKLEN_T size;
+ struct sockaddr_in sock_addr;
+ class cl_commander_base *cmd;
+ FILE *in, *out;
+
+ 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_base *c= new cl_console(in, out, app);
+ c->flags|= CONS_INTERACTIVE;
+ cmd->add_console(c);
+ return(0);
+}
+
+#endif /* SOCKET_AVAIL */
+
+
+/*
+ * Sub-console
+ */
+
+cl_sub_console::cl_sub_console(class cl_console_base *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_base *c= app->get_commander();
+
+ if (parent && c)
+ {
+ c->activate_console(parent);
+ }
+}
+
+int
+cl_sub_console::init(void)
+{
+ class cl_commander_base *c= app->get_commander();
+
+ if (parent && c)
+ {
+ c->deactivate_console(parent);
+ }
+ cl_console::init();
+ flags|= CONS_ECHO;
+ return(0);
+}
+
+
+/*
+ * Command interpreter
+ *____________________________________________________________________________
+ */
+
+int
+cl_commander::init(void)
+{
+ class cl_optref console_on_option(this);
+ class cl_optref config_file_option(this);
+ class cl_optref port_number_option(this);
+ class cl_console_base *con;
+
+ console_on_option.init();
+ console_on_option.use("console_on");
+ config_file_option.init();
+ config_file_option.use("config_file");
+ port_number_option.init();
+
+ cl_base::init();
+ set_name("Commander");
+
+ bool need_config= DD_TRUE;
+
+#ifdef SOCKET_AVAIL
+ if (port_number_option.use("port_number"))
+ add_console(new cl_listen_console(port_number_option.get_value((long)0), app));
+#endif
+
+ /* The following code is commented out because it produces gcc warnings
+ * newcmd.cc: In member function `virtual int cl_commander::init()':
+ * newcmd.cc:785: warning: 'Config' might be used uninitialized in this function
+ * newcmd.cc:786: warning: 'cn' might be used uninitialized in this function
+ */
+ /*
+ char *Config= config_file_option.get_value(Config);
+ char *cn= console_on_option.get_value(cn);
+ */
+ /* Here shoud probably be something else, but is still better then the former code... */
+ char *Config= config_file_option.get_value("");
+ char *cn= console_on_option.get_value("");
+
+ if (cn)
+ {
+ add_console(con= new cl_console(cn, cn, app));
+ exec_on(con, Config);
+ need_config= DD_FALSE;
+ }
+ if (cons->get_count() == 0)
+ {
+ add_console(con= new cl_console(stdin, stdout, app));
+ exec_on(con, Config);
+ need_config= DD_FALSE;
+ }
+ if (need_config &&
+ Config &&
+ *Config)
+ {
+ FILE *fc= fopen(Config, "r");
+ if (!fc)
+ fprintf(stderr, "Can't open `%s': %s\n", Config, strerror(errno));
+ else
+ {
+ con= new cl_console(fc, stderr, app);
+ con->flags|= CONS_NOWELCOME|CONS_ECHO;
+ add_console(con);
+ }
+ }
+ return(0);
+}
+
+void
+cl_commander::set_fd_set(void)
+{
+ int i;
+
+ FD_ZERO(&read_set);
+ fd_num = 0;
+ for (i = 0; i < cons->count; i++)
+ {
+ class cl_console *c= dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(i)));
+
+ if (c->input_active())
+ {
+ UCSOCKET_T fd = c->get_in_fd();
+ assert(0 <= fd);
+
+ FD_SET(fd, &read_set);
+ if (fd > fd_num)
+ fd_num = fd;
+ }
+ }
+ fd_num++;
+}
+
+int
+cl_commander::input_avail(void)
+{
+ struct timeval tv = {0, 0};
+ active_set = read_set;
+
+ int i = select(fd_num, &active_set, NULL, NULL, &tv);
+ if (i < 0)
+ perror("select");
+
+ return i;
+}
+
+int
+cl_commander::wait_input(void)
+{
+ prompt();
+ active_set = read_set;
+ int i = select(fd_num, &active_set, NULL, NULL, NULL);
+ return i;
+}
+
+int
+cl_commander::proc_input(void)
+{
+ for (int j = 0; j < cons->count; j++)
+ {
+ class cl_console *c = dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(j)));
+
+ if (c->input_active())
+ {
+ UCSOCKET_T fd = c->get_in_fd();
+ assert(0 <= fd);
+
+ if (FD_ISSET(fd, &active_set))
+ {
+ actual_console = c;
+ int retval = c->proc_input(cmdset);
+ if (retval)
+ {
+ del_console(c);
+ delete c;
+ }
+ actual_console = 0;
+ return(0 == cons->count);
+ }
+ }
+ }
+ return 0;
+}
+
+
+/* End of cmd.src/newcmdposix.cc */