| Index: src/platform/update_engine/omaha_request_prep_action.cc | 
| diff --git a/src/platform/update_engine/omaha_request_prep_action.cc b/src/platform/update_engine/omaha_request_prep_action.cc | 
| index 21d579954d55c78acf263d886793e1c20920392d..8c015d84ef6d9246addd37f5e392698dba68274b 100644 | 
| --- a/src/platform/update_engine/omaha_request_prep_action.cc | 
| +++ b/src/platform/update_engine/omaha_request_prep_action.cc | 
| @@ -4,7 +4,9 @@ | 
|  | 
| #include "update_engine/omaha_request_prep_action.h" | 
| #include <sys/utsname.h> | 
| +#include <errno.h> | 
| #include <string> | 
| +#include "base/string_util.h" | 
| #include "update_engine/utils.h" | 
|  | 
| using std::string; | 
| @@ -12,11 +14,19 @@ using std::string; | 
| // This gathers local system information and prepares info used by the | 
| // update check action. | 
|  | 
| +namespace { | 
| +const string OmahaIdPath() { | 
| +  return chromeos_update_engine::utils::kStatefulPartition + "/etc/omaha_id"; | 
| +} | 
| +}  // namespace {} | 
| + | 
| namespace chromeos_update_engine { | 
|  | 
| void OmahaRequestPrepAction::PerformAction() { | 
| // TODO(adlr): honor force_full_update_ | 
| -  const string machine_id(GetMachineId()); | 
| +  ScopedActionCompleter completer(processor_, this); | 
| +  string machine_id; | 
| +  TEST_AND_RETURN(GetMachineId(&machine_id)); | 
| const string version(GetLsbValue("GOOGLE_RELEASE")); | 
| const string sp(version + "_" + GetMachineType()); | 
| const string track(GetLsbValue("GOOGLE_TRACK")); | 
| @@ -33,28 +43,49 @@ void OmahaRequestPrepAction::PerformAction() { | 
|  | 
| CHECK(HasOutputPipe()); | 
| SetOutputObject(out); | 
| -  processor_->ActionComplete(this, true); | 
| +  completer.set_success(true); | 
| +} | 
| + | 
| +namespace { | 
| +const size_t kGuidDataByteLength = 128 / 8; | 
| +const string::size_type kGuidStringLength = 38; | 
| +// Formats 16 bytes (128 bits) of data as a GUID: | 
| +// "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" where X is a hex digit | 
| +string GuidFromData(const unsigned char data[kGuidDataByteLength]) { | 
| +  return StringPrintf( | 
| +      "{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}", | 
| +      data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], | 
| +      data[8], data[9], data[10], data[11], data[12], data[13], data[14], | 
| +      data[15]); | 
| +} | 
| } | 
|  | 
| -std::string OmahaRequestPrepAction::GetMachineId() const { | 
| -  FILE* fp = popen("/sbin/ifconfig", "r"); | 
| -  if (!fp) | 
| -    return ""; | 
| -  string data; | 
| -  for (;;) { | 
| -    char buffer[1000]; | 
| -    size_t r = fread(buffer, 1, sizeof(buffer), fp); | 
| -    if (r <= 0) | 
| -      break; | 
| -    data.insert(data.end(), buffer, buffer + r); | 
| +// Returns true on success. | 
| +bool OmahaRequestPrepAction::GetMachineId(std::string* out_id) const { | 
| +  // See if we have an existing Machine ID | 
| +  const string omaha_id_path = root_ + OmahaIdPath(); | 
| + | 
| +  if (utils::ReadFileToString(omaha_id_path, out_id) && | 
| +      out_id->size() == kGuidStringLength) { | 
| +    return true; | 
| +  } | 
| + | 
| +  // Create a new ID | 
| +  int rand_fd = open("/dev/urandom", O_RDONLY, 0); | 
| +  TEST_AND_RETURN_FALSE_ERRNO(rand_fd >= 0); | 
| +  ScopedFdCloser rand_fd_closer(&rand_fd); | 
| +  unsigned char buf[kGuidDataByteLength]; | 
| +  size_t bytes_read = 0; | 
| +  while (bytes_read < sizeof(buf)) { | 
| +    ssize_t rc = read(rand_fd, buf + bytes_read, sizeof(buf) - bytes_read); | 
| +    TEST_AND_RETURN_FALSE_ERRNO(rc > 0); | 
| +    bytes_read += rc; | 
| } | 
| -  fclose(fp); | 
| -  // scan data for MAC address | 
| -  string::size_type pos = data.find(" HWaddr "); | 
| -  if (pos == string::npos) | 
| -    return ""; | 
| -  // 3 * 6 - 1 is the number of bytes of the hwaddr. | 
| -  return data.substr(pos + strlen(" HWaddr "), 3 * 6 - 1); | 
| +  string guid = GuidFromData(buf); | 
| +  TEST_AND_RETURN_FALSE( | 
| +      utils::WriteFile(omaha_id_path.c_str(), guid.data(), guid.size())); | 
| +  *out_id = guid; | 
| +  return true; | 
| } | 
|  | 
| std::string OmahaRequestPrepAction::GetLsbValue(const std::string& key) const { | 
|  |