blob: a08d0ef4cedfc6a8a96e6e1f34f3db895abc5122 [file] [log] [blame]
// Copyright (c) 2012 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 <sys/mount.h>
#include <sys/stat.h>
#include <unistd.h>
#include <base/command_line.h>
#include <base/logging.h>
#include <chromeos/libminijail.h>
#include <chromeos/process.h>
#include <chromeos/syslog_logging.h>
#include "debug_daemon.h"
namespace {
const char* kHelpers[] = {
NULL,
};
// @brief Enter a VFS namespace.
//
// We don't want anyone other than our descendants to see our tmpfs.
void enter_vfs_namespace() {
struct minijail* j = minijail_new();
minijail_namespace_vfs(j);
minijail_enter(j);
minijail_destroy(j);
}
// @brief Sets up a tmpfs visible to this program and its descendants.
//
// The created tmpfs is mounted at /debugd.
void make_tmpfs() {
int r = mount("none", "/debugd", "tmpfs", MS_NODEV | MS_NOSUID | MS_NOEXEC,
NULL);
if (r < 0)
PLOG(FATAL) << "mount() failed";
}
// @brief Sets up directories needed by helper programs.
//
void setup_dirs() {
int r = mkdir("/debugd/touchpad", S_IRWXU);
if (r < 0)
PLOG(FATAL) << "mkdir(\"/debugd/touchpad\") failed";
}
// @brief Launch all our helper programs.
void launch_helpers() {
for (int i = 0; kHelpers[i]; ++i) {
chromeos::ProcessImpl p;
p.AddArg(kHelpers[i]);
p.Start();
p.Release();
}
}
// @brief Start the debugd DBus interface.
void start() {
DBus::BusDispatcher dispatcher;
DBus::default_dispatcher = &dispatcher;
DBus::Connection conn = DBus::Connection::SystemBus();
debugd::DebugDaemon debugd(&conn, &dispatcher);
if (!debugd.Init())
LOG(FATAL) << "debugd.Init() failed";
debugd.Run();
LOG(FATAL) << "debugd.Run() returned";
}
}; // namespace
int __attribute__((visibility("default"))) main(int argc, char* argv[]) {
CommandLine::Init(argc, argv);
chromeos::InitLog(chromeos::kLogToSyslog | chromeos::kLogToStderr);
enter_vfs_namespace();
make_tmpfs();
setup_dirs();
launch_helpers();
start();
return 0;
}