]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - stand/lua/cli.lua
MFV r329807:
[FreeBSD/FreeBSD.git] / stand / lua / cli.lua
1 --
2 -- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
3 -- All rights reserved.
4 --
5 -- Redistribution and use in source and binary forms, with or without
6 -- modification, are permitted provided that the following conditions
7 -- are met:
8 -- 1. Redistributions of source code must retain the above copyright
9 --    notice, this list of conditions and the following disclaimer.
10 -- 2. Redistributions in binary form must reproduce the above copyright
11 --    notice, this list of conditions and the following disclaimer in the
12 --    documentation and/or other materials provided with the distribution.
13 --
14 -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 -- ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 -- SUCH DAMAGE.
25 --
26 -- $FreeBSD$
27 --
28
29 local config = require("config")
30 local core = require("core")
31
32 local cli = {}
33
34 -- Internal function
35 -- Parses arguments to boot and returns two values: kernel_name, argstr
36 -- Defaults to nil and "" respectively.
37 -- This will also parse arguments to autoboot, but the with_kernel argument
38 -- will need to be explicitly overwritten to false
39 local parse_boot_args = function(argv, with_kernel)
40         if with_kernel == nil then
41                 with_kernel = true
42         end
43         if #argv == 0 then
44                 if with_kernel then
45                         return nil, ""
46                 else
47                         return ""
48                 end
49         end
50         local kernel_name
51         local argstr = ""
52
53         for k, v in ipairs(argv) do
54                 if with_kernel and v:sub(1,1) ~= "-" then
55                         kernel_name = v
56                 else
57                         argstr = argstr .. " " .. v
58                 end
59         end
60         if with_kernel then
61                 return kernel_name, argstr
62         else
63                 return argstr
64         end
65 end
66
67 -- Declares a global function cli_execute that attempts to dispatch the
68 -- arguments passed as a lua function. This gives lua a chance to intercept
69 -- builtin CLI commands like "boot"
70 function cli_execute(...)
71         local argv = {...}
72         -- Just in case...
73         if #argv == 0 then
74                 loader.command(...)
75                 return
76         end
77
78         local cmd_name = argv[1]
79         local cmd = cli[cmd_name]
80         if cmd ~= nil and type(cmd) == "function" then
81                 -- Pass argv wholesale into cmd. We could omit argv[0] since the
82                 -- traditional reasons for including it don't necessarily apply,
83                 -- it may not be totally redundant if we want to have one global
84                 -- handling multiple commands
85                 cmd(...)
86         else
87                 loader.command(...)
88         end
89
90 end
91
92 -- Module exports
93
94 function cli.boot(...)
95         local cmd_name, argv = cli.arguments(...)
96         local kernel, argstr = parse_boot_args(argv)
97         if kernel ~= nil then
98                 loader.perform("unload")
99                 config.selectkernel(kernel)
100         end
101         core.boot(argstr)
102 end
103
104 function cli.autoboot(...)
105         local cmd_name, argv = cli.arguments(...)
106         local argstr = parse_boot_args(argv, false)
107         core.autoboot(argstr)
108 end
109
110 -- Used for splitting cli varargs into cmd_name and the rest of argv
111 function cli.arguments(...)
112         local argv = {...}
113         local cmd_name = ""
114         cmd_name, argv = core.popFrontTable(argv)
115         return cmd_name, argv
116 end
117
118 return cli