blob: 8d3442230aa0c4eb1dbe1b766881ea0662e89f32 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "vpn-manager/daemon.h"
#include <signal.h>
#include <string>
#include "base/file_path.h"
#include "base/file_util.h"
#include "chromeos/process.h"
using ::chromeos::Process;
using ::chromeos::ProcessImpl;
namespace vpn_manager {
// static
const int Daemon::kTerminationTimeoutSeconds = 2;
Daemon::Daemon(const std::string &pid_file) : pid_file_(pid_file) {}
Daemon::~Daemon() {
ClearProcess();
}
void Daemon::ClearProcess() {
SetProcess(NULL);
}
chromeos::Process *Daemon::CreateProcess() {
chromeos::Process *process = new ProcessImpl;
SetProcess(process);
return process;
}
bool Daemon::FindProcess() {
if (!file_util::PathExists(base::FilePath(pid_file_)))
return false;
scoped_ptr<chromeos::Process> process(new ProcessImpl);
process->ResetPidByFile(pid_file_);
if (!Process::ProcessExists(process->pid())) {
process->Release();
return false;
}
SetProcess(process.release());
return true;
}
bool Daemon::IsRunning() {
return
process_.get() &&
process_->pid() != 0 &&
Process::ProcessExists(process_->pid());
}
pid_t Daemon::GetPid() const {
if (!process_.get())
return 0;
return process_->pid();
}
void Daemon::SetProcess(chromeos::Process *process) {
if (process_.get()) {
// If we are re-assigning the same pid, do not terminate the process.
// Otherwise, we should kill the previous process if it is still running.
if (process && process_->pid() == process->pid())
process_->Release();
else if (IsRunning())
process_->Kill(SIGKILL, kTerminationTimeoutSeconds);
}
// Take ownership of the found process.
process_.reset(process);
}
bool Daemon::Terminate() {
bool result =
!IsRunning() ||process_->Kill(SIGTERM, kTerminationTimeoutSeconds);
ClearProcess(); // This will send a SIGKILL if we failed above.
file_util::Delete(base::FilePath(pid_file_), false);
return result;
}
} // namespace vpn_manager