blob: 6939ee05afe98016e20561af265767a39893774f [file] [log] [blame]
Elly Jonesa44d22d2012-01-05 18:05:56 -05001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Elly Jones9aa5eca2011-11-04 14:48:13 -04002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Elly Jones9aa5eca2011-11-04 14:48:13 -04005#include <sys/mount.h>
Elly Jonesd31aee22012-07-02 11:09:10 -04006#include <sys/stat.h>
Elly Jones9aa5eca2011-11-04 14:48:13 -04007#include <unistd.h>
8
Elly Jonese7cb5b32011-12-01 14:18:32 -05009#include <base/command_line.h>
10#include <base/logging.h>
Elly Jones9aa5eca2011-11-04 14:48:13 -040011#include <chromeos/libminijail.h>
Elly Jonese7cb5b32011-12-01 14:18:32 -050012#include <chromeos/process.h>
13#include <chromeos/syslog_logging.h>
Elly Jones9aa5eca2011-11-04 14:48:13 -040014
Elly Jonese7cb5b32011-12-01 14:18:32 -050015#include "debug_daemon.h"
Elly Jones9aa5eca2011-11-04 14:48:13 -040016
Elly Jonese7cb5b32011-12-01 14:18:32 -050017namespace {
18const char* kHelpers[] = {
Elly Jones9aa5eca2011-11-04 14:48:13 -040019 NULL,
20};
21
Elly Jonese7cb5b32011-12-01 14:18:32 -050022// @brief Enter a VFS namespace.
23//
24// We don't want anyone other than our descendants to see our tmpfs.
25void enter_vfs_namespace() {
26 struct minijail* j = minijail_new();
27 minijail_namespace_vfs(j);
28 minijail_enter(j);
29 minijail_destroy(j);
Elly Jones9aa5eca2011-11-04 14:48:13 -040030}
31
32// @brief Enter a minijail.
33//
Elly Jonese7cb5b32011-12-01 14:18:32 -050034// We are already in a vfs namespace so that our tmpfs is only visible to us and
Elly Jones9aa5eca2011-11-04 14:48:13 -040035// our descendants, and we don't want to be root. Note that minijail_enter()
36// exits the process if it can't succeed.
37void enter_sandbox() {
Elly Jonese7cb5b32011-12-01 14:18:32 -050038 static const char* kDebugdUser = "debugd";
39 static const char* kDebugdGroup = "debugd";
40 struct minijail* j = minijail_new();
Elly Jones9aa5eca2011-11-04 14:48:13 -040041 minijail_change_user(j, kDebugdUser);
42 minijail_change_group(j, kDebugdGroup);
43 minijail_enter(j);
44 minijail_destroy(j);
45}
46
47// @brief Sets up a tmpfs visible to this program and its descendants.
48//
49// The created tmpfs is mounted at /debugd.
50void make_tmpfs() {
51 int r = mount("none", "/debugd", "tmpfs", MS_NODEV | MS_NOSUID | MS_NOEXEC,
52 NULL);
53 if (r < 0)
Elly Jonese7cb5b32011-12-01 14:18:32 -050054 PLOG(FATAL) << "mount() failed";
Elly Jones9aa5eca2011-11-04 14:48:13 -040055}
56
Elly Jonesd31aee22012-07-02 11:09:10 -040057// @brief Sets up directories needed by helper programs.
58//
59void setup_dirs() {
60 int r = mkdir("/debugd/touchpad", S_IRWXU);
61 if (r < 0)
62 PLOG(FATAL) << "mkdir(\"/debugd/touchpad\") failed";
63}
64
Elly Jones9aa5eca2011-11-04 14:48:13 -040065// @brief Launch all our helper programs.
66void launch_helpers() {
Elly Jonese7cb5b32011-12-01 14:18:32 -050067 for (int i = 0; kHelpers[i]; ++i) {
68 chromeos::ProcessImpl p;
69 p.AddArg(kHelpers[i]);
70 p.Start();
71 p.Release();
Elly Jones9aa5eca2011-11-04 14:48:13 -040072 }
73}
74
Elly Jonese7cb5b32011-12-01 14:18:32 -050075// @brief Start the debugd DBus interface.
76void start() {
77 DBus::BusDispatcher dispatcher;
78 DBus::default_dispatcher = &dispatcher;
79 DBus::Connection conn = DBus::Connection::SystemBus();
80 debugd::DebugDaemon debugd(&conn, &dispatcher);
81 if (!debugd.Init())
82 LOG(FATAL) << "debugd.Init() failed";
83 debugd.Run();
84 LOG(FATAL) << "debugd.Run() returned";
Elly Jones9aa5eca2011-11-04 14:48:13 -040085}
Elly Jonese7cb5b32011-12-01 14:18:32 -050086}; // namespace
Elly Jones9aa5eca2011-11-04 14:48:13 -040087
Elly Jonese7cb5b32011-12-01 14:18:32 -050088int __attribute__((visibility("default"))) main(int argc, char* argv[]) {
89 CommandLine::Init(argc, argv);
90 chromeos::InitLog(chromeos::kLogToSyslog | chromeos::kLogToStderr);
91 enter_vfs_namespace();
Elly Jones9aa5eca2011-11-04 14:48:13 -040092 make_tmpfs();
Elly Jonese7cb5b32011-12-01 14:18:32 -050093 enter_sandbox();
Elly Jonesd31aee22012-07-02 11:09:10 -040094 setup_dirs();
Elly Jones9aa5eca2011-11-04 14:48:13 -040095 launch_helpers();
Elly Jonese7cb5b32011-12-01 14:18:32 -050096 start();
Elly Jones9aa5eca2011-11-04 14:48:13 -040097 return 0;
98}