| Index: main.cc | 
| diff --git a/main.cc b/main.cc | 
| index a38faa0cab143d82c2fe95145c085465e5042184..56bb11fc8e7fda5e30bcc4d7221bd2988c2f235b 100644 | 
| --- a/main.cc | 
| +++ b/main.cc | 
| @@ -4,6 +4,9 @@ | 
|  | 
| // A simple daemon to detect, mount, and eject removable storage devices. | 
|  | 
| +#include "cros-disks-server-impl.h" | 
| +#include "disk-manager.h" | 
| +#include <base/basictypes.h> | 
| #include <base/file_util.h> | 
| #include <base/logging.h> | 
| #include <base/string_util.h> | 
| @@ -12,23 +15,86 @@ | 
| #include <gflags/gflags.h> | 
| #include <glib-object.h> | 
| #include <glib.h> | 
| +#include <libudev.h> | 
| #include <metrics/metrics_library.h> | 
|  | 
| + | 
| +using cros_disks::CrosDisksServer; | 
| +using cros_disks::DiskManager; | 
| + | 
| +DEFINE_bool(foreground, false, | 
| +            "Don't daemon()ize; run in foreground."); | 
| + | 
| +// TODO(rtc): gflags string defines require the use of | 
| +// -fno-strict-aliasing for some reason. Verify that disabling this check | 
| +// is sane. | 
| +DEFINE_string(log_dir, "/var/log/cros-disks", "log directory"); | 
| + | 
| +void SetupLogging() { | 
| +  logging::InitLogging(FLAGS_log_dir.c_str(), | 
| +                       logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG, | 
| +                       logging::DONT_LOCK_LOG_FILE, | 
| +                       logging::APPEND_TO_OLD_LOG_FILE); | 
| +} | 
| + | 
| +// This callback will be invoked once udev has data about | 
| +// new, changed, or removed devices. | 
| +gboolean UdevCallback(GIOChannel* source, | 
| +                      GIOCondition condition, | 
| +                      gpointer data) { | 
| +  DiskManager* mgr = static_cast<DiskManager*>(data); | 
| +  mgr->ProcessUdevChanges(); | 
| +  return true; | 
| +} | 
| + | 
| int main(int argc, char** argv) { | 
| ::g_type_init(); | 
| g_thread_init(NULL); | 
| google::ParseCommandLineFlags(&argc, &argv, true); | 
|  | 
| +  if(!FLAGS_foreground) { | 
| +    PLOG_IF(FATAL, daemon(0, 0) == 1) << "daemon() failed"; | 
| +    // SetupLogging(); | 
| +  } | 
| + | 
| LOG(INFO) << "Creating a GMainLoop"; | 
| GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); | 
| +  CHECK(loop) << "Failed to create a GMainLoop"; | 
| + | 
| +  LOG(INFO) << "Creating the dbus dispatcher"; | 
| +  DBus::Glib::BusDispatcher* dispatcher = | 
| +      new(std::nothrow) DBus::Glib::BusDispatcher(); | 
| +  CHECK(dispatcher) << "Failed to create a dbus-dispatcher"; | 
| +  DBus::default_dispatcher = dispatcher; | 
| +  dispatcher->attach(NULL); | 
| + | 
| +  LOG(INFO) << "creating server"; | 
| +  DBus::Connection server_conn = DBus::Connection::SystemBus(); | 
| +  server_conn.request_name("org.chromium.CrosDisks"); | 
| +  CrosDisksServer* server = new(std::nothrow) CrosDisksServer(server_conn); | 
| +  CHECK(server) << "Failed to create the cros-disks server"; | 
|  | 
| LOG(INFO) << "Initializing the metrics library"; | 
| MetricsLibrary metrics_lib; | 
| metrics_lib.Init(); | 
|  | 
| -  // Run the main loop until exit time: | 
| -  // TODO(rtc): daemonize this | 
| + | 
| +  DiskManager manager; | 
| +  manager.EnumerateDisks(); | 
| + | 
| +  // Setup a monitor | 
| +  g_io_add_watch_full(g_io_channel_unix_new(manager.udev_monitor_fd()), | 
| +                      G_PRIORITY_HIGH_IDLE, | 
| +                      GIOCondition(G_IO_IN | G_IO_PRI | G_IO_HUP | G_IO_NVAL), | 
| +                      UdevCallback, | 
| +                      &manager, | 
| +                      NULL); | 
| g_main_loop_run(loop); | 
|  | 
| +  LOG(INFO) << "Cleaining up and exiting"; | 
| +  g_main_loop_unref(loop); | 
| +  delete server; | 
| +  delete dispatcher; | 
| + | 
| return 0; | 
| } | 
|  |