home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / shell.C < prev    next >
C/C++ Source or Header  |  1998-11-17  |  3KB  |  127 lines

  1. // $Id: shell.C,v 1.15 1998/11/17 11:09:33 zeller Exp $ -*- C++ -*-
  2. // Shell commands
  3.  
  4. // Copyright (C) 1996 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char shell_rcsid[] = 
  30.     "$Id: shell.C,v 1.15 1998/11/17 11:09:33 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "shell.h"
  37.  
  38. #include "ddd.h"
  39. #include "AppData.h"
  40. #include "hostname.h"
  41. #include "windows.h"
  42. #include "environ.h"
  43.  
  44. #include <stdlib.h>
  45. #include <iostream.h>
  46.  
  47. //-----------------------------------------------------------------------------
  48. // Remote commands
  49. //-----------------------------------------------------------------------------
  50.  
  51. // Host management
  52. string gdb_host;          // non-empty if separate host
  53.  
  54. bool remote_gdb()
  55. {
  56.     return gdb_host != "";
  57. }
  58.  
  59. string sh_quote(string s)
  60. {
  61.     s.gsub('\'', "'\\''");
  62.     return string('\'') + s + '\'';
  63. }
  64.  
  65. string _sh_command(string command, bool force_local, 
  66.            bool force_display_settings)
  67. {
  68.     // Fetch display settings
  69.     string display;
  70.     if (command_shell != 0)
  71.     display = XDisplayString(XtDisplay(command_shell));
  72.     else if (getenv("DISPLAY") != 0)
  73.     display = getenv("DISPLAY");
  74.     else
  75.     display = "";
  76.  
  77.     // Make sure display contains host name
  78.     if (display.contains("unix:", 0) || display.contains(":", 0))
  79.     {
  80.     display = string(hostname()) + display.from(":");
  81.     }
  82.  
  83.     // Make sure display contains fully qualified host name
  84.     if (display.contains(":") && !display.contains("::"))
  85.     {
  86.     string host = display.before(':');
  87.     display = string(fullhostname(host)) + display.from(":");
  88.     }
  89.  
  90.     string settings = "";
  91.     if (display != "")
  92.     {
  93.     settings += 
  94.         "DISPLAY=${DISPLAY-" + sh_quote(display) + "}; export DISPLAY; ";
  95.     }
  96.     settings += set_environment_command();
  97.  
  98.     if (force_local || !remote_gdb())
  99.     {
  100.     if (command == "")
  101.         return "";
  102.     if (force_display_settings)
  103.         command = settings + command;
  104.     return "/bin/sh -c " + sh_quote(command);
  105.     }
  106.  
  107.     string rsh = app_data.rsh_command;
  108.     string login = app_data.debugger_host_login;
  109.     if (login != "")
  110.     rsh += " -l " + login;
  111.  
  112.     rsh += " " + gdb_host;
  113.  
  114.     if (command != "")
  115.     rsh += " /bin/sh -c " + sh_quote(sh_quote(settings + command));
  116.  
  117.     return rsh;
  118. }
  119.  
  120. string sh_command(string command, bool force_local)
  121. {
  122.     string ret = _sh_command(command, force_local);
  123.     dddlog << "+  " << ret << "\n";
  124.     dddlog.flush();
  125.     return ret;
  126. }
  127.