1// -*- Mode: C++ -*-
2// vim:ft=cpp
3/*
4 * Copyright (C) 2016 Kernkonzept GmbH.
5 * Author(s): Sarah Hoffmann <sarah.hoffmann@kernkonzept.com>
6 *
7 * This file is distributed under the terms of the GNU General Public
8 * License, version 2.  Please see the COPYING-GPL-2 file for details.
9 */
10#pragma once
11
12#include <l4/sys/cxx/ipc_epiface>
13#include <l4/sys/cxx/ipc_string>
14
15namespace L4Re { namespace Ned {
16
17/**
18 * Direct control interface for Ned.
19 */
20class Cmd_control : public L4::Kobject_0t<Cmd_control>
21{
22  L4_INLINE_RPC_NF(long, execute, (L4::Ipc::String<> cmd,
23                                   L4::Ipc::Array<char> &result));
24
25public:
26  /**
27   * Execute the given Lua code.
28   *
29   * \param[in]  cmd     String with Lua code to execute.
30   *
31   * \retval L4_EOK      Code was successfully executed.
32   * \retval -L4_EINVAL  Code could not be parsed.
33   * \retval -L4_EIO     Error during code execution.
34   *
35   * The code is executed using the global Lua state of ned
36   * which is retained between successive calls to execute.
37   * Thus you may define data in one call to execute and use
38   * it in a subsequent call.
39   *
40   * This function does not return any results from the execution
41   * of the Lua code itself.
42   */
43  long execute(L4::Ipc::String<> cmd) noexcept
44  {
45    L4::Ipc::Array<char> res(0, NULL);
46    return execute_t::call(c(), cmd, res);
47  }
48
49  /**
50   * Execute the given Lua code.
51   *
52   * \param[in]  cmd     String with Lua code to execute.
53   * \param[out] result  The first return value of the Lua code block
54   *                     as string.
55   *
56   * \retval L4_EOK      Code was successfully executed.
57   * \retval -L4_EINVAL  Code could not be parsed.
58   * \retval -L4_EIO     Error during code execution.
59   *
60   * The code is executed using the global Lua state of ned
61   * which is retained between successive calls to execute.
62   * Thus you may define data in one call to execute and use
63   * it in a subsequent call.
64   */
65  long execute(L4::Ipc::String<> cmd,
66               L4::Ipc::String<char> *result) noexcept
67  {
68    L4::Ipc::Array<char> res(result->length, result->data);
69    long r = execute_t::call(c(), cmd, res);
70    if (r >= 0)
71      result->length = res.length;
72    return r;
73  }
74
75  typedef L4::Typeid::Rpcs<execute_t> Rpcs;
76};
77
78} } // namespace
79