| 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
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..21d579954d55c78acf263d886793e1c20920392d
 | 
| --- /dev/null
 | 
| +++ b/src/platform/update_engine/omaha_request_prep_action.cc
 | 
| @@ -0,0 +1,93 @@
 | 
| +// Copyright (c) 2009 The Chromium 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 "update_engine/omaha_request_prep_action.h"
 | 
| +#include <sys/utsname.h>
 | 
| +#include <string>
 | 
| +#include "update_engine/utils.h"
 | 
| +
 | 
| +using std::string;
 | 
| +
 | 
| +// This gathers local system information and prepares info used by the
 | 
| +// update check action.
 | 
| +
 | 
| +namespace chromeos_update_engine {
 | 
| +
 | 
| +void OmahaRequestPrepAction::PerformAction() {
 | 
| +  // TODO(adlr): honor force_full_update_
 | 
| +  const string machine_id(GetMachineId());
 | 
| +  const string version(GetLsbValue("GOOGLE_RELEASE"));
 | 
| +  const string sp(version + "_" + GetMachineType());
 | 
| +  const string track(GetLsbValue("GOOGLE_TRACK"));
 | 
| +
 | 
| +  UpdateCheckParams out(machine_id,  // machine_id
 | 
| +                        machine_id,  // user_id (use machine_id)
 | 
| +                        UpdateCheckParams::kOsPlatform,
 | 
| +                        UpdateCheckParams::kOsVersion,
 | 
| +                        sp,  // e.g. 0.2.3.3_i686
 | 
| +                        UpdateCheckParams::kAppId,
 | 
| +                        version,  // app version (from lsb-release)
 | 
| +                        "en-US",  //lang
 | 
| +                        track);  // track
 | 
| +
 | 
| +  CHECK(HasOutputPipe());
 | 
| +  SetOutputObject(out);
 | 
| +  processor_->ActionComplete(this, true);
 | 
| +}
 | 
| +
 | 
| +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);
 | 
| +  }
 | 
| +  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);
 | 
| +}
 | 
| +
 | 
| +std::string OmahaRequestPrepAction::GetLsbValue(const std::string& key) const {
 | 
| +  string files[] = {utils::kStatefulPartition + "/etc/lsb-release",
 | 
| +                    "/etc/lsb-release"};
 | 
| +  for (unsigned int i = 0; i < arraysize(files); i++) {
 | 
| +    string file_data;
 | 
| +    if (!utils::ReadFileToString(root_ + files[i], &file_data))
 | 
| +      continue;
 | 
| +    string::size_type pos = 0;
 | 
| +    if (!utils::StringHasPrefix(file_data, key + "=")) {
 | 
| +      pos = file_data.find(string("\n") + key + "=");
 | 
| +      if (pos != string::npos)
 | 
| +        pos++;  // advance past \n
 | 
| +    }
 | 
| +    if (pos == string::npos)
 | 
| +      continue;
 | 
| +    pos += key.size() + 1;  // advance past the key and the '='
 | 
| +    string::size_type endpos = file_data.find('\n', pos);
 | 
| +    string::size_type length =
 | 
| +        (endpos == string::npos ? string::npos : endpos - pos);
 | 
| +    return file_data.substr(pos, length);
 | 
| +  }
 | 
| +  // not found
 | 
| +  return "";
 | 
| +}
 | 
| +
 | 
| +std::string OmahaRequestPrepAction::GetMachineType() const {
 | 
| +  struct utsname buf;
 | 
| +  string ret;
 | 
| +  if (uname(&buf) == 0)
 | 
| +    ret = buf.machine;
 | 
| +  return ret;
 | 
| +}
 | 
| +
 | 
| +}  // namespace chromeos_update_engine
 | 
| 
 |