From 383ed329bffdec853bdb4c9c03e56ed3b86455da Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Thu, 17 Oct 2019 23:08:43 -0500 Subject: hscript: Implement diskid key (except execution) --- hscript/disk.cc | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'hscript/disk.cc') diff --git a/hscript/disk.cc b/hscript/disk.cc index f0466eb..cbd9517 100644 --- a/hscript/disk.cc +++ b/hscript/disk.cc @@ -16,7 +16,7 @@ #include #include #include /* mount */ -#include /* mkdir */ +#include /* mkdir, stat */ #include /* S_* */ #include /* access */ #include "disk.hh" @@ -24,6 +24,49 @@ using namespace Horizon::Keys; +Key *DiskId::parseFromData(const std::string &data, int lineno, int *errors, + int *warnings) { + std::string block, ident; + std::string::size_type block_end = data.find_first_of(' '); + if(block_end == std::string::npos) { + if(errors) *errors += 1; + output_error("installfile:" + std::to_string(lineno), + "diskid: expected an identification string", + "valid format for diskid is: [block] [id-string]"); + return nullptr; + } + + block = data.substr(0, block_end); + ident = data.substr(block_end + 1); + return new DiskId(lineno, block, ident); +} + +bool DiskId::validate(ScriptOptions options) const { + /* We only validate if running in an Installation Environment. */ + if(!options.test(InstallEnvironment)) return true; + + /* Unlike 'mount', 'diskid' *does* require that the block device exist + * before installation begins. This test is always valid. */ + struct stat blk_stat; + const char *block_c = _block.c_str(); + if(access(block_c, F_OK) != 0 || stat(block_c, &blk_stat) != 0) { + output_error("installfile:" + std::to_string(line), + "diskid: error opening device " + _block, + strerror(errno)); + return false; + } + if(!S_ISBLK(blk_stat.st_mode)) { + output_error("installfile:" + std::to_string(line), + "diskid: " + _block + " is not a valid block device"); + return false; + } + return true; +} + +bool DiskId::execute(ScriptOptions options) const { + return false; +} + Key *Mount::parseFromData(const std::string &data, int lineno, int *errors, int *warnings) { std::string dev, where, opt; -- cgit v1.2.3-70-g09d2