blob: d252939244038a0b3edcf45a3042a54670e2db32 [file] [log] [blame]
// Copyright (c) 2011 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 "login_manager/key_generator.h"
#include <unistd.h>
#include <base/file_util.h>
#include "login_manager/child_job.h"
#include "login_manager/session_manager_service.h"
namespace login_manager {
// static
const char KeyGenerator::kKeygenExecutable[] = "/sbin/keygen";
// static
const char KeyGenerator::kTemporaryKeyFilename[] = "key.pub";
KeyGenerator::KeyGenerator() {}
KeyGenerator::~KeyGenerator() {}
bool KeyGenerator::Start(uid_t uid,
SessionManagerService* manager) {
if (!keygen_job_.get()) {
LOG(INFO) << "Creating keygen job";
std::vector<std::string> keygen_argv;
keygen_argv.push_back(kKeygenExecutable);
keygen_argv.push_back(
file_util::GetHomeDir().AppendASCII(kTemporaryKeyFilename).value());
keygen_job_.reset(new ChildJob(keygen_argv));
}
if (uid != 0)
keygen_job_->SetDesiredUid(uid);
int pid = RunJob(keygen_job_.get());
if (pid < 0)
return false;
g_child_watch_add_full(G_PRIORITY_HIGH_IDLE,
pid,
SessionManagerService::HandleKeygenExit,
manager,
NULL);
manager->AdoptChild(keygen_job_.release(), pid);
return true;
}
int KeyGenerator::RunJob(ChildJobInterface* job) {
int pid = fork();
if (pid == 0) {
job->Run();
exit(1); // Run() is not supposed to return.
}
return pid;
}
void KeyGenerator::InjectMockKeygenJob(MockChildJob* keygen) {
keygen_job_.reset(reinterpret_cast<ChildJobInterface*>(keygen));
}
} // namespace login_manager