summaryrefslogtreecommitdiff
path: root/hscript
diff options
context:
space:
mode:
Diffstat (limited to 'hscript')
-rw-r--r--hscript/meta.cc27
-rw-r--r--hscript/meta.hh12
-rw-r--r--hscript/script_i.hh4
3 files changed, 32 insertions, 11 deletions
diff --git a/hscript/meta.cc b/hscript/meta.cc
index 15734c5..0ad4ea5 100644
--- a/hscript/meta.cc
+++ b/hscript/meta.cc
@@ -623,21 +623,34 @@ Key *SvcEnable::parseFromData(const std::string &data,
const ScriptLocation &pos, int *errors, int *,
const Script *script) {
const static std::string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.-_";
+ std::string::size_type space = data.find_first_of(' ');;
+ std::string svc, runlevel{"default"};
- if(data.find_first_not_of(valid_chars) != std::string::npos) {
+ if(space != std::string::npos) {
+ svc = data.substr(0, space);
+ runlevel = data.substr(space + 1);
+ } else {
+ svc = data;
+ }
+
+ if(svc.find_first_not_of(valid_chars) != std::string::npos) {
if(errors) *errors += 1;
output_error(pos, "svcenable: invalid service name", data);
return nullptr;
}
- return new SvcEnable(script, pos, data);
+ return new SvcEnable(script, pos, svc, runlevel);
+}
+
+bool SvcEnable::validate() const {
+ return true; /* validation occurs during parsing */
}
bool SvcEnable::execute() const {
const std::string target = script->targetDirectory() +
- "/etc/runlevels/default/" + _value;
- const std::string initd = "/etc/init.d/" + _value;
- output_info(pos, "svcenable: enabling service " + _value);
+ "/etc/runlevels/" + _runlevel + "/" + _svc;
+ const std::string initd = "/etc/init.d/" + _svc;
+ output_info(pos, "svcenable: enabling service " + _svc);
if(script->options().test(Simulate)) {
std::cout << "ln -s " << initd << " " << target << std::endl;
@@ -647,12 +660,12 @@ bool SvcEnable::execute() const {
#ifdef HAS_INSTALL_ENV
error_code ec;
if(!fs::exists(script->targetDirectory() + initd, ec)) {
- output_warning(pos, "svcenable: missing service", _value);
+ output_warning(pos, "svcenable: missing service", _svc);
}
fs::create_symlink(initd, target, ec);
if(ec) {
- output_error(pos, "svcenable: could not enable service " + _value,
+ output_error(pos, "svcenable: could not enable service " + _svc,
ec.message());
return false;
}
diff --git a/hscript/meta.hh b/hscript/meta.hh
index 912cabf..8d56abb 100644
--- a/hscript/meta.hh
+++ b/hscript/meta.hh
@@ -118,13 +118,21 @@ public:
bool execute() const override;
};
-class SvcEnable : public StringKey {
+class SvcEnable : public Key {
private:
+ const std::string _svc;
+ const std::string _runlevel;
+
SvcEnable(const Script *_s, const ScriptLocation &_pos,
- const std::string &_svc) : StringKey(_s, _pos, _svc) {}
+ const std::string &_sv, const std::string &_r) : Key(_s, _pos),
+ _svc(_sv), _runlevel(_r) {}
public:
static Key *parseFromData(const std::string &, const ScriptLocation &,
int *, int *, const Script *);
+
+ const std::string service() const { return this->_svc; }
+ const std::string runlevel() const { return this->_runlevel; }
+ bool validate() const override;
bool execute() const override;
};
diff --git a/hscript/script_i.hh b/hscript/script_i.hh
index b223608..abe56ec 100644
--- a/hscript/script_i.hh
+++ b/hscript/script_i.hh
@@ -257,10 +257,10 @@ struct Script::ScriptPrivate {
const ScriptOptions &) {
std::unique_ptr<SvcEnable> svc(dynamic_cast<SvcEnable *>(obj));
for(const auto &s : svcs_enable) {
- if(s->value() == svc->value()) {
+ if(s->service() == svc->service()) {
if(warn) *warn += 1;
output_warning(pos, "svcenable: service already enabled",
- s->value());
+ s->service());
return true;
}
}