set svn properties
[fw/sdcc] / sim / ucsim / cmd.src / newcmdposix.cc
index f82bcad0629c28c8f05be23938b5cefea44c6da7..0ad9a533520b4d8c86cea3d2eef491932427f6ec 100644 (file)
-/*\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 */