Index: head/stand/lua/color.lua =================================================================== --- head/stand/lua/color.lua (revision 329684) +++ head/stand/lua/color.lua (revision 329685) @@ -1,99 +1,99 @@ -- -- Copyright (c) 2015 Pedro Souza -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local core = require("core") local color = {} -- Module exports color.BLACK = 0 color.RED = 1 color.GREEN = 2 color.YELLOW = 3 color.BLUE = 4 color.MAGENTA = 5 color.CYAN = 6 color.WHITE = 7 color.DEFAULT = 0 color.BRIGHT = 1 color.DIM = 2 function color.isEnabled() local c = loader.getenv("loader_color") - if (c ~= nil) then - if (c:lower() == "no") or (c == "0") then + if c ~= nil then + if c:lower() == "no" or c == "0" then return false end end - return (not core.isSerialBoot()) + return not core.isSerialBoot() end -color.disabled = (not color.isEnabled()) +color.disabled = not color.isEnabled() function color.escapef(c) - if (color.disabled) then + if color.disabled then return c end return "\027[3" .. c .. "m" end function color.escapeb(c) - if (color.disabled) then + if color.disabled then return c end return "\027[4" .. c .. "m" end function color.escape(fg, bg, att) - if (color.disabled) then + if color.disabled then return "" end - if (not att) then + if not att then att = "" else att = att .. ";" end return "\027[" .. att .. "3" .. fg .. ";4" .. bg .. "m" end function color.default() - if (color.disabled) then + if color.disabled then return "" end return "\027[0;37;40m" end function color.highlight(str) - if (color.disabled) then + if color.disabled then return str end return "\027[1m" .. str .. "\027[0m" end return color Index: head/stand/lua/config.lua =================================================================== --- head/stand/lua/config.lua (revision 329684) +++ head/stand/lua/config.lua (revision 329685) @@ -1,464 +1,466 @@ -- -- Copyright (c) 2015 Pedro Souza -- Copyright (C) 2018 Kyle Evans -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local config = {} local modules = {} local pattern_table local carousel_choices = {} pattern_table = { [1] = { str = "^%s*(#.*)", process = function(k, v) end }, -- module_load="value" [2] = { str = "^%s*([%w_]+)_load%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) - if (modules[k] == nil) then + if modules[k] == nil then modules[k] = {} end modules[k].load = v:upper() end }, -- module_name="value" [3] = { str = "^%s*([%w_]+)_name%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "name", v) end }, -- module_type="value" [4] = { str = "^%s*([%w_]+)_type%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "type", v) end }, -- module_flags="value" [5] = { str = "^%s*([%w_]+)_flags%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "flags", v) end }, -- module_before="value" [6] = { str = "^%s*([%w_]+)_before%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "before", v) end }, -- module_after="value" [7] = { str = "^%s*([%w_]+)_after%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "after", v) end }, -- module_error="value" [8] = { str = "^%s*([%w_]+)_error%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) config.setKey(k, "error", v) end }, -- exec="command" [9] = { str = "^%s*exec%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) - if (loader.perform(k) ~= 0) then + if loader.perform(k) ~= 0 then print("Failed to exec '" .. k .. "'") end end }, -- env_var="value" [10] = { str = "^%s*([%w%p]+)%s*=%s*\"([%w%s%p]-)\"%s*(.*)", process = function(k, v) - if (config.setenv(k, v) ~= 0) then + if config.setenv(k, v) ~= 0 then print("Failed to set '" .. k .. "' with value: " .. v .. "") end end }, -- env_var=num [11] = { str = "^%s*([%w%p]+)%s*=%s*(%d+)%s*(.*)", process = function(k, v) - if (config.setenv(k, v) ~= 0) then + if config.setenv(k, v) ~= 0 then print("Failed to set '" .. k .. "' with value: " .. v .. "") end end } } -- Module exports -- Which variables we changed config.env_changed = {} -- Values to restore env to (nil to unset) config.env_restore = {} -- The first item in every carousel is always the default item. function config.getCarouselIndex(id) local val = carousel_choices[id] - if (val == nil) then + if val == nil then return 1 end return val end function config.setCarouselIndex(id, idx) carousel_choices[id] = idx end function config.restoreEnv() -- Examine changed environment variables for k, v in pairs(config.env_changed) do local restore_value = config.env_restore[k] - if (restore_value == nil) then + if restore_value == nil then -- This one doesn't need restored for some reason goto continue end local current_value = loader.getenv(k) - if (current_value ~= v) then + if current_value ~= v then -- This was overwritten by some action taken on the menu -- most likely; we'll leave it be. goto continue end restore_value = restore_value.value - if (restore_value ~= nil) then + if restore_value ~= nil then loader.setenv(k, restore_value) else loader.unsetenv(k) end ::continue:: end config.env_changed = {} config.env_restore = {} end function config.setenv(k, v) -- Track the original value for this if we haven't already - if (config.env_restore[k] == nil) then + if config.env_restore[k] == nil then config.env_restore[k] = {value = loader.getenv(k)} end config.env_changed[k] = v return loader.setenv(k, v) end function config.setKey(k, n, v) - if (modules[k] == nil) then + if modules[k] == nil then modules[k] = {} end modules[k][n] = v end function config.lsModules() print("== Listing modules") for k, v in pairs(modules) do print(k, v.load) end print("== List of modules ended") end function config.isValidComment(c) - if (c ~= nil) then + if c ~= nil then local s = c:match("^%s*#.*") - if (s == nil) then + if s == nil then s = c:match("^%s*$") end - if (s == nil) then + if s == nil then return false end end return true end function config.loadmod(mod, silent) local status = true for k, v in pairs(mod) do - if (v.load == "YES") then + if v.load == "YES" then local str = "load " - if (v.flags ~= nil) then + if v.flags ~= nil then str = str .. v.flags .. " " end - if (v.type ~= nil) then + if v.type ~= nil then str = str .. "-t " .. v.type .. " " end - if (v.name ~= nil) then + if v.name ~= nil then str = str .. v.name else str = str .. k end - if (v.before ~= nil) then - if (loader.perform(v.before) ~= 0) then - if (not silent) then + if v.before ~= nil then + if loader.perform(v.before) ~= 0 then + if not silent then print("Failed to execute '" .. v.before .. "' before loading '" .. k .. "'") end status = false end end - if (loader.perform(str) ~= 0) then - if (not silent) then + if loader.perform(str) ~= 0 then + if not silent then print("Failed to execute '" .. str .. "'") end - if (v.error ~= nil) then + if v.error ~= nil then loader.perform(v.error) end status = false end - if (v.after ~= nil) then - if (loader.perform(v.after) ~= 0) then - if (not silent) then + if v.after ~= nil then + if loader.perform(v.after) ~= 0 then + if not silent then print("Failed to execute '" .. v.after .. "' after loading '" .. k .. "'") end status = false end end else -- if not silent then - -- print("Skiping module '". . k .. "'") + -- print("Skipping module '". . k .. "'") -- end end end return status end function config.parse(name, silent) local f = io.open(name) - if (f == nil) then - if (not silent) then + if f == nil then + if not silent then print("Failed to open config: '" .. name .. "'") end return false end local text local r text, r = io.read(f) - if (text == nil) then - if (not silent) then + if text == nil then + if not silent then print("Failed to read config: '" .. name .. "'") end return false end local n = 1 local status = true for line in text:gmatch("([^\n]+)") do - if (line:match("^%s*$") == nil) then + if line:match("^%s*$") == nil then local found = false for i, val in ipairs(pattern_table) do local k, v, c = line:match(val.str) - if (k ~= nil) then + if k ~= nil then found = true - if (config.isValidComment(c)) then + if config.isValidComment(c) then val.process(k, v) else print("Malformed line (" .. n .. "):\n\t'" .. line .. "'") status = false end break end end - if (found == false) then + if found == false then print("Malformed line (" .. n .. "):\n\t'" .. line .. "'") status = false end end n = n + 1 end return status end -- other_kernel is optionally the name of a kernel to load, if not the default -- or autoloaded default from the module_path function config.loadkernel(other_kernel) local flags = loader.getenv("kernel_options") or "" local kernel = other_kernel or loader.getenv("kernel") local try_load = function (names) for name in names:gmatch("([^;]+)%s*;?") do r = loader.perform("load " .. flags .. " " .. name) - if (r == 0) then + if r == 0 then return name end end return nil end local load_bootfile = function() local bootfile = loader.getenv("bootfile") -- append default kernel name - if (bootfile == nil) then + if bootfile == nil then bootfile = "kernel" else bootfile = bootfile .. ";kernel" end return try_load(bootfile) end -- kernel not set, try load from default module_path - if (kernel == nil) then + if kernel == nil then local res = load_bootfile() - if (res ~= nil) then + if res ~= nil then -- Default kernel is loaded config.kernel_loaded = nil return true else print("No kernel set, failed to load from module_path") return false end else -- Use our cached module_path, so we don't end up with multiple -- automatically added kernel paths to our final module_path local module_path = config.module_path local res = nil - if (other_kernel ~= nil) then + if other_kernel ~= nil then kernel = other_kernel end -- first try load kernel with module_path = /boot/${kernel} -- then try load with module_path=${kernel} local paths = {"/boot/" .. kernel, kernel} for k,v in pairs(paths) do loader.setenv("module_path", v) res = load_bootfile() -- succeeded, add path to module_path - if (res ~= nil) then + if res ~= nil then config.kernel_loaded = kernel - if (module_path ~= nil) then + if module_path ~= nil then loader.setenv("module_path", v .. ";" .. module_path) end return true end end -- failed to load with ${kernel} as a directory -- try as a file res = try_load(kernel) - if (res ~= nil) then + if res ~= nil then config.kernel_loaded = kernel return true else print("Failed to load kernel '" .. kernel .. "'") return false end end end function config.selectkernel(kernel) config.kernel_selected = kernel end function config.load(file) - if (not file) then + if not file then file = "/boot/defaults/loader.conf" end - if (not config.parse(file)) then + if not config.parse(file) then + -- XXX TODO: Why is this commented out? -- print("Failed to parse configuration: '" .. file .. "'") end local f = loader.getenv("loader_conf_files") - if (f ~= nil) then + if f ~= nil then for name in f:gmatch("([%w%p]+)%s*") do - if (not config.parse(name)) then + if not config.parse(name) then + -- XXX TODO: Ditto the above -- print("Failed to parse configuration: '" .. -- name .. "'") end end end -- Cache the provided module_path at load time for later use config.module_path = loader.getenv("module_path") end -- Reload configuration function config.reload(file) modules = {} config.restoreEnv() config.load(file) end function config.loadelf() local kernel = config.kernel_selected or config.kernel_loaded local loaded = false print("Loading kernel...") loaded = config.loadkernel(kernel) - if (not loaded) then + if not loaded then print("Failed to load any kernel") return end print("Loading configured modules...") - if (not config.loadmod(modules)) then + if not config.loadmod(modules) then print("Could not load one or more modules!") end end return config Index: head/stand/lua/core.lua =================================================================== --- head/stand/lua/core.lua (revision 329684) +++ head/stand/lua/core.lua (revision 329685) @@ -1,325 +1,325 @@ -- -- Copyright (c) 2015 Pedro Souza -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local config = require('config') local core = {} local compose_loader_cmd = function(cmd_name, argstr) - if (argstr ~= nil) then + if argstr ~= nil then cmd_name = cmd_name .. " " .. argstr end return cmd_name end -- Internal function -- Parses arguments to boot and returns two values: kernel_name, argstr -- Defaults to nil and "" respectively. -- This will also parse arguments to autoboot, but the with_kernel argument -- will need to be explicitly overwritten to false local parse_boot_args = function(argv, with_kernel) - if (#argv == 0) then + if #argv == 0 then return nil, "" end - if (with_kernel == nil) then + if with_kernel == nil then with_kernel = true end local kernel_name local argstr = "" for k, v in ipairs(argv) do - if (with_kernel) and (v:sub(1,1) ~= "-") then + if with_kernel and v:sub(1,1) ~= "-" then kernel_name = v else argstr = argstr .. " " .. v end end - if (with_kernel) then + if with_kernel then return kernel_name, argstr else return argstr end end -- Globals function boot(...) local argv = {...} local cmd_name = "" cmd_name, argv = core.popFrontTable(argv) local kernel, argstr = parse_boot_args(argv) - if (kernel ~= nil) then + if kernel ~= nil then loader.perform("unload") config.selectkernel(kernel) end core.boot(argstr) end function autoboot(...) local argv = {...} local cmd_name = "" cmd_name, argv = core.popFrontTable(argv) local argstr = parse_boot_args(argv, false) core.autoboot(argstr) end -- Module exports -- Commonly appearing constants core.KEY_BACKSPACE = 8 core.KEY_ENTER = 13 core.KEY_DELETE = 127 core.KEYSTR_ESCAPE = "\027" core.MENU_RETURN = "return" core.MENU_ENTRY = "entry" core.MENU_SEPARATOR = "separator" core.MENU_SUBMENU = "submenu" core.MENU_CAROUSEL_ENTRY = "carousel_entry" function core.setVerbose(b) - if (b == nil) then + if b == nil then b = not core.verbose end - if (b == true) then + if b == true then loader.setenv("boot_verbose", "YES") else loader.unsetenv("boot_verbose") end core.verbose = b end function core.setSingleUser(b) - if (b == nil) then + if b == nil then b = not core.su end - if (b == true) then + if b == true then loader.setenv("boot_single", "YES") else loader.unsetenv("boot_single") end core.su = b end function core.getACPIPresent(checkingSystemDefaults) local c = loader.getenv("hint.acpi.0.rsdp") - if (c ~= nil) then - if (checkingSystemDefaults == true) then + if c ~= nil then + if checkingSystemDefaults == true then return true end -- Otherwise, respect disabled if it's set c = loader.getenv("hint.acpi.0.disabled") - return (c == nil) or (tonumber(c) ~= 1) + return c == nil or tonumber(c) ~= 1 end return false end function core.setACPI(b) - if (b == nil) then + if b == nil then b = not core.acpi end - if (b == true) then + if b == true then loader.setenv("acpi_load", "YES") loader.setenv("hint.acpi.0.disabled", "0") loader.unsetenv("loader.acpi_disabled_by_user") else loader.unsetenv("acpi_load") loader.setenv("hint.acpi.0.disabled", "1") loader.setenv("loader.acpi_disabled_by_user", "1") end core.acpi = b end function core.setSafeMode(b) - if (b == nil) then + if b == nil then b = not core.sm end - if (b == true) then + if b == true then loader.setenv("kern.smp.disabled", "1") loader.setenv("hw.ata.ata_dma", "0") loader.setenv("hw.ata.atapi_dma", "0") loader.setenv("hw.ata.wc", "0") loader.setenv("hw.eisa_slots", "0") loader.setenv("kern.eventtimer.periodic", "1") loader.setenv("kern.geom.part.check_integrity", "0") else loader.unsetenv("kern.smp.disabled") loader.unsetenv("hw.ata.ata_dma") loader.unsetenv("hw.ata.atapi_dma") loader.unsetenv("hw.ata.wc") loader.unsetenv("hw.eisa_slots") loader.unsetenv("kern.eventtimer.periodic") loader.unsetenv("kern.geom.part.check_integrity") end core.sm = b end function core.kernelList() local k = loader.getenv("kernel") local v = loader.getenv("kernels") or "" local kernels = {} local unique = {} local i = 0 - if (k ~= nil) then + if k ~= nil then i = i + 1 kernels[i] = k unique[k] = true end for n in v:gmatch("([^; ]+)[; ]?") do - if (unique[n] == nil) then + if unique[n] == nil then i = i + 1 kernels[i] = n unique[n] = true end end -- Automatically detect other bootable kernel directories using a -- heuristic. Any directory in /boot that contains an ordinary file -- named "kernel" is considered eligible. for file in lfs.dir("/boot") do local fname = "/boot/" .. file - if (file == "." or file == "..") then + if file == "." or file == ".." then goto continue end - if (lfs.attributes(fname, "mode") ~= "directory") then + if lfs.attributes(fname, "mode") ~= "directory" then goto continue end - if (lfs.attributes(fname .. "/kernel", "mode") ~= "file") then + if lfs.attributes(fname .. "/kernel", "mode") ~= "file" then goto continue end - if (unique[file] == nil) then + if unique[file] == nil then i = i + 1 kernels[i] = file unique[file] = true end ::continue:: end return kernels end function core.setDefaults() core.setACPI(core.getACPIPresent(true)) core.setSafeMode(false) core.setSingleUser(false) core.setVerbose(false) end function core.autoboot(argstr) config.loadelf() loader.perform(compose_loader_cmd("autoboot", argstr)) end function core.boot(argstr) config.loadelf() loader.perform(compose_loader_cmd("boot", argstr)) end function core.isSingleUserBoot() local single_user = loader.getenv("boot_single") return single_user ~= nil and single_user:lower() == "yes" end function core.isSerialBoot() local c = loader.getenv("console") - if (c ~= nil) then - if (c:find("comconsole") ~= nil) then + if c ~= nil then + if c:find("comconsole") ~= nil then return true end end local s = loader.getenv("boot_serial") - if (s ~= nil) then + if s ~= nil then return true end local m = loader.getenv("boot_multicons") - if (m ~= nil) then + if m ~= nil then return true end return false end function core.isSystem386() - return (loader.machine_arch == "i386") + return loader.machine_arch == "i386" end -- This may be a better candidate for a 'utility' module. function core.shallowCopyTable(tbl) local new_tbl = {} for k, v in pairs(tbl) do - if (type(v) == "table") then + if type(v) == "table" then new_tbl[k] = core.shallowCopyTable(v) else new_tbl[k] = v end end return new_tbl end -- XXX This should go away if we get the table lib into shape for importing. -- As of now, it requires some 'os' functions, so we'll implement this in lua -- for our uses function core.popFrontTable(tbl) -- Shouldn't reasonably happen - if (#tbl == 0) then + if #tbl == 0 then return nil, nil - elseif (#tbl == 1) then + elseif #tbl == 1 then return tbl[1], {} end local first_value = tbl[1] local new_tbl = {} -- This is not a cheap operation for k, v in ipairs(tbl) do - if (k > 1) then + if k > 1 then new_tbl[k - 1] = v end end return first_value, new_tbl end -- On i386, hint.acpi.0.rsdp will be set before we're loaded. On !i386, it will -- generally be set upon execution of the kernel. Because of this, we can't (or -- don't really want to) detect/disable ACPI on !i386 reliably. Just set it -- enabled if we detect it and leave well enough alone if we don't. -if (core.isSystem386()) and (core.getACPIPresent(false)) then +if core.isSystem386() and core.getACPIPresent(false) then core.setACPI(true) end return core Index: head/stand/lua/drawer.lua =================================================================== --- head/stand/lua/drawer.lua (revision 329684) +++ head/stand/lua/drawer.lua (revision 329685) @@ -1,382 +1,382 @@ -- -- Copyright (c) 2015 Pedro Souza -- Copyright (c) 2018 Kyle Evans -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local color = require("color") local config = require("config") local core = require("core") local screen = require("screen") local drawer = {} local fbsd_logo local beastie_color local beastie local fbsd_logo_v local orb local none local none_shifted = false local menu_entry_name = function(drawing_menu, entry) local name_handler = drawer.menu_name_handlers[entry.entry_type] - if (name_handler ~= nil) then + if name_handler ~= nil then return name_handler(drawing_menu, entry) end return entry.name() end local shift_brand_text = function(shift) drawer.brand_position.x = drawer.brand_position.x + shift.x drawer.brand_position.y = drawer.brand_position.y + shift.y drawer.menu_position.x = drawer.menu_position.x + shift.x drawer.menu_position.y = drawer.menu_position.y + shift.y drawer.box_pos_dim.x = drawer.box_pos_dim.x + shift.x drawer.box_pos_dim.y = drawer.box_pos_dim.y + shift.y end fbsd_logo = { " ______ ____ _____ _____ ", " | ____| | _ \\ / ____| __ \\ ", " | |___ _ __ ___ ___ | |_) | (___ | | | |", " | ___| '__/ _ \\/ _ \\| _ < \\___ \\| | | |", " | | | | | __/ __/| |_) |____) | |__| |", " | | | | | | || | | |", " |_| |_| \\___|\\___||____/|_____/|_____/ " } beastie_color = { " \027[31m, ,", " /( )`", " \\ \\___ / |", " /- \027[37m_\027[31m `-/ '", " (\027[37m/\\/ \\\027[31m \\ /\\", " \027[37m/ / |\027[31m ` \\", " \027[34mO O \027[37m) \027[31m/ |", " \027[37m`-^--'\027[31m`< '", " (_.) _ ) /", " `.___/` /", " `-----' /", " \027[33m<----.\027[31m __ / __ \\", " \027[33m<----|====\027[31mO)))\027[33m==\027[31m) \\) /\027[33m====|", " \027[33m<----'\027[31m `--' `.__,' \\", " | |", " \\ / /\\", " \027[36m______\027[31m( (_ / \\______/", " \027[36m,' ,-----' |", " `--{__________)\027[37m" } beastie = { " , ,", " /( )`", " \\ \\___ / |", " /- _ `-/ '", " (/\\/ \\ \\ /\\", " / / | ` \\", " O O ) / |", " `-^--'`< '", " (_.) _ ) /", " `.___/` /", " `-----' /", " <----. __ / __ \\", " <----|====O)))==) \\) /====|", " <----' `--' `.__,' \\", " | |", " \\ / /\\", " ______( (_ / \\______/", " ,' ,-----' |", " `--{__________)" } fbsd_logo_v = { " ______", " | ____| __ ___ ___ ", " | |__ | '__/ _ \\/ _ \\", " | __|| | | __/ __/", " | | | | | | |", " |_| |_| \\___|\\___|", " ____ _____ _____", " | _ \\ / ____| __ \\", " | |_) | (___ | | | |", " | _ < \\___ \\| | | |", " | |_) |____) | |__| |", " | | | |", " |____/|_____/|_____/" } orb_color = { " \027[31m``` \027[31;1m`\027[31m", " s` `.....---...\027[31;1m....--.``` -/\027[31m", " +o .--` \027[31;1m/y:` +.\027[31m", " yo`:. \027[31;1m:o `+-\027[31m", " y/ \027[31;1m-/` -o/\027[31m", " .- \027[31;1m::/sy+:.\027[31m", " / \027[31;1m`-- /\027[31m", " `: \027[31;1m:`\027[31m", " `: \027[31;1m:`\027[31m", " / \027[31;1m/\027[31m", " .- \027[31;1m-.\027[31m", " -- \027[31;1m-.\027[31m", " `:` \027[31;1m`:`", " \027[31;1m.-- `--.", " .---.....----.\027[37m" } orb = { " ``` `", " s` `.....---.......--.``` -/", " +o .--` /y:` +.", " yo`:. :o `+-", " y/ -/` -o/", " .- ::/sy+:.", " / `-- /", " `: :`", " `: :`", " / /", " .- -.", " -- -.", " `:` `:`", " .-- `--.", " .---.....----." } none = {""} -- Module exports drawer.menu_name_handlers = { -- Menu name handlers should take the menu being drawn and entry being -- drawn as parameters, and return the name of the item. -- This is designed so that everything, including menu separators, may -- have their names derived differently. The default action for entry -- types not specified here is to call and use entry.name(). [core.MENU_CAROUSEL_ENTRY] = function(drawing_menu, entry) local carid = entry.carousel_id local caridx = config.getCarouselIndex(carid) local choices = entry.items() - if (#choices < caridx) then + if #choices < caridx then caridx = 1 end return entry.name(caridx, choices[caridx], choices) end, } drawer.brand_position = {x = 2, y = 1} drawer.logo_position = {x = 46, y = 1} drawer.menu_position = {x = 6, y = 11} drawer.box_pos_dim = {x = 3, y = 10, w = 41, h = 11} drawer.branddefs = { -- Indexed by valid values for loader_brand in loader.conf(5). Valid -- keys are: graphic (table depicting graphic) ["fbsd"] = { graphic = fbsd_logo, }, ["none"] = { graphic = none, }, } drawer.logodefs = { -- Indexed by valid values for loader_logo in loader.conf(5). Valid keys -- are: requires_color (boolean), graphic (table depicting graphic), and -- shift (table containing x and y). ["beastie"] = { requires_color = true, graphic = beastie_color, }, ["beastiebw"] = { graphic = beastie, }, ["fbsdbw"] = { graphic = fbsd_logo_v, shift = {x = 5, y = 4}, }, ["orb"] = { requires_color = true, graphic = orb_color, shift = {x = 2, y = 4}, }, ["orbbw"] = { graphic = orb, shift = {x = 2, y = 4}, }, ["tribute"] = { graphic = fbsd_logo, }, ["tributebw"] = { graphic = fbsd_logo, }, ["none"] = { graphic = none, shift = {x = 17, y = 0}, }, } function drawer.drawscreen(menu_opts) -- drawlogo() must go first. -- it determines the positions of other elements drawer.drawlogo() drawer.drawbrand() drawer.drawbox() return drawer.drawmenu(menu_opts) end function drawer.drawmenu(m) x = drawer.menu_position.x y = drawer.menu_position.y -- print the menu and build the alias table local alias_table = {} local entry_num = 0 local menu_entries = m.entries - if (type(menu_entries) == "function") then + if type(menu_entries) == "function" then menu_entries = menu_entries() end for line_num, e in ipairs(menu_entries) do -- Allow menu items to be conditionally visible by specifying -- a visible function. - if (e.visible ~= nil) and (not e.visible()) then + if e.visible ~= nil and not e.visible() then goto continue end - if (e.entry_type ~= core.MENU_SEPARATOR) then + if e.entry_type ~= core.MENU_SEPARATOR then entry_num = entry_num + 1 screen.setcursor(x, y + line_num) print(entry_num .. ". " .. menu_entry_name(m, e)) -- fill the alias table alias_table[tostring(entry_num)] = e - if (e.alias ~= nil) then + if e.alias ~= nil then for n, a in ipairs(e.alias) do alias_table[a] = e end end else screen.setcursor(x, y + line_num) print(menu_entry_name(m, e)) end ::continue:: end return alias_table end function drawer.drawbox() x = drawer.box_pos_dim.x y = drawer.box_pos_dim.y w = drawer.box_pos_dim.w h = drawer.box_pos_dim.h local hl = string.char(0xCD) local vl = string.char(0xBA) local tl = string.char(0xC9) local bl = string.char(0xC8) local tr = string.char(0xBB) local br = string.char(0xBC) screen.setcursor(x, y); print(tl) screen.setcursor(x, y+h); print(bl) screen.setcursor(x+w, y); print(tr) screen.setcursor(x+w, y+h); print(br) for i = 1, w-1 do screen.setcursor(x+i, y) print(hl) screen.setcursor(x+i, y+h) print(hl) end for i = 1, h-1 do screen.setcursor(x, y+i) print(vl) screen.setcursor(x+w, y+i) print(vl) end screen.setcursor(x+(w/2)-9, y) print("Welcome to FreeBSD") end function drawer.draw(x, y, logo) for i = 1, #logo do screen.setcursor(x, y + i) print(logo[i]) end end function drawer.drawbrand() local x = tonumber(loader.getenv("loader_brand_x")) or drawer.brand_position.x local y = tonumber(loader.getenv("loader_brand_y")) or drawer.brand_position.y local graphic = drawer.branddefs[loader.getenv("loader_brand")] - if (graphic == nil) then + if graphic == nil then graphic = fbsd_logo end drawer.draw(x, y, graphic) end function drawer.drawlogo() local x = tonumber(loader.getenv("loader_logo_x")) or drawer.logo_position.x local y = tonumber(loader.getenv("loader_logo_y")) or drawer.logo_position.y local logo = loader.getenv("loader_logo") local colored = color.isEnabled() -- Lookup local logodef = drawer.logodefs[logo] - if (logodef ~= nil) and (logodef.graphic == none) then + if logodef ~= nil and logodef.graphic == none then -- centre brand and text if no logo - if (not none_shifted) then + if not none_shifted then shift_brand_text(logodef.shift) none_shifted = true end - elseif (logodef == nil) or (logodef.graphic == nil) or - ((not colored) and logodef.requires_color) then + elseif logodef == nil or logodef.graphic == nil or + (not colored and logodef.requires_color) then -- Choose a sensible default - if (colored) then + if colored then logodef = drawer.logodefs["orb"] else logodef = drawer.logodefs["orbbw"] end end - if (logodef.shift ~= nil) then + if logodef.shift ~= nil then x = x + logodef.shift.x y = y + logodef.shift.y end drawer.draw(x, y, logodef.graphic) end return drawer Index: head/stand/lua/loader.lua =================================================================== --- head/stand/lua/loader.lua (revision 329684) +++ head/stand/lua/loader.lua (revision 329685) @@ -1,61 +1,61 @@ -- -- Copyright (c) 2015 Pedro Souza -- Copyright (c) 2018 Kyle Evans -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local config = require("config") local menu = require("menu") local password = require("password") -- Declares a global function cli_execute that attempts to dispatch the -- arguments passed as a lua function. This gives lua a chance to intercept -- builtin CLI commands like "boot" function cli_execute(...) local argv = {...} -- Just in case... - if (#argv == 0) then + if #argv == 0 then loader.command(...) return end local cmd_name = argv[1] local cmd = _G[cmd_name] - if (cmd ~= nil) and (type(cmd) == "function") then + if cmd ~= nil and type(cmd) == "function" then -- Pass argv wholesale into cmd. We could omit argv[0] since the -- traditional reasons for including it don't necessarily apply, -- it may not be totally redundant if we want to have one global -- handling multiple commands cmd(...) else loader.command(...) end end config.load() password.check() menu.run() Index: head/stand/lua/menu.lua =================================================================== --- head/stand/lua/menu.lua (revision 329684) +++ head/stand/lua/menu.lua (revision 329685) @@ -1,460 +1,460 @@ -- -- Copyright (c) 2015 Pedro Souza -- Copyright (C) 2018 Kyle Evans -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local core = require("core") local color = require("color") local config = require("config") local screen = require("screen") local drawer = require("drawer") local menu = {} local skip local run local autoboot local OnOff = function(str, b) - if (b) then + if b then return str .. color.escapef(color.GREEN) .. "On" .. color.escapef(color.WHITE) else return str .. color.escapef(color.RED) .. "off" .. color.escapef(color.WHITE) end end -- Module exports menu.handlers = { -- Menu handlers take the current menu and selected entry as parameters, -- and should return a boolean indicating whether execution should -- continue or not. The return value may be omitted if this entry should -- have no bearing on whether we continue or not, indicating that we -- should just continue after execution. [core.MENU_ENTRY] = function(current_menu, entry) -- run function entry.func() end, [core.MENU_CAROUSEL_ENTRY] = function(current_menu, entry) -- carousel (rotating) functionality local carid = entry.carousel_id local caridx = config.getCarouselIndex(carid) local choices = entry.items() - if (#choices > 0) then + if #choices > 0 then caridx = (caridx % #choices) + 1 config.setCarouselIndex(carid, caridx) entry.func(caridx, choices[caridx], choices) end end, [core.MENU_SUBMENU] = function(current_menu, entry) -- recurse return menu.run(entry.submenu()) end, [core.MENU_RETURN] = function(current_menu, entry) -- allow entry to have a function/side effect - if (entry.func ~= nil) then + if entry.func ~= nil then entry.func() end return false end, } -- loader menu tree is rooted at menu.welcome menu.boot_options = { entries = { -- return to welcome menu { entry_type = core.MENU_RETURN, name = function() return "Back to main menu" .. color.highlight(" [Backspace]") end }, -- load defaults { entry_type = core.MENU_ENTRY, name = function() return "Load System " .. color.highlight("D") .. "efaults" end, func = function() core.setDefaults() end, alias = {"d", "D"} }, { entry_type = core.MENU_SEPARATOR, name = function() return "" end }, { entry_type = core.MENU_SEPARATOR, name = function() return "Boot Options:" end }, -- acpi { entry_type = core.MENU_ENTRY, visible = core.isSystem386, name = function() return OnOff(color.highlight("A") .. "CPI :", core.acpi) end, func = function() core.setACPI() end, alias = {"a", "A"} }, -- safe mode { entry_type = core.MENU_ENTRY, name = function() return OnOff("Safe " .. color.highlight("M") .. "ode :", core.sm) end, func = function() core.setSafeMode() end, alias = {"m", "M"} }, -- single user { entry_type = core.MENU_ENTRY, name = function() return OnOff(color.highlight("S") .. "ingle user:", core.su) end, func = function() core.setSingleUser() end, alias = {"s", "S"} }, -- verbose boot { entry_type = core.MENU_ENTRY, name = function() return OnOff(color.highlight("V") .. "erbose :", core.verbose) end, func = function() core.setVerbose() end, alias = {"v", "V"} }, }, } menu.welcome = { entries = function() local menu_entries = menu.welcome.all_entries -- Swap the first two menu items on single user boot - if (core.isSingleUserBoot()) then + if core.isSingleUserBoot() then -- We'll cache the swapped menu, for performance - if (menu.welcome.swapped_menu ~= nil) then + if menu.welcome.swapped_menu ~= nil then return menu.welcome.swapped_menu end -- Shallow copy the table menu_entries = core.shallowCopyTable(menu_entries) -- Swap the first two menu entries menu_entries[1], menu_entries[2] = menu_entries[2], menu_entries[1] -- Then set their names to their alternate names menu_entries[1].name, menu_entries[2].name = menu_entries[1].alternate_name, menu_entries[2].alternate_name menu.welcome.swapped_menu = menu_entries end return menu_entries end, all_entries = { -- boot multi user { entry_type = core.MENU_ENTRY, name = function() return color.highlight("B") .. "oot Multi user " .. color.highlight("[Enter]") end, -- Not a standard menu entry function! alternate_name = function() return color.highlight("B") .. "oot Multi user" end, func = function() core.setSingleUser(false) core.boot() end, alias = {"b", "B"} }, -- boot single user { entry_type = core.MENU_ENTRY, name = function() return "Boot " .. color.highlight("S") .. "ingle user" end, -- Not a standard menu entry function! alternate_name = function() return "Boot " .. color.highlight("S") .. "ingle user " .. color.highlight("[Enter]") end, func = function() core.setSingleUser(true) core.boot() end, alias = {"s", "S"} }, -- escape to interpreter { entry_type = core.MENU_RETURN, name = function() return color.highlight("Esc") .. "ape to loader prompt" end, func = function() loader.setenv("autoboot_delay", "NO") end, alias = {core.KEYSTR_ESCAPE} }, -- reboot { entry_type = core.MENU_ENTRY, name = function() return color.highlight("R") .. "eboot" end, func = function() loader.perform("reboot") end, alias = {"r", "R"} }, { entry_type = core.MENU_SEPARATOR, name = function() return "" end }, { entry_type = core.MENU_SEPARATOR, name = function() return "Options:" end }, -- kernel options { entry_type = core.MENU_CAROUSEL_ENTRY, carousel_id = "kernel", items = core.kernelList, name = function(idx, choice, all_choices) - if (#all_choices == 0) then + if #all_choices == 0 then return "Kernel: " end local is_default = (idx == 1) local kernel_name = "" local name_color - if (is_default) then + if is_default then name_color = color.escapef(color.GREEN) kernel_name = "default/" else name_color = color.escapef(color.BLUE) end kernel_name = kernel_name .. name_color .. choice .. color.default() return color.highlight("K") .. "ernel: " .. kernel_name .. " (" .. idx .. " of " .. #all_choices .. ")" end, func = function(idx, choice, all_choices) config.selectkernel(choice) end, alias = {"k", "K"} }, -- boot options { entry_type = core.MENU_SUBMENU, name = function() return "Boot " .. color.highlight("O") .. "ptions" end, submenu = function() return menu.boot_options end, alias = {"o", "O"} }, }, } function menu.run(m) - if (menu.skip()) then + if menu.skip() then core.autoboot() return false end - if (m == nil) then + if m == nil then m = menu.welcome end -- redraw screen screen.clear() screen.defcursor() local alias_table = drawer.drawscreen(m) menu.autoboot() cont = true - while (cont) do + while cont do local key = io.getchar() -- Special key behaviors - if ((key == core.KEY_BACKSPACE) or (key == core.KEY_DELETE)) and - (m ~= menu.welcome) then + if (key == core.KEY_BACKSPACE or key == core.KEY_DELETE) and + m ~= menu.welcome then break - elseif (key == core.KEY_ENTER) then + elseif key == core.KEY_ENTER then core.boot() -- Should not return end key = string.char(key) -- check to see if key is an alias local sel_entry = nil for k, v in pairs(alias_table) do - if (key == k) then + if key == k then sel_entry = v end end -- if we have an alias do the assigned action: - if (sel_entry ~= nil) then + if sel_entry ~= nil then -- Get menu handler local handler = menu.handlers[sel_entry.entry_type] - if (handler ~= nil) then + if handler ~= nil then -- The handler's return value indicates whether -- we need to exit this menu. An omitted return -- value means "continue" by default. cont = handler(m, sel_entry) - if (cont == nil) then + if cont == nil then cont = true end end -- if we got an alias key the screen is out of date: screen.clear() screen.defcursor() alias_table = drawer.drawscreen(m) end end - if (m == menu.welcome) then + if m == menu.welcome then screen.defcursor() print("Exiting menu!") return false end return true end function menu.skip() - if (core.isSerialBoot()) then + if core.isSerialBoot() then return true end local c = string.lower(loader.getenv("console") or "") - if ((c:match("^efi[ ;]") or c:match("[ ;]efi[ ;]")) ~= nil) then + if c:match("^efi[ ;]") ~= nil or c:match("[ ;]efi[ ;]") ~= nil then return true end c = string.lower(loader.getenv("beastie_disable") or "") print("beastie_disable", c) return c == "yes" end function menu.autoboot() - if (menu.already_autoboot == true) then + if menu.already_autoboot == true then return end menu.already_autoboot = true local ab = loader.getenv("autoboot_delay") - if (ab ~= nil) and (ab:lower() == "no") then + if ab ~= nil and ab:lower() == "no" then return - elseif (tonumber(ab) == -1) then + elseif tonumber(ab) == -1 then core.boot() end ab = tonumber(ab) or 10 local x = loader.getenv("loader_menu_timeout_x") or 5 local y = loader.getenv("loader_menu_timeout_y") or 22 local endtime = loader.time() + ab local time repeat time = endtime - loader.time() screen.setcursor(x, y) print("Autoboot in " .. time .. " seconds, hit [Enter] to boot" .. " or any other key to stop ") screen.defcursor() - if (io.ischar()) then + if io.ischar() then local ch = io.getchar() - if (ch == core.KEY_ENTER) then + if ch == core.KEY_ENTER then break else -- erase autoboot msg screen.setcursor(0, y) print(" " .. " ") screen.defcursor() return end end loader.delay(50000) until time <= 0 core.boot() end return menu Index: head/stand/lua/password.lua =================================================================== --- head/stand/lua/password.lua (revision 329684) +++ head/stand/lua/password.lua (revision 329685) @@ -1,102 +1,102 @@ -- -- Copyright (c) 2015 Pedro Souza -- Copyright (C) 2018 Kyle Evans -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local core = require("core") local screen = require("screen") local password = {} -- Module exports function password.read() local str = "" local n = 0 repeat ch = io.getchar() - if (ch == core.KEY_ENTER) then + if ch == core.KEY_ENTER then break end -- XXX TODO: Evaluate if we really want this or not, as a -- security consideration of sorts - if (ch == core.KEY_BACKSPACE) or (ch == core.KEY_DELETE) then - if (n > 0) then + if ch == core.KEY_BACKSPACE or ch == core.KEY_DELETE then + if n > 0 then n = n - 1 -- loader.printc("\008 \008") str = str:sub(1, n) end else -- loader.printc("*") str = str .. string.char(ch) n = n + 1 end - until (n == 16) + until n == 16 return str end function password.check() screen.clear() screen.defcursor() -- pwd is optionally supplied if we want to check it local function do_prompt(prompt, pwd) - while (true) do + while true do loader.printc(prompt) local read_pwd = password.read() - if (not pwd) or (pwd == read_pwd) then + if pwd == nil or pwd == read_pwd then -- Throw an extra newline after password prompt print("") return read_pwd end print("\n\nloader: incorrect password!\n") loader.delay(3*1000*1000) end end local function compare(prompt, pwd) - if (pwd == nil) then + if pwd == nil then return end do_prompt(prompt, pwd) end local boot_pwd = loader.getenv("bootlock_password") compare("Boot password: ", boot_pwd) local geli_prompt = loader.getenv("geom_eli_passphrase_prompt") - if (geli_prompt ~= nil) and (geli_prompt:lower() == "yes") then + if geli_prompt ~= nil and geli_prompt:lower() == "yes" then local passphrase = do_prompt("GELI Passphrase: ") loader.setenv("kern.geom.eli.passphrase", passphrase) end local pwd = loader.getenv("password") - if (pwd ~= nil) then + if pwd ~= nil then core.autoboot() end compare("Password: ", pwd) end return password Index: head/stand/lua/screen.lua =================================================================== --- head/stand/lua/screen.lua (revision 329684) +++ head/stand/lua/screen.lua (revision 329685) @@ -1,86 +1,86 @@ -- -- Copyright (c) 2015 Pedro Souza -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions -- are met: -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- SUCH DAMAGE. -- -- $FreeBSD$ -- local color = require("color") local core = require("core") local screen = {} -- XXX TODO: This should be fixed in the interpreter to not print decimals local intstring = function(num) local str = tostring(num) local decimal = str:find("%.") - if (decimal) then + if decimal then return str:sub(1, decimal - 1) end return str end -- Module exports function screen.clear() - if (core.isSerialBoot()) then + if core.isSerialBoot() then return end loader.printc("\027[H\027[J") end function screen.setcursor(x, y) - if (core.isSerialBoot()) then + if core.isSerialBoot() then return end loader.printc("\027[" .. intstring(y) .. ";" .. intstring(x) .. "H") end function screen.setforeground(c) - if (color.disabled) then + if color.disabled then return c end loader.printc("\027[3" .. c .. "m") end function screen.setbackground(c) - if (color.disabled) then + if color.disabled then return c end loader.printc("\027[4" .. c .. "m") end function screen.defcolor() loader.printc(color.default()) end function screen.defcursor() - if (core.isSerialBoot()) then + if core.isSerialBoot() then return end loader.printc("\027[25;0H") end return screen