From 1281fcd3cbf8c621f4193344944c4833fa5ef8d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 1 Jul 2015 14:20:06 +0200 Subject: [PATCH] launch_daemon: Improved job overwriting. * Certain things are set on job construction only. * Now checks if the message has the field before updating it. * Might not be final yet (it is confusing that 'requires' will add to the requirements, but 'launch' will replace all arguments). --- src/servers/launch/BaseJob.cpp | 9 +++++- src/servers/launch/BaseJob.h | 5 ++-- src/servers/launch/LaunchDaemon.cpp | 46 ++++++++++++++++++++--------- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/servers/launch/BaseJob.cpp b/src/servers/launch/BaseJob.cpp index 2dbec44a1d..cdf62adf4e 100644 --- a/src/servers/launch/BaseJob.cpp +++ b/src/servers/launch/BaseJob.cpp @@ -37,8 +37,15 @@ BaseJob::Condition() const } +::Condition* +BaseJob::Condition() +{ + return fCondition; +} + + void -BaseJob::SetCondition(const ::Condition* condition) +BaseJob::SetCondition(::Condition* condition) { fCondition = condition; } diff --git a/src/servers/launch/BaseJob.h b/src/servers/launch/BaseJob.h index df08964b29..5fa1afc332 100644 --- a/src/servers/launch/BaseJob.h +++ b/src/servers/launch/BaseJob.h @@ -23,11 +23,12 @@ public: const char* Name() const; const ::Condition* Condition() const; - void SetCondition(const ::Condition* condition); + ::Condition* Condition(); + void SetCondition(::Condition* condition); bool CheckCondition(ConditionContext& context) const; protected: - const ::Condition* fCondition; + ::Condition* fCondition; }; diff --git a/src/servers/launch/LaunchDaemon.cpp b/src/servers/launch/LaunchDaemon.cpp index fb9dd9ff6b..5caef5c05a 100644 --- a/src/servers/launch/LaunchDaemon.cpp +++ b/src/servers/launch/LaunchDaemon.cpp @@ -583,26 +583,39 @@ LaunchDaemon::_AddJob(Target* target, bool service, BMessage& message) name.ToLower(); Job* job = FindJob(name); - if (job == NULL) - job = new Job(name); + if (job == NULL) { + job = new (std::nothrow) Job(name); + if (job == NULL) + return; - job->SetEnabled(!message.GetBool("disabled", !job->IsEnabled())); - job->SetService(service); - job->SetCreateDefaultPort(!message.GetBool("legacy", !service)); - job->SetTarget(target); + job->SetService(service); + job->SetCreateDefaultPort(service); + job->SetTarget(target); + } + + if (message.HasBool("disabled")) + job->SetEnabled(!message.GetBool("disabled", !job->IsEnabled())); + + if (message.HasBool("legacy")) + job->SetCreateDefaultPort(!message.GetBool("legacy", !service)); _SetCondition(job, message); + BMessage portMessage; for (int32 index = 0; message.FindMessage("port", index, &portMessage) == B_OK; index++) { job->AddPort(portMessage); } - const char* argument; - for (int32 index = 0; - message.FindString("launch", index, &argument) == B_OK; index++) { - job->AddArgument(argument); + if (message.HasString("launch")) { + job->Arguments().MakeEmpty(); + + const char* argument; + for (int32 index = 0; message.FindString("launch", index, &argument) + == B_OK; index++) { + job->AddArgument(argument); + } } const char* requirement; @@ -683,16 +696,21 @@ LaunchDaemon::_AddTarget(Target* target) void LaunchDaemon::_SetCondition(BaseJob* job, const BMessage& message) { - Condition* condition = NULL; + Condition* condition = job->Condition(); + bool updated = false; BMessage conditions; - if (message.FindMessage("if", &conditions) == B_OK) + if (message.FindMessage("if", &conditions) == B_OK) { condition = Conditions::FromMessage(conditions); + updated = true; + } - if (message.GetBool("no_safemode")) + if (message.GetBool("no_safemode")) { condition = Conditions::AddNotSafeMode(condition); + updated = true; + } - if (condition != NULL) + if (updated) job->SetCondition(condition); }