1b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//===-- CommandObjectPlatform.cpp -------------------------------*- C++ -*-===//
2b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
3b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//                     The LLVM Compiler Infrastructure
4b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
5b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// This file is distributed under the University of Illinois Open Source
6b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// License. See LICENSE.TXT for details.
7b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
8b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//===----------------------------------------------------------------------===//
9b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "CommandObjectPlatform.h"
13b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
14b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C Includes
15b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C++ Includes
16b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Other libraries and framework includes
17b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Project includes
18b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/DataExtractor.h"
19b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/Debugger.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
21b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/PluginManager.h"
22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Interpreter/Args.h"
23b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h"
24b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Interpreter/CommandReturnObject.h"
25abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#include "lldb/Interpreter/OptionGroupPlatform.h"
26b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/ExecutionContext.h"
27b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Platform.h"
28f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Target/Process.h"
29b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
30b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb;
31b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb_private;
32b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
33143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
34b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
35abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// "platform select <platform-name>"
36b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
37da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformSelect : public CommandObjectParsed
38b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
39b1888f24fa181489840b9acf193e224d125d0776Greg Claytonpublic:
40143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    CommandObjectPlatformSelect (CommandInterpreter &interpreter) :
41da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
42da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform select",
43da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Create a platform if needed and select it as the current platform.",
44da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform select <platform-name>",
45da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0),
46143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        m_option_group (interpreter),
47143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        m_platform_options (false) // Don't include the "--platform" option by passing false
48b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
495e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        m_option_group.Append (&m_platform_options, LLDB_OPT_SET_ALL, 1);
50143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        m_option_group.Finalize();
51b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
52b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
53b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual
54143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ~CommandObjectPlatformSelect ()
55b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
56b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
57b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
58da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual int
59da26bd203cbb104291b39891febf7481794f205fJim Ingham    HandleCompletion (Args &input,
60da26bd203cbb104291b39891febf7481794f205fJim Ingham                      int &cursor_index,
61da26bd203cbb104291b39891febf7481794f205fJim Ingham                      int &cursor_char_position,
62da26bd203cbb104291b39891febf7481794f205fJim Ingham                      int match_start_point,
63da26bd203cbb104291b39891febf7481794f205fJim Ingham                      int max_return_elements,
64da26bd203cbb104291b39891febf7481794f205fJim Ingham                      bool &word_complete,
65da26bd203cbb104291b39891febf7481794f205fJim Ingham                      StringList &matches)
66da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
67da26bd203cbb104291b39891febf7481794f205fJim Ingham        std::string completion_str (input.GetArgumentAtIndex(cursor_index));
68da26bd203cbb104291b39891febf7481794f205fJim Ingham        completion_str.erase (cursor_char_position);
69da26bd203cbb104291b39891febf7481794f205fJim Ingham
70da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandCompletions::PlatformPluginNames (m_interpreter,
71da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 completion_str.c_str(),
72da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 match_start_point,
73da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 max_return_elements,
74da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 NULL,
75da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 word_complete,
76da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                 matches);
77da26bd203cbb104291b39891febf7481794f205fJim Ingham        return matches.GetSize();
78da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
79da26bd203cbb104291b39891febf7481794f205fJim Ingham
80da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual Options *
81da26bd203cbb104291b39891febf7481794f205fJim Ingham    GetOptions ()
82da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
83da26bd203cbb104291b39891febf7481794f205fJim Ingham        return &m_option_group;
84da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
85da26bd203cbb104291b39891febf7481794f205fJim Ingham
86da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
87b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual bool
88da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
89b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
90b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (args.GetArgumentCount() == 1)
91b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
925e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            const char *platform_name = args.GetArgumentAtIndex (0);
935e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            if (platform_name && platform_name[0])
945e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            {
955e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                const bool select = true;
96abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                m_platform_options.SetPlatformName (platform_name);
975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                Error error;
98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                ArchSpec platform_arch;
99b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                PlatformSP platform_sp (m_platform_options.CreatePlatformWithOptions (m_interpreter, ArchSpec(), select, error, platform_arch));
1005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                if (platform_sp)
1015e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                {
1025e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    platform_sp->GetStatus (result.GetOutputStream());
1035e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    result.SetStatus (eReturnStatusSuccessFinishResult);
1045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                }
1055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                else
1065e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                {
1075e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    result.AppendError(error.AsCString());
1085e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    result.SetStatus (eReturnStatusFailed);
1095e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                }
1105e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            }
1115e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            else
1125e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            {
1135e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                result.AppendError ("invalid platform name");
1145e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                result.SetStatus (eReturnStatusFailed);
1155e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            }
116b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
117b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
11924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            result.AppendError ("platform create takes a platform name as an argument\n");
120b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            result.SetStatus (eReturnStatusFailed);
121b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
122b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return result.Succeeded();
123b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
124abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
125143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    OptionGroupOptions m_option_group;
126abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    OptionGroupPlatform m_platform_options;
127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton};
128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// "platform list"
131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
132da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformList : public CommandObjectParsed
133b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
134b1888f24fa181489840b9acf193e224d125d0776Greg Claytonpublic:
135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    CommandObjectPlatformList (CommandInterpreter &interpreter) :
136da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
137da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform list",
138da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "List all platforms that are available.",
139da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL,
140da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0)
141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
142b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
143b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual
145b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    ~CommandObjectPlatformList ()
146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
149da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual bool
151da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
152b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Stream &ostrm = result.GetOutputStream();
154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ostrm.Printf("Available platforms:\n");
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        PlatformSP host_platform_sp (Platform::GetDefaultPlatform());
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ostrm.Printf ("%s: %s\n",
1580e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                      host_platform_sp->GetPluginName().GetCString(),
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      host_platform_sp->GetDescription());
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
161b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t idx;
162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        for (idx = 0; 1; ++idx)
163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const char *plugin_name = PluginManager::GetPlatformPluginNameAtIndex (idx);
165b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (plugin_name == NULL)
166b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                break;
167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const char *plugin_desc = PluginManager::GetPlatformPluginDescriptionAtIndex (idx);
168b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (plugin_desc == NULL)
169b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                break;
170b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            ostrm.Printf("%s: %s\n", plugin_name, plugin_desc);
171b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
172b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
173b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (idx == 0)
174b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
17558e26e0935138225477fd61283215ceff2068899Greg Clayton            result.AppendError ("no platforms are available\n");
176b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            result.SetStatus (eReturnStatusFailed);
177b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
1780815031982a0461fd4466cdcdd15d9220a93ca26Johnny Chen        else
1790815031982a0461fd4466cdcdd15d9220a93ca26Johnny Chen            result.SetStatus (eReturnStatusSuccessFinishResult);
180b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return result.Succeeded();
181b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
182b1888f24fa181489840b9acf193e224d125d0776Greg Clayton};
183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
185b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// "platform status"
186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
187da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformStatus : public CommandObjectParsed
188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
189b1888f24fa181489840b9acf193e224d125d0776Greg Claytonpublic:
190b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    CommandObjectPlatformStatus (CommandInterpreter &interpreter) :
191da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
192da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform status",
193da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Display status for the currently selected platform.",
194da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL,
195da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0)
196b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
197b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
198b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
199b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual
200b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    ~CommandObjectPlatformStatus ()
201b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
202b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
203b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
204da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
205b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    virtual bool
206da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
207b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
208b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Stream &ostrm = result.GetOutputStream();
209b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
21032949387a93392818418fab844c274877ac68c0fJason Molenda        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
21132949387a93392818418fab844c274877ac68c0fJason Molenda        PlatformSP platform_sp;
21232949387a93392818418fab844c274877ac68c0fJason Molenda        if (target)
21332949387a93392818418fab844c274877ac68c0fJason Molenda        {
21432949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = target->GetPlatform();
21532949387a93392818418fab844c274877ac68c0fJason Molenda        }
21632949387a93392818418fab844c274877ac68c0fJason Molenda        if (!platform_sp)
21732949387a93392818418fab844c274877ac68c0fJason Molenda        {
21832949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform();
21932949387a93392818418fab844c274877ac68c0fJason Molenda        }
220ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        if (platform_sp)
221b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
222ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            platform_sp->GetStatus (ostrm);
223b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            result.SetStatus (eReturnStatusSuccessFinishResult);
224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
22758e26e0935138225477fd61283215ceff2068899Greg Clayton            result.AppendError ("no platform us currently selected\n");
228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            result.SetStatus (eReturnStatusFailed);
229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return result.Succeeded();
231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton};
233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
234cb8977d726be451df9978a74088435667fa37da2Greg Clayton//----------------------------------------------------------------------
235cb8977d726be451df9978a74088435667fa37da2Greg Clayton// "platform connect <connect-url>"
236cb8977d726be451df9978a74088435667fa37da2Greg Clayton//----------------------------------------------------------------------
237da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformConnect : public CommandObjectParsed
238cb8977d726be451df9978a74088435667fa37da2Greg Clayton{
239cb8977d726be451df9978a74088435667fa37da2Greg Claytonpublic:
240cb8977d726be451df9978a74088435667fa37da2Greg Clayton    CommandObjectPlatformConnect (CommandInterpreter &interpreter) :
241da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
242da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform connect",
243da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Connect a platform by name to be the currently selected platform.",
244da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform connect <connect-url>",
245da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0)
246cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
247cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
248cb8977d726be451df9978a74088435667fa37da2Greg Clayton
249cb8977d726be451df9978a74088435667fa37da2Greg Clayton    virtual
250cb8977d726be451df9978a74088435667fa37da2Greg Clayton    ~CommandObjectPlatformConnect ()
251cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
252cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
253cb8977d726be451df9978a74088435667fa37da2Greg Clayton
254da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
255cb8977d726be451df9978a74088435667fa37da2Greg Clayton    virtual bool
256da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
257cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
258cb8977d726be451df9978a74088435667fa37da2Greg Clayton        Stream &ostrm = result.GetOutputStream();
259cb8977d726be451df9978a74088435667fa37da2Greg Clayton
260ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
261ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        if (platform_sp)
262cb8977d726be451df9978a74088435667fa37da2Greg Clayton        {
263ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            Error error (platform_sp->ConnectRemote (args));
264cb8977d726be451df9978a74088435667fa37da2Greg Clayton            if (error.Success())
265cb8977d726be451df9978a74088435667fa37da2Greg Clayton            {
266ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                platform_sp->GetStatus (ostrm);
267cb8977d726be451df9978a74088435667fa37da2Greg Clayton                result.SetStatus (eReturnStatusSuccessFinishResult);
268cb8977d726be451df9978a74088435667fa37da2Greg Clayton            }
269cb8977d726be451df9978a74088435667fa37da2Greg Clayton            else
270cb8977d726be451df9978a74088435667fa37da2Greg Clayton            {
27158e26e0935138225477fd61283215ceff2068899Greg Clayton                result.AppendErrorWithFormat ("%s\n", error.AsCString());
272cb8977d726be451df9978a74088435667fa37da2Greg Clayton                result.SetStatus (eReturnStatusFailed);
273cb8977d726be451df9978a74088435667fa37da2Greg Clayton            }
274cb8977d726be451df9978a74088435667fa37da2Greg Clayton        }
275cb8977d726be451df9978a74088435667fa37da2Greg Clayton        else
276cb8977d726be451df9978a74088435667fa37da2Greg Clayton        {
27758e26e0935138225477fd61283215ceff2068899Greg Clayton            result.AppendError ("no platform us currently selected\n");
278cb8977d726be451df9978a74088435667fa37da2Greg Clayton            result.SetStatus (eReturnStatusFailed);
279cb8977d726be451df9978a74088435667fa37da2Greg Clayton        }
280cb8977d726be451df9978a74088435667fa37da2Greg Clayton        return result.Succeeded();
281cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
282cb8977d726be451df9978a74088435667fa37da2Greg Clayton};
283cb8977d726be451df9978a74088435667fa37da2Greg Clayton
284cb8977d726be451df9978a74088435667fa37da2Greg Clayton//----------------------------------------------------------------------
285cb8977d726be451df9978a74088435667fa37da2Greg Clayton// "platform disconnect"
286cb8977d726be451df9978a74088435667fa37da2Greg Clayton//----------------------------------------------------------------------
287da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformDisconnect : public CommandObjectParsed
288cb8977d726be451df9978a74088435667fa37da2Greg Clayton{
289cb8977d726be451df9978a74088435667fa37da2Greg Claytonpublic:
290cb8977d726be451df9978a74088435667fa37da2Greg Clayton    CommandObjectPlatformDisconnect (CommandInterpreter &interpreter) :
291da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
292da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform disconnect",
293da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Disconnect a platform by name to be the currently selected platform.",
294da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform disconnect",
295da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0)
296cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
297cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
298cb8977d726be451df9978a74088435667fa37da2Greg Clayton
299cb8977d726be451df9978a74088435667fa37da2Greg Clayton    virtual
300cb8977d726be451df9978a74088435667fa37da2Greg Clayton    ~CommandObjectPlatformDisconnect ()
301cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
302cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
303cb8977d726be451df9978a74088435667fa37da2Greg Clayton
304da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
305cb8977d726be451df9978a74088435667fa37da2Greg Clayton    virtual bool
306da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
307cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
308ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
309ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        if (platform_sp)
310cb8977d726be451df9978a74088435667fa37da2Greg Clayton        {
311cb8977d726be451df9978a74088435667fa37da2Greg Clayton            if (args.GetArgumentCount() == 0)
312cb8977d726be451df9978a74088435667fa37da2Greg Clayton            {
313cb8977d726be451df9978a74088435667fa37da2Greg Clayton                Error error;
314cb8977d726be451df9978a74088435667fa37da2Greg Clayton
315ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                if (platform_sp->IsConnected())
316cb8977d726be451df9978a74088435667fa37da2Greg Clayton                {
317cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    // Cache the instance name if there is one since we are
318cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    // about to disconnect and the name might go with it.
319ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    const char *hostname_cstr = platform_sp->GetHostname();
32058e26e0935138225477fd61283215ceff2068899Greg Clayton                    std::string hostname;
32158e26e0935138225477fd61283215ceff2068899Greg Clayton                    if (hostname_cstr)
32258e26e0935138225477fd61283215ceff2068899Greg Clayton                        hostname.assign (hostname_cstr);
323cb8977d726be451df9978a74088435667fa37da2Greg Clayton
324ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    error = platform_sp->DisconnectRemote ();
325cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    if (error.Success())
326cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    {
327cb8977d726be451df9978a74088435667fa37da2Greg Clayton                        Stream &ostrm = result.GetOutputStream();
32858e26e0935138225477fd61283215ceff2068899Greg Clayton                        if (hostname.empty())
3290e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                            ostrm.Printf ("Disconnected from \"%s\"\n", platform_sp->GetPluginName().GetCString());
330cb8977d726be451df9978a74088435667fa37da2Greg Clayton                        else
33158e26e0935138225477fd61283215ceff2068899Greg Clayton                            ostrm.Printf ("Disconnected from \"%s\"\n", hostname.c_str());
332cb8977d726be451df9978a74088435667fa37da2Greg Clayton                        result.SetStatus (eReturnStatusSuccessFinishResult);
333cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    }
334cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    else
335cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    {
33658e26e0935138225477fd61283215ceff2068899Greg Clayton                        result.AppendErrorWithFormat ("%s", error.AsCString());
337cb8977d726be451df9978a74088435667fa37da2Greg Clayton                        result.SetStatus (eReturnStatusFailed);
338cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    }
339cb8977d726be451df9978a74088435667fa37da2Greg Clayton                }
340cb8977d726be451df9978a74088435667fa37da2Greg Clayton                else
341cb8977d726be451df9978a74088435667fa37da2Greg Clayton                {
342cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    // Not connected...
3430e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    result.AppendErrorWithFormat ("not connected to '%s'", platform_sp->GetPluginName().GetCString());
344cb8977d726be451df9978a74088435667fa37da2Greg Clayton                    result.SetStatus (eReturnStatusFailed);
345cb8977d726be451df9978a74088435667fa37da2Greg Clayton                }
346cb8977d726be451df9978a74088435667fa37da2Greg Clayton            }
347cb8977d726be451df9978a74088435667fa37da2Greg Clayton            else
348cb8977d726be451df9978a74088435667fa37da2Greg Clayton            {
349cb8977d726be451df9978a74088435667fa37da2Greg Clayton                // Bad args
350cb8977d726be451df9978a74088435667fa37da2Greg Clayton                result.AppendError ("\"platform disconnect\" doesn't take any arguments");
351cb8977d726be451df9978a74088435667fa37da2Greg Clayton                result.SetStatus (eReturnStatusFailed);
352cb8977d726be451df9978a74088435667fa37da2Greg Clayton            }
353cb8977d726be451df9978a74088435667fa37da2Greg Clayton        }
354cb8977d726be451df9978a74088435667fa37da2Greg Clayton        else
355cb8977d726be451df9978a74088435667fa37da2Greg Clayton        {
35658e26e0935138225477fd61283215ceff2068899Greg Clayton            result.AppendError ("no platform is currently selected");
357cb8977d726be451df9978a74088435667fa37da2Greg Clayton            result.SetStatus (eReturnStatusFailed);
358cb8977d726be451df9978a74088435667fa37da2Greg Clayton        }
359cb8977d726be451df9978a74088435667fa37da2Greg Clayton        return result.Succeeded();
360cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
361cb8977d726be451df9978a74088435667fa37da2Greg Clayton};
362b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//----------------------------------------------------------------------
363b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton// "platform process launch"
364b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//----------------------------------------------------------------------
365da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformProcessLaunch : public CommandObjectParsed
366b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
367b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonpublic:
368b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    CommandObjectPlatformProcessLaunch (CommandInterpreter &interpreter) :
369ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        CommandObjectParsed (interpreter,
370da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform process launch",
371da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Launch a new process on a remote platform.",
372da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform process launch program",
373ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagRequiresTarget | eFlagTryTargetAPILock),
374b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_options (interpreter)
375b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
376b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
377b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
378b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    virtual
379b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ~CommandObjectPlatformProcessLaunch ()
380b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
381b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
382b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
383da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual Options *
384da26bd203cbb104291b39891febf7481794f205fJim Ingham    GetOptions ()
385da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
386da26bd203cbb104291b39891febf7481794f205fJim Ingham        return &m_options;
387da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
388da26bd203cbb104291b39891febf7481794f205fJim Ingham
389da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
390b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    virtual bool
391da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
392b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
39332949387a93392818418fab844c274877ac68c0fJason Molenda        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
39432949387a93392818418fab844c274877ac68c0fJason Molenda        PlatformSP platform_sp;
39532949387a93392818418fab844c274877ac68c0fJason Molenda        if (target)
39632949387a93392818418fab844c274877ac68c0fJason Molenda        {
39732949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = target->GetPlatform();
39832949387a93392818418fab844c274877ac68c0fJason Molenda        }
39932949387a93392818418fab844c274877ac68c0fJason Molenda        if (!platform_sp)
40032949387a93392818418fab844c274877ac68c0fJason Molenda        {
40132949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform();
40232949387a93392818418fab844c274877ac68c0fJason Molenda        }
40332949387a93392818418fab844c274877ac68c0fJason Molenda
404b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (platform_sp)
405b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
406b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            Error error;
40736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const size_t argc = args.GetArgumentCount();
408ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            Target *target = m_exe_ctx.GetTargetPtr();
409abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            Module *exe_module = target->GetExecutableModulePointer();
410abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            if (exe_module)
411abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            {
412abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                m_options.launch_info.GetExecutableFile () = exe_module->GetFileSpec();
413abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                char exe_path[PATH_MAX];
414abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                if (m_options.launch_info.GetExecutableFile ().GetPath (exe_path, sizeof(exe_path)))
415abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                    m_options.launch_info.GetArguments().AppendArgument (exe_path);
416abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                m_options.launch_info.GetArchitecture() = exe_module->GetArchitecture();
417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (argc > 0)
420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (m_options.launch_info.GetExecutableFile ())
422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                {
423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    // We already have an executable file, so we will use this
424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    // and all arguments to this function are extra arguments
425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    m_options.launch_info.GetArguments().AppendArguments (args);
426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                }
427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                else
428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                {
429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    // We don't have any file yet, so the first argument is our
430b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    // executable, and the rest are program arguments
431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    const bool first_arg_is_executable = true;
4320c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton                    m_options.launch_info.SetArguments (args, first_arg_is_executable);
433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                }
434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (m_options.launch_info.GetExecutableFile ())
437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Debugger &debugger = m_interpreter.GetDebugger();
439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (argc == 0)
44173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    target->GetRunArguments(m_options.launch_info.GetArguments());
442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                ProcessSP process_sp (platform_sp->DebugProcess (m_options.launch_info,
444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                 debugger,
445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                 target,
446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                 debugger.GetListener(),
447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                 error));
448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (process_sp && process_sp->IsAlive())
449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                {
450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    result.SetStatus (eReturnStatusSuccessFinishNoResult);
451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    return true;
452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                }
453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (error.Success())
455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    result.AppendError ("process launch failed");
456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                else
457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    result.AppendError (error.AsCString());
458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                result.SetStatus (eReturnStatusFailed);
459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                result.AppendError ("'platform process launch' uses the current target file and arguments, or the executable and its arguments can be specified in this command");
463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                result.SetStatus (eReturnStatusFailed);
464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                return false;
465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        else
468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            result.AppendError ("no platform is selected\n");
470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return result.Succeeded();
472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonprotected:
475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessLaunchCommandOptions m_options;
476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton};
477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
478cb8977d726be451df9978a74088435667fa37da2Greg Clayton
479cb8977d726be451df9978a74088435667fa37da2Greg Clayton
48024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton//----------------------------------------------------------------------
48124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton// "platform process list"
48224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton//----------------------------------------------------------------------
483da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformProcessList : public CommandObjectParsed
48424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
48524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonpublic:
48624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    CommandObjectPlatformProcessList (CommandInterpreter &interpreter) :
487da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
488da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform process list",
489da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "List processes on a remote platform by name, pid, or many other matching attributes.",
490da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "platform process list",
491da26bd203cbb104291b39891febf7481794f205fJim Ingham                             0),
492f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
49324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
49424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
49524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
49624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    virtual
49724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    ~CommandObjectPlatformProcessList ()
49824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
49924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
50024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
501da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual Options *
502da26bd203cbb104291b39891febf7481794f205fJim Ingham    GetOptions ()
503da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
504da26bd203cbb104291b39891febf7481794f205fJim Ingham        return &m_options;
505da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
506da26bd203cbb104291b39891febf7481794f205fJim Ingham
507da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
50824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    virtual bool
509da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
51024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
51132949387a93392818418fab844c274877ac68c0fJason Molenda        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
51232949387a93392818418fab844c274877ac68c0fJason Molenda        PlatformSP platform_sp;
51332949387a93392818418fab844c274877ac68c0fJason Molenda        if (target)
51432949387a93392818418fab844c274877ac68c0fJason Molenda        {
51532949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = target->GetPlatform();
51632949387a93392818418fab844c274877ac68c0fJason Molenda        }
51732949387a93392818418fab844c274877ac68c0fJason Molenda        if (!platform_sp)
51832949387a93392818418fab844c274877ac68c0fJason Molenda        {
51932949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform();
52032949387a93392818418fab844c274877ac68c0fJason Molenda        }
52124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
52224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (platform_sp)
52324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
52424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Error error;
52524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (args.GetArgumentCount() == 0)
52624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
52724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
52824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                if (platform_sp)
52924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                {
530ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    Stream &ostrm = result.GetOutputStream();
531ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
53224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    lldb::pid_t pid = m_options.match_info.GetProcessInfo().GetProcessID();
53324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (pid != LLDB_INVALID_PROCESS_ID)
53424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    {
535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        ProcessInstanceInfo proc_info;
53624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        if (platform_sp->GetProcessInfo (pid, proc_info))
53724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        {
538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            ProcessInstanceInfo::DumpTableHeader (ostrm, platform_sp.get(), m_options.show_args, m_options.verbose);
539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            proc_info.DumpAsTableRow(ostrm, platform_sp.get(), m_options.show_args, m_options.verbose);
54024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            result.SetStatus (eReturnStatusSuccessFinishResult);
54124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        }
54224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        else
54324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        {
5445f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                            result.AppendErrorWithFormat ("no process found with pid = %" PRIu64 "\n", pid);
54524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            result.SetStatus (eReturnStatusFailed);
54624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        }
54724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    }
54824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    else
54924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    {
550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        ProcessInstanceInfoList proc_infos;
55124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        const uint32_t matches = platform_sp->FindProcesses (m_options.match_info, proc_infos);
552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        const char *match_desc = NULL;
553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        const char *match_name = m_options.match_info.GetProcessInfo().GetName();
554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        if (match_name && match_name[0])
55524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        {
556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            switch (m_options.match_info.GetNameMatchType())
55724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            {
558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchIgnore: break;
559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchEquals: match_desc = "matched"; break;
560b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchContains: match_desc = "contained"; break;
561b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchStartsWith: match_desc = "started with"; break;
562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchEndsWith: match_desc = "ended with"; break;
563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                case eNameMatchRegularExpression: match_desc = "matched the regular expression"; break;
56424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            }
565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        }
566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        if (matches == 0)
568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        {
56924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            if (match_desc)
57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                result.AppendErrorWithFormat ("no processes were found that %s \"%s\" on the \"%s\" platform\n",
57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                              match_desc,
57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                              match_name,
5730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                              platform_sp->GetPluginName().GetCString());
57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            else
5750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                result.AppendErrorWithFormat ("no processes were found on the \"%s\" platform\n", platform_sp->GetPluginName().GetCString());
57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            result.SetStatus (eReturnStatusFailed);
57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        }
57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        else
57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        {
580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            result.AppendMessageWithFormat ("%u matching process%s found on \"%s\"",
581b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                            matches,
582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                            matches > 1 ? "es were" : " was",
5830e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                            platform_sp->GetName().GetCString());
584b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            if (match_desc)
585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                result.AppendMessageWithFormat (" whose name %s \"%s\"",
586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                match_desc,
587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                match_name);
588b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            result.AppendMessageWithFormat ("\n");
589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            ProcessInstanceInfo::DumpTableHeader (ostrm, platform_sp.get(), m_options.show_args, m_options.verbose);
59024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            for (uint32_t i=0; i<matches; ++i)
59124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            {
592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                proc_infos.GetProcessInfoAtIndex(i).DumpAsTableRow(ostrm, platform_sp.get(), m_options.show_args, m_options.verbose);
59324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            }
59424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        }
59524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    }
59624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                }
59724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
59824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            else
59924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
60024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                result.AppendError ("invalid args: process list takes only options\n");
60124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                result.SetStatus (eReturnStatusFailed);
60224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
60324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
60424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        else
60524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
60624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            result.AppendError ("no platform is selected\n");
60724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            result.SetStatus (eReturnStatusFailed);
60824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
60924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return result.Succeeded();
61024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
61124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
61224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    class CommandOptions : public Options
61324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
61424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    public:
61524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
616f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
617f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options (interpreter),
61824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            match_info ()
61924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
62024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
62124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
62224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual
62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ~CommandOptions ()
62424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
62524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
62724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual Error
628143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
62924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
63024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Error error;
6316475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            const int short_option = m_getopt_table[option_idx].val;
63224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            bool success = false;
63324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
63424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            switch (short_option)
63524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
63624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'p':
63724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.GetProcessInfo().SetProcessID (Args::StringToUInt32 (option_arg, LLDB_INVALID_PROCESS_ID, 0, &success));
63824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
63924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid process ID string: '%s'", option_arg);
64024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
64124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
64224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'P':
64324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.GetProcessInfo().SetParentProcessID (Args::StringToUInt32 (option_arg, LLDB_INVALID_PROCESS_ID, 0, &success));
64424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
64524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid parent process ID string: '%s'", option_arg);
64624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
64724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
64824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'u':
649b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    match_info.GetProcessInfo().SetUserID (Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success));
65024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
65124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid user ID string: '%s'", option_arg);
65224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
65324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
65424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'U':
65524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.GetProcessInfo().SetEffectiveUserID (Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success));
65624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid effective user ID string: '%s'", option_arg);
65824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
65924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
66024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'g':
661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    match_info.GetProcessInfo().SetGroupID (Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success));
66224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
66324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid group ID string: '%s'", option_arg);
66424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
66524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
66624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'G':
66724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.GetProcessInfo().SetEffectiveGroupID (Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success));
66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (!success)
66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        error.SetErrorStringWithFormat("invalid effective group ID string: '%s'", option_arg);
67024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
67224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'a':
673f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                    match_info.GetProcessInfo().GetArchitecture().SetTriple (option_arg, m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform().get());
67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
67624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'n':
677527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo().GetExecutableFile().SetFile (option_arg, false);
678b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    match_info.SetNameMatchType (eNameMatchEquals);
67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
68024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
68124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'e':
682527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo().GetExecutableFile().SetFile (option_arg, false);
68324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.SetNameMatchType (eNameMatchEndsWith);
68424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
68624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 's':
687527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo().GetExecutableFile().SetFile (option_arg, false);
68824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.SetNameMatchType (eNameMatchStartsWith);
68924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
69024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
69124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'c':
692527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo().GetExecutableFile().SetFile (option_arg, false);
69324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.SetNameMatchType (eNameMatchContains);
69424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
69524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
69624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                case 'r':
697527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo().GetExecutableFile().SetFile (option_arg, false);
69824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    match_info.SetNameMatchType (eNameMatchRegularExpression);
69924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
70024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
701b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                case 'A':
702b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    show_args = true;
703b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    break;
704b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
705b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                case 'v':
706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    verbose = true;
707b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    break;
708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
70924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                default:
71024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
71124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
71224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
71324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
71424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return error;
71524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
71624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
71724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
718143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
71924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
72024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            match_info.Clear();
721b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            show_args = false;
722b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            verbose = false;
72324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
72424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
72524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const OptionDefinition*
72624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetDefinitions ()
72724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
72824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return g_option_table;
72924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
73024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
73124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Options table: Required for subclasses of Options.
73224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
73324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        static OptionDefinition g_option_table[];
73424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
73524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Instance variables to hold the values for command options.
73624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
737b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ProcessInstanceInfoMatch match_info;
738b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        bool show_args;
739b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        bool verbose;
74024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    };
74124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    CommandOptions m_options;
74224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton};
74324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
74424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonOptionDefinition
74524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonCommandObjectPlatformProcessList::CommandOptions::g_option_table[] =
74624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
747cdee761bcdae3ce1b0005b284f89002bce25e956Greg Clayton{ LLDB_OPT_SET_1            , false, "pid"        , 'p', required_argument, NULL, 0, eArgTypePid              , "List the process info for a specific process ID." },
748ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_2            , true , "name"       , 'n', required_argument, NULL, 0, eArgTypeProcessName      , "Find processes with executable basenames that match a string." },
749ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_3            , true , "ends-with"  , 'e', required_argument, NULL, 0, eArgTypeProcessName      , "Find processes with executable basenames that end with a string." },
750ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_4            , true , "starts-with", 's', required_argument, NULL, 0, eArgTypeProcessName      , "Find processes with executable basenames that start with a string." },
751ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_5            , true , "contains"   , 'c', required_argument, NULL, 0, eArgTypeProcessName      , "Find processes with executable basenames that contain a string." },
752ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_6            , true , "regex"      , 'r', required_argument, NULL, 0, eArgTypeRegularExpression, "Find processes with executable basenames that match a regular expression." },
753ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "parent"     , 'P', required_argument, NULL, 0, eArgTypePid              , "Find processes that have a matching parent process ID." },
754ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "uid"        , 'u', required_argument, NULL, 0, eArgTypeUnsignedInteger  , "Find processes that have a matching user ID." },
755ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "euid"       , 'U', required_argument, NULL, 0, eArgTypeUnsignedInteger  , "Find processes that have a matching effective user ID." },
756ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "gid"        , 'g', required_argument, NULL, 0, eArgTypeUnsignedInteger  , "Find processes that have a matching group ID." },
757ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "egid"       , 'G', required_argument, NULL, 0, eArgTypeUnsignedInteger  , "Find processes that have a matching effective group ID." },
758ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(2, 6), false, "arch"       , 'a', required_argument, NULL, 0, eArgTypeArchitecture     , "Find processes that have a matching architecture." },
759ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(1, 6), false, "show-args"  , 'A', no_argument      , NULL, 0, eArgTypeNone             , "Show process arguments instead of the process executable basename." },
760ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ LLDB_OPT_SET_FROM_TO(1, 6), false, "verbose"    , 'v', no_argument      , NULL, 0, eArgTypeNone             , "Enable verbose output." },
761ba9b2ae8ab5bf6c7a41502443cec26a068572df5Greg Clayton{ 0                         , false, NULL         ,  0 , 0                , NULL, 0, eArgTypeNone             , NULL }
76224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton};
76324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
764ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton//----------------------------------------------------------------------
765ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton// "platform process info"
766ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton//----------------------------------------------------------------------
767da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformProcessInfo : public CommandObjectParsed
768ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton{
769ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Claytonpublic:
770ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    CommandObjectPlatformProcessInfo (CommandInterpreter &interpreter) :
771da26bd203cbb104291b39891febf7481794f205fJim Ingham    CommandObjectParsed (interpreter,
772da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "platform process info",
773da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "Get detailed information for one or more process by process ID.",
774da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "platform process info <pid> [<pid> <pid> ...]",
775da26bd203cbb104291b39891febf7481794f205fJim Ingham                         0)
776ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
777ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        CommandArgumentEntry arg;
778ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        CommandArgumentData pid_args;
779ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
780ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        // Define the first (and only) variant of this arg.
781ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        pid_args.arg_type = eArgTypePid;
782ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        pid_args.arg_repetition = eArgRepeatStar;
783ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
784ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        // There is only one variant this argument could be; put it into the argument entry.
785ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        arg.push_back (pid_args);
786ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
787ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        // Push the data for the first argument into the m_arguments vector.
788ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        m_arguments.push_back (arg);
789ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
790ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
791ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    virtual
792ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    ~CommandObjectPlatformProcessInfo ()
793ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
794ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
795ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
796da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
797ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    virtual bool
798da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args, CommandReturnObject &result)
799ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
80032949387a93392818418fab844c274877ac68c0fJason Molenda        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
80132949387a93392818418fab844c274877ac68c0fJason Molenda        PlatformSP platform_sp;
80232949387a93392818418fab844c274877ac68c0fJason Molenda        if (target)
80332949387a93392818418fab844c274877ac68c0fJason Molenda        {
80432949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = target->GetPlatform();
80532949387a93392818418fab844c274877ac68c0fJason Molenda        }
80632949387a93392818418fab844c274877ac68c0fJason Molenda        if (!platform_sp)
80732949387a93392818418fab844c274877ac68c0fJason Molenda        {
80832949387a93392818418fab844c274877ac68c0fJason Molenda            platform_sp = m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform();
80932949387a93392818418fab844c274877ac68c0fJason Molenda        }
81032949387a93392818418fab844c274877ac68c0fJason Molenda
811ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        if (platform_sp)
812ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
813ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            const size_t argc = args.GetArgumentCount();
814ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (argc > 0)
815ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            {
816ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                Error error;
817ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
818ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                if (platform_sp->IsConnected())
819ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                {
820ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    Stream &ostrm = result.GetOutputStream();
821ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    bool success;
822ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    for (size_t i=0; i<argc; ++ i)
823ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    {
824ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        const char *arg = args.GetArgumentAtIndex(i);
825ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        lldb::pid_t pid = Args::StringToUInt32 (arg, LLDB_INVALID_PROCESS_ID, 0, &success);
826ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        if (success)
827ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        {
828b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                            ProcessInstanceInfo proc_info;
829ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            if (platform_sp->GetProcessInfo (pid, proc_info))
830ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            {
8315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                ostrm.Printf ("Process information for process %" PRIu64 ":\n", pid);
832ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                                proc_info.Dump (ostrm, platform_sp.get());
833ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            }
834ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            else
835ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            {
8365f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                ostrm.Printf ("error: no process information is available for process %" PRIu64 "\n", pid);
837ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            }
838ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            ostrm.EOL();
839ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        }
840ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        else
841ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        {
842ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            result.AppendErrorWithFormat ("invalid process ID argument '%s'", arg);
843ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            result.SetStatus (eReturnStatusFailed);
844ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                            break;
845ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        }
846ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    }
847ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                }
848ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                else
849ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                {
850ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    // Not connected...
8510e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    result.AppendErrorWithFormat ("not connected to '%s'", platform_sp->GetPluginName().GetCString());
852ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    result.SetStatus (eReturnStatusFailed);
853ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                }
854ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            }
855ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
856ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            {
8571736fef549879eae6c62f065b3272871a0cbc243Johnny Chen                // No args
8581736fef549879eae6c62f065b3272871a0cbc243Johnny Chen                result.AppendError ("one or more process id(s) must be specified");
859ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                result.SetStatus (eReturnStatusFailed);
860ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            }
861ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
862ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        else
863ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
864ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            result.AppendError ("no platform is currently selected");
865ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            result.SetStatus (eReturnStatusFailed);
866ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
867ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        return result.Succeeded();
868ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
869ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton};
870ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
871ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
872ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
873ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
87424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonclass CommandObjectPlatformProcess : public CommandObjectMultiword
87524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
87624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonpublic:
87724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    //------------------------------------------------------------------
87824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Constructors and Destructors
87924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    //------------------------------------------------------------------
88024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton     CommandObjectPlatformProcess (CommandInterpreter &interpreter) :
88124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        CommandObjectMultiword (interpreter,
88224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                "platform process",
88324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                "A set of commands to query, launch and attach to platform processes",
88424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                "platform process [attach|launch|list] ...")
88524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
88624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton//        LoadSubCommand ("attach", CommandObjectSP (new CommandObjectPlatformProcessAttach (interpreter)));
887b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        LoadSubCommand ("launch", CommandObjectSP (new CommandObjectPlatformProcessLaunch (interpreter)));
888ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        LoadSubCommand ("info"  , CommandObjectSP (new CommandObjectPlatformProcessInfo (interpreter)));
88924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        LoadSubCommand ("list"  , CommandObjectSP (new CommandObjectPlatformProcessList (interpreter)));
89024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
89124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
89224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
89324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    virtual
89424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    ~CommandObjectPlatformProcess ()
89524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
89624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
89724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
89824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonprivate:
89924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    //------------------------------------------------------------------
90024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // For CommandObjectPlatform only
90124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    //------------------------------------------------------------------
90224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (CommandObjectPlatformProcess);
90324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton};
904b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
90597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
906da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectPlatformShell : public CommandObjectRaw
90797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{
90897471184b8823c949bc68bbf54ea3edf3845a750Greg Claytonpublic:
90997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    CommandObjectPlatformShell (CommandInterpreter &interpreter) :
910da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectRaw (interpreter,
911da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "platform shell",
912da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "Run a shell command on a the selected platform.",
913da26bd203cbb104291b39891febf7481794f205fJim Ingham                         "platform shell <shell-command>",
914da26bd203cbb104291b39891febf7481794f205fJim Ingham                         0)
91597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    {
91697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    }
91797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
91897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    virtual
91997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    ~CommandObjectPlatformShell ()
92097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    {
92197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    }
92297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
923da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
92497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    virtual bool
925da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (const char *raw_command_line, CommandReturnObject &result)
92697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    {
92797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        // TODO: Implement "Platform::RunShellCommand()" and switch over to using
92897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        // the current platform when it is in the interface.
92997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        const char *working_dir = NULL;
93097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        std::string output;
93197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        int status = -1;
93297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        int signo = -1;
93397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        Error error (Host::RunShellCommand (raw_command_line, working_dir, &status, &signo, &output, 10));
93497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        if (!output.empty())
93597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            result.GetOutputStream().PutCString(output.c_str());
93697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        if (status > 0)
93797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        {
93897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            if (signo > 0)
93997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            {
94097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                const char *signo_cstr = Host::GetSignalAsCString(signo);
94197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                if (signo_cstr)
94297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                    result.GetOutputStream().Printf("error: command returned with status %i and signal %s\n", status, signo_cstr);
94397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                else
94497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                    result.GetOutputStream().Printf("error: command returned with status %i and signal %i\n", status, signo);
94597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            }
94697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            else
94797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                result.GetOutputStream().Printf("error: command returned with status %i\n", status);
94897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        }
94997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
95097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        if (error.Fail())
95197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        {
95297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            result.AppendError(error.AsCString());
95397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            result.SetStatus (eReturnStatusFailed);
95497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        }
95597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        else
95697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        {
95797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            result.SetStatus (eReturnStatusSuccessFinishResult);
95897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        }
95997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        return true;
96097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    }
96197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton};
96297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
963b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
964b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// CommandObjectPlatform constructor
965b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
966b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonCommandObjectPlatform::CommandObjectPlatform(CommandInterpreter &interpreter) :
967b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    CommandObjectMultiword (interpreter,
968b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            "platform",
969b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            "A set of commands to manage and create platforms.",
970143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                            "platform [connect|disconnect|info|list|status|select] ...")
971b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
972b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    LoadSubCommand ("select", CommandObjectSP (new CommandObjectPlatformSelect  (interpreter)));
973143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    LoadSubCommand ("list"  , CommandObjectSP (new CommandObjectPlatformList    (interpreter)));
974b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    LoadSubCommand ("status", CommandObjectSP (new CommandObjectPlatformStatus  (interpreter)));
975cb8977d726be451df9978a74088435667fa37da2Greg Clayton    LoadSubCommand ("connect", CommandObjectSP (new CommandObjectPlatformConnect  (interpreter)));
976cb8977d726be451df9978a74088435667fa37da2Greg Clayton    LoadSubCommand ("disconnect", CommandObjectSP (new CommandObjectPlatformDisconnect  (interpreter)));
97724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    LoadSubCommand ("process", CommandObjectSP (new CommandObjectPlatformProcess  (interpreter)));
97897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    LoadSubCommand ("shell", CommandObjectSP (new CommandObjectPlatformShell  (interpreter)));
979b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
980b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
981b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
982b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
983b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Destructor
984b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//----------------------------------------------------------------------
985b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonCommandObjectPlatform::~CommandObjectPlatform()
986b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
987b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
988