Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: src/platform/update_engine/omaha_request_prep_action.cc

Issue 467051: AU: Use Omaha ID rather than MAC address in delta updater (Closed)
Patch Set: fixes for review Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698