[debugd] add GetModemStatus skeleton.

Just a skeleton of the infrastructure that will be required to do this properly;
the meat of GetModemStatus isn't implemented yet. I still need to update the
design doc too.

BUG=chromium-os:23839
TEST=platform_DebugDaemonGetModemStatus

Change-Id: I76b09b7b762b3d36537ab3485b534b7abb727216
Signed-off-by: Elly Jones <ellyjones@chromium.org>
diff --git a/debugd/src/Makefile b/debugd/src/Makefile
index c1fcda7..9bf4005 100644
--- a/debugd/src/Makefile
+++ b/debugd/src/Makefile
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# 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.
 
@@ -13,13 +13,10 @@
 
 all: CXX_BINARY(debugd)
 
-install:
-	cp $(OUT)debugd ..
-
 tests: override NEEDS_MOUNTS = 1
 tests: TEST(CXX_BINARY(testrunner))
 
-TOOLS:= $(patsubst %,%_tool.o,ping route subprocess tracepath)
+TOOLS := $(patsubst %,%_tool.o,modem_status ping route subprocess tracepath)
 OBJS := debug_daemon.o process_with_id.o process_with_output.o $(TOOLS)
 TESTOBJS := process_with_id_test.o
 
@@ -29,9 +26,17 @@
 	$(call cxx_binary,-lgtest -lminijail -lchromeos -lbase)
 clean: CXX_BINARY(debugd)
 
-main.o: $(OUT)bindings/org.chromium.debugd.h
-debug_daemon.o: $(OUT)bindings/org.chromium.debugd.h
+main.o.depends: $(OUT)adaptors/org.chromium.debugd.h
+debug_daemon.o.depends: $(OUT)adaptors/org.chromium.debugd.h
 
-$(OUT)bindings/%.h: share/%.xml
+vpath org.chromium.debugd.xml share
+vpath org.%.xml $(SYSROOT)/usr/share/dbus-1/interfaces
+
+$(OUT)adaptors/%.h: %.xml
 	mkdir -p $(dir $@)
 	$(DBUSXX_XML2CPP) $^ --adaptor=$@
+
+$(OUT)proxies/%.h: %.xml
+	mkdir -p $(dir $@)
+	$(DBUSXX_XML2CPP) $^ --proxy=$@
+
diff --git a/debugd/src/common.mk b/debugd/src/common.mk
index d7dce4f..7f63f84 100644
--- a/debugd/src/common.mk
+++ b/debugd/src/common.mk
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# 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.
 #
@@ -39,6 +39,10 @@
 #   - CXX_BINARY, CC_BINARY, CC_STATIC_BINARY, CXX_STATIC_BINARY
 #   - CXX_LIBRARY, CC_LIBRARY, CC_STATIC_LIBRARY, CXX_STATIC_LIBRARY
 #   - E.g., CXX_BINARY(mahbinary): foo.o
+#   - object.depends targets may be used when a prerequisite is required for an
+#     object file. Because object files result in multiple build artifacts to
+#     handle PIC and PIE weirdness. E.g.
+#       foo.o.depends: generated/dbus.h
 #   - TEST(binary) or TEST(CXX_BINARY(binary)) may be used as a prerequisite
 #     for the tests target to trigger an automated test run.
 #   - CLEAN(file_or_dir) dependency can be added to 'clean'.
@@ -448,6 +452,7 @@
 CC_STATIC_LIBARY(%):
 	$(error Typo alert! LIBARY != LIBRARY)
 
+
 TEST(%): % qemu_chroot_install
 	$(call TEST_implementation)
 .PHONY: TEST
@@ -492,17 +497,23 @@
 # $(1) list of .o files
 # $(2) source type (CC or CXX)
 # $(3) source suffix (cc or c)
+# $(4) source dir: _only_ if $(SRC). Leave blank for obj tree.
 define add_object_rules
-$(patsubst %.o,%.pie.o,$(1)): %.pie.o: $(SRC)/%.$(3)
+$(patsubst %.o,%.pie.o,$(1)): %.pie.o: $(4)%.$(3) %.o.depends
 	$$(QUIET)mkdir -p "$$(dir $$@)"
 	$$(call OBJECT_PATTERN_implementation,$(2),\
           $$(basename $$@),$$(CXXFLAGS) $$(OBJ_PIE_FLAG))
 
-$(patsubst %.o,%.pic.o,$(1)): %.pic.o: $(SRC)/%.$(3)
+$(patsubst %.o,%.pic.o,$(1)): %.pic.o: $(4)%.$(3) %.o.depends
 	$$(QUIET)mkdir -p "$$(dir $$@)"
 	$$(call OBJECT_PATTERN_implementation,$(2),\
           $$(basename $$@),$$(CXXFLAGS) -fPIC)
 
+# Placeholder for depends
+$(patsubst %.o,%.o.depends,$(1)):
+	$$(QUIET)mkdir -p "$$(dir $$@)"
+	$$(QUIET)touch "$$@"
+
 $(1): %.o: %.pic.o %.pie.o
 	$$(QUIET)mkdir -p "$$(dir $$@)"
 	$$(QUIET)touch "$$@"
@@ -520,8 +531,8 @@
 endef
 
 # Now actually register handlers for C(XX)_OBJECTS.
-$(eval $(call add_object_rules,$(C_OBJECTS),CC,c))
-$(eval $(call add_object_rules,$(CXX_OBJECTS),CXX,cc))
+$(eval $(call add_object_rules,$(C_OBJECTS),CC,c,$(SRC)/))
+$(eval $(call add_object_rules,$(CXX_OBJECTS),CXX,cc,$(SRC)/))
 
 # Disable default pattern rules to help avoid leakage.
 # These may already be handled by '-r', but let's keep it to be safe.
@@ -719,7 +730,7 @@
 
 clean: qemu_clean
 clean: CLEAN($(OUT)*.d) CLEAN($(OUT)*.o) CLEAN($(OUT)*.debug)
-clean: CLEAN($(OUT)*.test)
+clean: CLEAN($(OUT)*.test) CLEAN($(OUT)*.depends)
 
 clean:
 	$(QUIET)# Always delete the containing directory last.
@@ -762,6 +773,7 @@
 # Add the defaults from this dir to rm_clean
 clean: CLEAN($(OUT)$(MODULE)/*.d) CLEAN($(OUT)$(MODULE)/*.o)
 clean: CLEAN($(OUT)$(MODULE)/*.debug) CLEAN($(OUT)$(MODULE)/*.test)
+clean: CLEAN($(OUT)$(MODULE)/*.depends)
 
 $(info + submodule: $(MODULE_NAME))
 # We must eval otherwise they may be dropped.
@@ -775,8 +787,8 @@
 # Note, $(MODULE) is implicit in the path to the %.c.
 # See $(C_OBJECTS) for more details.
 # Register rules for the module objects.
-$(eval $(call add_object_rules,$(MODULE_C_OBJECTS),CC,c))
-$(eval $(call add_object_rules,$(MODULE_CXX_OBJECTS),CXX,cc))
+$(eval $(call add_object_rules,$(MODULE_C_OBJECTS),CC,c,$(SRC)/))
+$(eval $(call add_object_rules,$(MODULE_CXX_OBJECTS),CXX,cc,$(SRC)/))
 
 # Continue recursive inclusion of module.mk files
 SUBMODULE_DIRS = $(wildcard $(SRC)/$(MODULE)/*/module.mk)
diff --git a/debugd/src/debug_daemon.cc b/debugd/src/debug_daemon.cc
index 60090e7..bd599b3 100644
--- a/debugd/src/debug_daemon.cc
+++ b/debugd/src/debug_daemon.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
@@ -21,6 +21,7 @@
   ping_tool_ = new PingTool();
   tracepath_tool_ = new TracePathTool();
   route_tool_ = new RouteTool();
+  modem_status_tool_ = new ModemStatusTool();
   try {
     // TODO(ellyjones): Remove this when crosbug.com/23964 is fixed
     dbus_->request_name(kDebugDaemonService);
@@ -73,4 +74,8 @@
   return route_tool_->GetRoutes(options, error);
 }
 
+std::string DebugDaemon::GetModemStatus(DBus::Error& error) { // NOLINT dbuscxx
+  return modem_status_tool_->GetModemStatus(error);
+}
+
 };  // namespace debugd
diff --git a/debugd/src/debug_daemon.h b/debugd/src/debug_daemon.h
index e8a7f30..f849baf 100644
--- a/debugd/src/debug_daemon.h
+++ b/debugd/src/debug_daemon.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
@@ -10,7 +10,8 @@
 
 #include <dbus-c++/dbus.h>
 
-#include "bindings/org.chromium.debugd.h"
+#include "adaptors/org.chromium.debugd.h"
+#include "modem_status_tool.h"
 #include "ping_tool.h"
 #include "route_tool.h"
 #include "tracepath_tool.h"
@@ -47,6 +48,7 @@
                                                             DBus::Variant>&
                                                  options,
                                              DBus::Error& error);
+  virtual std::string GetModemStatus(DBus::Error& error); // NOLINT dbuscxx
 
  private:
   DBus::Connection* dbus_;
@@ -54,6 +56,7 @@
   PingTool* ping_tool_;
   RouteTool* route_tool_;
   TracePathTool *tracepath_tool_;
+  ModemStatusTool* modem_status_tool_;
 };
 
 };  // namespace debugd
diff --git a/debugd/src/helpers/modem_status.cc b/debugd/src/helpers/modem_status.cc
new file mode 100644
index 0000000..48ae615
--- /dev/null
+++ b/debugd/src/helpers/modem_status.cc
@@ -0,0 +1,181 @@
+// 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 <dbus-c++/dbus.h>
+#include <stdio.h>
+
+#include <base/json/json_writer.h>
+#include <base/string_util.h>
+#include <base/values.h>
+#include <chromeos/utility.h>
+
+#include "proxies/org.freedesktop.DBus.Properties.h"
+#include "proxies/org.freedesktop.ModemManager.h"
+#include "proxies/org.freedesktop.ModemManager.Modem.h"
+#include "proxies/org.freedesktop.ModemManager.Modem.Simple.h"
+
+// These are lifted from modemmanager's XML files, since dbus-c++ currently
+// doesn't emit constants for enums defined in headers.
+// TODO(ellyjones): fix that
+const uint32_t kModemTypeGsm = 1;
+const uint32_t kModemTypeCdma = 2;
+
+const char* kMMPath = "/org/freedesktop/ModemManager";
+const char* kMMService = "org.freedesktop.ModemManager";
+
+const char* kCromoPath = "/org/chromium/ModemManager";
+const char* kCromoService = "org.chromium.ModemManager";
+
+const char* kModemInterface = "org.freedesktop.ModemManager.Modem";
+const char* kModemSimpleInterface = "org.freedesktop.ModemManager.Modem.Simple";
+const char* kModemCdmaInterface = "org.freedesktop.ModemManager.Modem.Cdma";
+const char* kModemGsmInterface = "org.freedesktop.ModemManager.Modem.Gsm";
+const char* kModemGsmCardInterface =
+    "org.freedesktop.ModemManager.Modem.Gsm.Card";
+const char* kModemGsmNetworkInterface =
+    "org.freedesktop.ModemManager.Modem.Gsm.Network";
+const char* kModemGobiInterface =
+    "org.chromium.ModemManager.Modem.Gobi";
+
+class DBusPropertiesProxy
+    : public org::freedesktop::DBus::Properties_proxy,
+      public DBus::ObjectProxy {
+ public:
+  DBusPropertiesProxy(DBus::Connection& connection, const char* path, // NOLINT
+                      const char* service) :
+      DBus::ObjectProxy(connection, path, service) { }
+  virtual ~DBusPropertiesProxy() { }
+  virtual void PropertiesChanged(const std::string&,
+                                 const std::map<std::string, DBus::Variant>&,
+                                 const std::vector<std::string>&) { }
+};
+
+class ModemManagerProxy
+    : public org::freedesktop::ModemManager_proxy,
+      public DBus::ObjectProxy {
+ public:
+  ModemManagerProxy(DBus::Connection& connection, const char* path, // NOLINT
+                    const char* service) :
+      DBus::ObjectProxy(connection, path, service) { }
+  virtual ~ModemManagerProxy() { }
+  virtual void DeviceAdded(const DBus::Path&) { }
+  virtual void DeviceRemoved(const DBus::Path&) { }
+};
+
+class ModemSimpleProxy
+    : public org::freedesktop::ModemManager::Modem::Simple_proxy,
+      public DBus::ObjectProxy {
+ public:
+  ModemSimpleProxy(DBus::Connection& connection, const char* path, // NOLINT
+                   const char* service) :
+      DBus::ObjectProxy(connection, path, service) { }
+  virtual ~ModemSimpleProxy() { }
+};
+
+class ModemProxy
+    : public org::freedesktop::ModemManager::Modem_proxy,
+      public DBus::ObjectProxy {
+ public:
+  ModemProxy(DBus::Connection& connection, const char* path, // NOLINT
+             const char* service) :
+      DBus::ObjectProxy(connection, path, service) { }
+  virtual ~ModemProxy() { }
+  virtual void StateChanged(const uint32_t&, const uint32_t&,
+      const uint32_t&) { }
+};
+
+struct Modem {
+  const char* service_;
+  DBus::Path path_;
+
+  Modem(const char* service, DBus::Path path)
+      : service_(service), path_(path) { }
+
+  Value* GetStatus(DBus::Connection& conn); // NOLINT
+};
+
+Value* FetchOneInterface(DBusPropertiesProxy& properties, // NOLINT
+                         const char* interface,
+                         DictionaryValue* result) {
+  std::map<std::string, DBus::Variant> propsmap =
+      properties.GetAll(interface);
+  Value* propsdict = NULL;
+  if (!chromeos::DBusPropertyMapToValue(propsmap, &propsdict))
+    return NULL;
+  std::string keypath = interface;
+  ReplaceSubstringsAfterOffset(&keypath, 0, ".", "/");
+  result->Set(keypath, propsdict);
+  return propsdict;
+}
+
+Value* Modem::GetStatus(DBus::Connection& conn) { // NOLINT
+  DictionaryValue* result = new DictionaryValue();
+  result->SetString("service", service_);
+  result->SetString("path", path_);
+
+  ModemSimpleProxy simple = ModemSimpleProxy(conn, path_.c_str(), service_);
+  Value* status = NULL;
+  std::map<std::string, DBus::Variant> statusmap = simple.GetStatus();
+  if (chromeos::DBusPropertyMapToValue(statusmap, &status))
+    result->Set("status", status);
+
+  ModemProxy modem = ModemProxy(conn, path_.c_str(), service_);
+  DBus::Struct<std::string, std::string, std::string> infomap = modem.GetInfo();
+  DictionaryValue* infodict = new DictionaryValue();
+  infodict->SetString("manufacturer", infomap._1);
+  infodict->SetString("modem", infomap._2);
+  infodict->SetString("version", infomap._3);
+  result->Set("info", infodict);
+
+  DictionaryValue* props = new DictionaryValue();
+  DBusPropertiesProxy properties = DBusPropertiesProxy(conn, path_.c_str(),
+                                                       service_);
+  FetchOneInterface(properties, kModemInterface, props);
+  FetchOneInterface(properties, kModemSimpleInterface, props);
+  uint32_t type = modem.Type();
+  if (type == kModemTypeGsm) {
+    FetchOneInterface(properties, kModemGsmInterface, props);
+    FetchOneInterface(properties, kModemGsmCardInterface, props);
+    FetchOneInterface(properties, kModemGsmNetworkInterface, props);
+  } else {
+    FetchOneInterface(properties, kModemCdmaInterface, props);
+  }
+  result->Set("properties", props);
+
+  return result;
+}
+
+int main() {
+  DBus::BusDispatcher dispatcher;
+  DBus::default_dispatcher = &dispatcher;
+  DBus::Connection conn = DBus::Connection::SystemBus();
+  ModemManagerProxy modemmanager(conn, kMMPath, kMMService);
+  ModemManagerProxy cromo(conn, kCromoPath, kCromoService);
+  std::vector<Modem> modems;
+
+  // These two try-catch blocks are to account for one of modemmanager or cromo
+  // not being present. We don't want to crash if one of them isn't running, so
+  // we swallow the DBus exception we get from the failed attempt to enumerate
+  // devices.
+  try {
+    std::vector<DBus::Path> mm_modems = modemmanager.EnumerateDevices();
+    for (size_t i = 0; i < mm_modems.size(); ++i)
+      modems.push_back(Modem(kMMService, mm_modems[i]));
+    // cpplint thinks this is a function call
+  } catch(DBus::Error e) { }
+  try {
+    std::vector<DBus::Path> cromo_modems = cromo.EnumerateDevices();
+    for (size_t i = 0; i < cromo_modems.size(); ++i)
+      modems.push_back(Modem(kCromoService, cromo_modems[i]));
+    // cpplint thinks this is a function call
+  } catch(DBus::Error e) { }
+
+  ListValue result;
+  for (size_t i = 0; i < modems.size(); ++i)
+    result.Append(modems[i].GetStatus(conn));
+  std::string json;
+  base::JSONWriter::Write(&result, true, &json);
+  printf("%s\n", json.c_str());
+  return 0;
+}
diff --git a/debugd/src/helpers/module.mk b/debugd/src/helpers/module.mk
new file mode 100644
index 0000000..d664045
--- /dev/null
+++ b/debugd/src/helpers/module.mk
@@ -0,0 +1,26 @@
+# 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 $(SRC)/common.mk
+
+define define_helper
+all: CXX_BINARY(helpers/$(1))
+$(info define_helper: $(1))
+CXX_BINARY(helpers/$(1)): helpers/$(1).o
+	$$(call cxx_binary,-lbase -lchromeos)
+endef
+
+# Construct build rules for all of the helpers. For each helper h, define a rule
+# for CXX_BINARY(helpers/h), and make CXX_BINARY(helpers/h) a dependency of
+# 'all'.
+$(eval \
+    $(foreach helper, \
+              $(wildcard $(SRC)/helpers/*.cc), \
+              $(call define_helper,$(notdir $(basename $(helper))))))
+
+MM_PROXIES := $(patsubst %,$(OUT)proxies/org.freedesktop.ModemManager%,.h \
+                .Modem.h .Modem.Simple.h)
+
+helpers/modem_status.o.depends: $(MM_PROXIES) \
+                                $(OUT)proxies/org.freedesktop.DBus.Properties.h
diff --git a/debugd/src/main.cc b/debugd/src/main.cc
index 092b149..5ae81af 100644
--- a/debugd/src/main.cc
+++ b/debugd/src/main.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/modem_status_tool.cc b/debugd/src/modem_status_tool.cc
new file mode 100644
index 0000000..092bec4
--- /dev/null
+++ b/debugd/src/modem_status_tool.cc
@@ -0,0 +1,31 @@
+// 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 "modem_status_tool.h"
+
+#include <base/logging.h>
+
+#include "process_with_output.h"
+
+namespace debugd {
+
+ModemStatusTool::ModemStatusTool() { }
+ModemStatusTool::~ModemStatusTool() { }
+
+std::string ModemStatusTool::GetModemStatus(DBus::Error& error) { // NOLINT
+  char *envvar = getenv("DEBUGD_HELPERS");
+  std::string path = StringPrintf("%s/modem_status", envvar ? envvar
+                                  : "/usr/libexec/debugd/helpers");
+  if (path.length() > PATH_MAX)
+    return "";
+  ProcessWithOutput p;
+  p.Init();
+  p.AddArg(path);
+  p.Run();
+  std::string out;
+  p.GetOutput(&out);
+  return out;
+}
+
+};  // namespace debugd
diff --git a/debugd/src/modem_status_tool.h b/debugd/src/modem_status_tool.h
new file mode 100644
index 0000000..6a6003c
--- /dev/null
+++ b/debugd/src/modem_status_tool.h
@@ -0,0 +1,27 @@
+// 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.
+
+#ifndef MODEM_STATUS_TOOL_H
+#define MODEM_STATUS_TOOL_H
+
+#include <string>
+
+#include <base/basictypes.h>
+#include <dbus-c++/dbus.h>
+
+namespace debugd {
+
+class ModemStatusTool {
+ public:
+  ModemStatusTool();
+  ~ModemStatusTool();
+
+  std::string GetModemStatus(DBus::Error& error); // NOLINT
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ModemStatusTool);
+};
+
+};  // namespace debugd
+
+#endif  // MODEM_STATUS_TOOL_H
diff --git a/debugd/src/ping_tool.cc b/debugd/src/ping_tool.cc
index bb3de73..9a4ddbe 100644
--- a/debugd/src/ping_tool.cc
+++ b/debugd/src/ping_tool.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/ping_tool.h b/debugd/src/ping_tool.h
index 2c36ab3..7301f0f 100644
--- a/debugd/src/ping_tool.h
+++ b/debugd/src/ping_tool.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/process_with_id.cc b/debugd/src/process_with_id.cc
index 88caf3d..91f3475 100644
--- a/debugd/src/process_with_id.cc
+++ b/debugd/src/process_with_id.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/process_with_id.h b/debugd/src/process_with_id.h
index 156d123..b6f6a2e 100644
--- a/debugd/src/process_with_id.h
+++ b/debugd/src/process_with_id.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/process_with_id_test.cc b/debugd/src/process_with_id_test.cc
index f1ddbfb..386c404 100644
--- a/debugd/src/process_with_id_test.cc
+++ b/debugd/src/process_with_id_test.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/process_with_output.cc b/debugd/src/process_with_output.cc
index bdf1124..b9f8bc0 100644
--- a/debugd/src/process_with_output.cc
+++ b/debugd/src/process_with_output.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/process_with_output.h b/debugd/src/process_with_output.h
index dd78867..46e98a5 100644
--- a/debugd/src/process_with_output.h
+++ b/debugd/src/process_with_output.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/route_tool.cc b/debugd/src/route_tool.cc
index 46b733d..47ebe83 100644
--- a/debugd/src/route_tool.cc
+++ b/debugd/src/route_tool.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/route_tool.h b/debugd/src/route_tool.h
index 5deb1f8..9a6d76e 100644
--- a/debugd/src/route_tool.h
+++ b/debugd/src/route_tool.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/subprocess_tool.cc b/debugd/src/subprocess_tool.cc
index 6bf650e..e49bebe 100644
--- a/debugd/src/subprocess_tool.cc
+++ b/debugd/src/subprocess_tool.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/subprocess_tool.h b/debugd/src/subprocess_tool.h
index baa0708..5ad7353 100644
--- a/debugd/src/subprocess_tool.h
+++ b/debugd/src/subprocess_tool.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/testrunner.cc b/debugd/src/testrunner.cc
index b282906..e008978 100644
--- a/debugd/src/testrunner.cc
+++ b/debugd/src/testrunner.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/tracepath_tool.cc b/debugd/src/tracepath_tool.cc
index 532a9a1..66d0bc8 100644
--- a/debugd/src/tracepath_tool.cc
+++ b/debugd/src/tracepath_tool.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.
 
diff --git a/debugd/src/tracepath_tool.h b/debugd/src/tracepath_tool.h
index 53ba61f..3b2611e 100644
--- a/debugd/src/tracepath_tool.h
+++ b/debugd/src/tracepath_tool.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// 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.